当前位置:   article > 正文

人工智能|网络爬虫——用Python爬取电影数据并可视化分析_电影数据爬虫

电影数据爬虫

一、获取数据

1.技术工具

IDE编辑器:vscode

发送请求:requests

解析工具:xpath

  1. def Get_Detail(Details_Url):
  2. Detail_Url = Base_Url + Details_Url
  3. One_Detail = requests.get(url=Detail_Url, headers=Headers)
  4. One_Detail_Html = One_Detail.content.decode('gbk')
  5. Detail_Html = etree.HTML(One_Detail_Html)
  6. Detail_Content = Detail_Html.xpath("//div[@id='Zoom']//text()")
  7. Video_Name_CN,Video_Name,Video_Address,Video_Type,Video_language,Video_Date,Video_Number,Video_Time,Video_Daoyan,Video_Yanyuan_list = None,None,None,None,None,None,None,None,None,None
  8. for index, info in enumerate(Detail_Content):
  9. if info.startswith('◎译  名'):
  10. Video_Name_CN = info.replace('◎译  名', '').strip()
  11. if info.startswith('◎片  名'):
  12. Video_Name = info.replace('◎片  名', '').strip()
  13. if info.startswith('◎产  地'):
  14. Video_Address = info.replace('◎产  地', '').strip()
  15. if info.startswith('◎类  别'):
  16. Video_Type = info.replace('◎类  别', '').strip()
  17. if info.startswith('◎语  言'):
  18. Video_language = info.replace('◎语  言', '').strip()
  19. if info.startswith('◎上映日期'):
  20. Video_Date = info.replace('◎上映日期', '').strip()
  21. if info.startswith('◎豆瓣评分'):
  22. Video_Number = info.replace('◎豆瓣评分', '').strip()
  23. if info.startswith('◎片  长'):
  24. Video_Time = info.replace('◎片  长', '').strip()
  25. if info.startswith('◎导  演'):
  26. Video_Daoyan = info.replace('◎导  演', '').strip()
  27. if info.startswith('◎主  演'):
  28. Video_Yanyuan_list = []
  29. Video_Yanyuan = info.replace('◎主  演', '').strip()
  30. Video_Yanyuan_list.append(Video_Yanyuan)
  31. for x in range(index + 1, len(Detail_Content)):
  32. actor = Detail_Content[x].strip()
  33. if actor.startswith("◎"):
  34. break
  35. Video_Yanyuan_list.append(actor)
  36. print(Video_Name_CN,Video_Date,Video_Time)
  37. f.flush()
  38. try:
  39. csvwriter.writerow((Video_Name_CN,Video_Name,Video_Address,Video_Type,Video_language,Video_Date,Video_Number,Video_Time,Video_Daoyan,Video_Yanyuan_list))
  40. except:
  41. pass

保存数据:csv

  1. if __name__ == '__main__':
  2. with open('movies.csv','a',encoding='utf-8',newline='')as f:
  3. csvwriter = csv.writer(f)
  4. csvwriter.writerow(('Video_Name_CN','Video_Name','Video_Address','Video_Type','Video_language','Video_Date','Video_Number','Video_Time','Video_Daoyan','Video_Yanyuan_list'))
  5. spider(117)

2.爬取目标

本次爬取的目标网站是阳光电影网https://www.ygdy8.net,用到技术为requests+xpath。主要获取的目标是2016年-2023年之间的电影数据。

3.字段信息

获取的字段信息有电影译名、片名、产地、类别、语言、上映时间、豆瓣评分、片长、导演、主演等,具体说明如下:

 二、数据预处理

技术工具:jupyter notebook

1.加载数据

首先使用pandas读取刚用爬虫获取的电影数据

2.异常值处理

这里处理的异常值包括缺失值和重复值

首先查看原数据各字段的缺失情况

从结果中可以发现缺失数据还蛮多的,这里就为了方便统一删除处理,同时也对重复数据进行删除

可以发现经过处理后的数据还剩1711条。 

3.字段处理

由于爬取的原始数据中各个字段信息都很乱,出现很多“/”“,”之类的,这里统一进行处理,主要使用到pandas中的apply()函数,同时由于我们分析的数2016-2023年的电影数据,除此之外的进行删除处理

  1. # 数据预处理
  2. data['Video_Name_CN'] = data['Video_Name_CN'].apply(lambda x:x.split('/')[0]) # 处理Video_Name_CN
  3. data['Video_Name'] = data['Video_Name'].apply(lambda x:x.split('/')[0]) # 处理Video_Name
  4. data['Video_Address'] = data['Video_Address'].apply(lambda x:x.split('/')[0]) # 处理Video_Address
  5. data['Video_Address'] = data['Video_Address'].apply(lambda x:x.split(',')[0].strip())
  6. data['Video_language'] = data['Video_language'].apply(lambda x:x.split('/')[0])
  7. data['Video_language'] = data['Video_language'].apply(lambda x:x.split(',')[0])
  8. data['Video_Date'] = data['Video_Date'].apply(lambda x:x.split('(')[0].strip())
  9. data['year'] = data['Video_Date'].apply(lambda x:x.split('-')[0])
  10. data['Video_Number'] = data['Video_Number'].apply(lambda x:x.split('/')[0].strip())
  11. data['Video_Number'] = pd.to_numeric(data['Video_Number'],errors='coerce')
  12. data['Video_Time'] = data['Video_Time'].apply(lambda x:x.split('分钟')[0])
  13. data['Video_Time'] = pd.to_numeric(data['Video_Time'],errors='coerce')
  14. data['Video_Daoyan'] = data['Video_Daoyan'].apply(lambda x:x.split()[0])
  15. data.drop(index=data[data['year']=='2013'].index,inplace=True)
  16. data.drop(index=data[data['year']=='2014'].index,inplace=True)
  17. data.drop(index=data[data['year']=='2015'].index,inplace=True)
  18. data.dropna(inplace=True)
  19. data.head()

