基于爬虫技术的海量电影数据分析
介绍
一个基于爬虫技术的海量电影数据分析系统
系统架构
本系统主要分为四个部分,分别为后端爬虫抓取、数据处理分析可视化、GUI界面展示、启动运行,分别对应getData.py、pyec.py、GUI.py、main.py四个文件。
并且包含data文件夹用于存储系统所需或产生的数据文件。
所需依赖包
numpy、pandas、requests、json、sklearn、webbrowser、tkinter、collections、pyecharts
使用说明
在pycharm中打开项目,直接运行main.py文件即可。
代码详解
1、getData.py
该.py文件主要功能是抓取和读取电影数据,共包含8个函数,代码详解如下:
(1)、recently()
这一函数主要是抓取最近上映票房排名前十名的电影信息。
url = "https://ys.endata.cn/enlib-api/api/movie/getMovie_BoxOffice_Day_Chart.do"
header = {
"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36',
"Cookie": 'JSESSIONID=b2685bfa-aa4f-4359-ae96-57befaf8d1ec; route=4e39643a15b7003e568cadd862137cf3; Hm_lvt_82932fc4fc199c08b9a83c4c9d02af11=1649834963,1649852471,1649859039,1649900037; Hm_lpvt_82932fc4fc199c08b9a83c4c9d02af11=1649917933'
}
post_BoxOffice_Day_data = {
'r': 0.7572955414768414,
'datetype': 'Day',
'date': datetime.now().strftime('%Y-%m-%d'),
'sdate': datetime.now().strftime('%Y-%m-%d'),
'edate': datetime.now().strftime('%Y-%m-%d'),
'bserviceprice': 1
}
以上代码块是运行爬虫前的准备工作,包含抓取的网址url、爬虫所需的请求头、请求时需要附带的数据。
res = requests.post(url, headers=header, data=post_BoxOffice_Day_data).text
json_data = json.loads(res)
data0 = json_data['data']['table0']
data1 = json_data['data']['table1']
以上代码块是运行爬虫并将其解析为json形式,方便后面对数据进行取出。
movie_rank = []
movie_details_MovieName = []
movie_details_BoxOffice = []
movie_details_ShowCount = []
movie_details_AudienceCount = []
movie_details_Attendance = []
movie_percent_BoxOfficePercent = []
movie_percent_ShowCountPercent = []
movie_percent_AudienceCountPercent = []
以上代码是部分定义的所需的数据字段。
for i in range(10):
movie_rank.append(data0[i]['Irank'])
movie_details_MovieName.append(data0[i]['MovieName'])
movie_details_BoxOffice.append(data0[i]['BoxOffice'])
movie_details_ShowCount.append(data0[i]['ShowCount'])
movie_details_AudienceCount.append(data0[i]['AudienceCount'])
movie_details_Attendance.append(data0[i]['Attendance'])
以上是从json数据中取数据的过程。
top10_data = pd.DataFrame({
"影片排名": movie_rank,
"影片名称": movie_details_MovieName,
"影片票房": movie_details_BoxOffice,
"影片场次": movie_details_ShowCount,
"影片人次": movie_details_AudienceCount,
"上座率": movie_details_Attendance,
"影片票房占比": movie_percent_BoxOfficePercent,
"影片场次占比": movie_percent_ShowCountPercent,
"影片人次占比": movie_percent_AudienceCountPercent,
"一线城市票房": movie_city1_BoxOffice,
"一线城市场次": movie_city1_ShowCount,
"一线城市人次": movie_city1_AudienceCount,
"二线城市票房": movie_city2_BoxOffice,
"二线城市场次": movie_city2_ShowCount,
"二线城市人次": movie_city2_AudienceCount,
"三线城市票房": movie_city3_BoxOffice,
"三线城市场次": movie_city3_ShowCount,
"三线城市人次": movie_city3_AudienceCount,
"四线城市票房": movie_city4_BoxOffice,
"四线城市场次": movie_city4_ShowCount,
"四线城市人次": movie_city4_AudienceCount,
"其它票房": movie_others_BoxOffice,
"其它场次": movie_others_ShowCount,
"其它人次": movie_others_AudienceCount
})
print(top10_data)
top10_data.to_csv("data/top10_data.csv", encoding='gbk', index=False)
以上是定义数据表并将数据表填满,打印数据表,保存数据表的过程。
(2)、showing()
这一函数主要抓取最近正在上映的所有电影的基本信息。具体代码块功能参照recently函数。
(3)、history()
这一函数主要是读取历史电影数据并返回列表格式
def history():
data = pd.read_csv("data/moviesBoxOffice.csv", encoding='gbk')
data = np.array(data[:100]).tolist()
return data
以上为利用pandas库读取csv文件,numpy对DataFrame形式数据转换为list格式的过程。
(4)、predict_data()
这一函数主要是读取历史电影数据进行建模,建模完成后,读取需要预测的在映电影数据,对其进行票房预测并返回。
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
data = pd.read_csv("data/moviesBoxOffice.csv", encoding='gbk')
x = data[["总场次", "总人次(万)", "上映天数", "猫眼想看人数", "淘票票想看人数", "豆瓣想看人数"]]
y = data["总票房(万)"]
x = imp.fit_transform(np.array(x))
以上代码块主要是利用pandas读取历史电影数据,然后利用sklearn库中的SimpleImputer对数据中的空值进行填充。
reg = LinearRegression().fit(x, y)
predict_data = pd.read_csv("data/recentlyMovies.csv", encoding='gbk')
name = predict_data['影片名称']
current = predict_data['累计票房']
predict_data['当前场次'] = (predict_data['当前场次'] / predict_data["累计上映天数"]) * 50 + predict_data["累计上映天数"]
predict_data['当前人次'] = (predict_data['当前人次'] / predict_data["累计上映天数"]) * 50 + predict_data["累计上映天数"]
predict_data['累计上映天数'] = predict_data["累计上映天数"] + 50
predict_data = predict_data[["当前场次", "当前人次", "累计上映天数", "猫眼想看数", "淘票票想看数", "豆瓣想看数"]]
predict_data = imp.fit_transform(predict_data)
以上代码主要是对历史电影数据进行建模并读取在映电影数据,对在映电影数据进行特征选择和处理
result = reg.predict(predict_data)
for i in range(len(result)):
if result[i] < 0:
result[i] = (0 - result[i])
result[i] = round((result[i] + current[i