三、数据可视化

1.导入可视化库

本次可视化主要用到matplotlib、seaborn、pyecharts等第三方库

  1. import matplotlib.pylab as plt
  2. import seaborn as sns
  3. from pyecharts.charts import *
  4. from pyecharts.faker import Faker
  5. from pyecharts import options as opts
  6. from pyecharts.globals import ThemeType
  7. plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示
  8. plt.rcParams['axes.unicode_minus'] = False #解决符号无法显示

2.分析各个国家发布的电影数量占比

  1. # 分析各个国家发布的电影数量占比
  2. df2 = data.groupby('Video_Address').size().sort_values(ascending=False).head(10)
  3. a1 = Pie(init_opts=opts.InitOpts(theme = ThemeType.LIGHT))
  4. a1.add(series_name='电影数量',
  5. data_pair=[list(z) for z in zip(df2.index.tolist(),df2.values.tolist())],
  6. radius='70%',
  7. )
  8. a1.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger='item'))
  9. a1.render_notebook()

3.发布电影数量最高Top5导演

  1. # 发布电影数量最高Top5导演
  2. a2 = Bar(init_opts=opts.InitOpts(theme = ThemeType.DARK))
  3. a2.add_xaxis(data['Video_Daoyan'].value_counts().head().index.tolist())
  4. a2.add_yaxis('电影数量',data['Video_Daoyan'].value_counts().head().values.tolist())
  5. a2.set_series_opts(itemstyle_opts=opts.ItemStyleOpts(color='#B87333'))
  6. a2.set_series_opts(label_opts=opts.LabelOpts(position="top"))
  7. a2.render_notebook()

4.分析电影平均评分最高的前十名国家

  1. # 分析电影平均评分最高的前十名国家
  2. data.groupby('Video_Address').mean()['Video_Number'].sort_values(ascending=False).head(10).plot(kind='barh')
  3. plt.show()

5.分析哪种语言最受欢迎

  1. # 分析哪种语言最受欢迎
  2. from pyecharts.charts import WordCloud
  3. import collections
  4. result_list = []
  5. for i in data['Video_language'].values:
  6. word_list = str(i).split('/')
  7. for j in word_list:
  8. result_list.append(j)
  9. result_list
  10. word_counts = collections.Counter(result_list)
  11. # 词频统计:获取前100最高频的词
  12. word_counts_top = word_counts.most_common(100)
  13. wc = WordCloud()
  14. wc.add('',word_counts_top)
  15. wc.render_notebook()

6.分析哪种类型电影最受欢迎

  1. # 分析哪种类型电影最受欢迎
  2. from pyecharts.charts import WordCloud
  3. import collections
  4. result_list = []
  5. for i in data['Video_Type'].values:
  6. word_list = str(i).split('/')
  7. for j in word_list:
  8. result_list.append(j)
  9. result_list
  10. word_counts = collections.Counter(result_list)
  11. # 词频统计:获取前100最高频的词
  12. word_counts_top = word_counts.most_common(100)
  13. wc = WordCloud()
  14. wc.add('',word_counts_top)
  15. wc.render_notebook()

7.分析各种类型电影的比例

  1. # 分析各种类型电影的比例
  2. word_counts_top = word_counts.most_common(10)
  3. a3 = Pie(init_opts=opts.InitOpts(theme = ThemeType.MACARONS))
  4. a3.add(series_name='类型',
  5. data_pair=word_counts_top,
  6. rosetype='radius',
  7. radius='60%',
  8. )
  9. a3.set_global_opts(title_opts=opts.TitleOpts(title="各种类型电影的比例",
  10. pos_left='center',
  11. pos_top=50))
  12. a3.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger='item',formatter='{a} <br/>{b}:{c} ({d}%)'))
  13. a3.render_notebook()

8.分析电影片长的分布

  1. # 分析电影片长的分布
  2. sns.displot(data['Video_Time'],kde=True)
  3. plt.show()

9.分析片长和评分的关系

  1. # 分析片长和评分的关系
  2. plt.scatter(data['Video_Time'],data['Video_Number'])
  3. plt.title('片长和评分的关系',fontsize=15)
  4. plt.xlabel('片长',fontsize=15)
  5. plt.ylabel('评分',fontsize=15)
  6. plt.show()

10.统计 2016 年到至今的产出的电影总数量

  1. # 统计 2016 年到至今的产出的电影总数量
  2. df1 = data.groupby('year').size()
  3. line = Line()
  4. line.add_xaxis(xaxis_data=df1.index.to_list())
  5. line.add_yaxis('',y_axis=df1.values.tolist(),is_smooth = True)
  6. line.set_global_opts(xaxis_opts=opts.AxisOpts(splitline_opts = opts.SplitLineOpts(is_show=True)))
  7. line.render_notebook()

四、总结

本次实验通过使用爬虫获取2016年-2023年的电影数据,并可视化分析的得出以下结论:

1.2016年-2019年电影数量逐渐增大,2019年达到最大值,从2020年开始迅速逐年下降。

2.发布电影数量最多的国家是中国和美国。

3.电影类型最多的剧情片。

4.电影片长呈正态分布,且片长和评分呈正相关关系。
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/772783
推荐阅读
相关标签
  

闽ICP备14008679号