• 收藏
  • 加入书签
添加成功
收藏成功
分享

基于python的豆瓣电影TOP250影片数据的采集与可视化分析

陈群贤
  
新中媒体号
2023年13期
上海电机学院 201100

打开文本图片集

作者简介:陈群贤(1970-06) 女 上海 研究生 副教授 大数据和人工智能

摘要:随着网络的快速发展,大数据技术的飞速发展,海量的数据分布在万维网中,如何快速有效地提取和分析用户所需要的数据显得尤为重要。本文通过基于Python的网络爬虫程序爬取豆瓣电影TOP250网站的有关数据,使用关系型数据库MySQL存储数据,用 Numpy 和 Pandas对数据进行预处理,并利用PyEcharts对爬取的数据进行可视化分析。经过对豆瓣电影Top250排行榜的数据可视化分析,可以了解大众喜好的比较靠前电影是哪几部、受大众追捧的热门类型电影是哪几类,用户还可以快速获得所关心电影的核心内容。

关键字: Python;网络爬虫;可视化分析;豆瓣电影TOP250

0 引言

豆瓣电影top250是豆瓣网站上最受欢迎的电影排行榜之一,包含了大量经典电影和热门电影的海量信息,面对着这样庞大的数据,仅仅使用人工来筛选有价值的数据是不现实的。为了方便电影爱好者们快速获得有价值的信息,本文通过爬虫技术从豆瓣电影TOP250网站爬取所需数据,并对爬取的数据进行预处理和可视化分析。

1 网络爬虫原理

网络爬虫又称为网页蜘蛛,是一种按照一定规则自动抓取万维网信息的程序。网络爬虫的流程主要由获取网页、解析网页、存储数据三部分组成。获取网页就是向服务器发出请求,脚本通过 HTTP 库向目标站点发出 Request 请求,等待对方服务器响应[1],如果服务器作出正常响应,就会得到一个包括所要爬取页面内容的 Response对象r;解析网页就是对r对象的内容通过re正则表达式、BeautifulSoup和lxml解析库等方法进行解析,提取想要的数据;存储数据就是把数据保存至txt或csv文件中,也可以存入MySQL或MongoDB数据库的数据表中。

2 数据采集

2.1网页地址分析

通过网页地址https://movie.douban.com/top250打开豆瓣电影TOP250的网站首页,发现第一页上只有25部电影,要获取所有的250部电影,就需要获取总共10 页的内容。通过单击第二页观察到网页地址变为:https://movie.douban.com/top250?start=25。第三页的网页地址为:https://movie.douban.com/top250?start=50,每往后翻一页,网页地址的start参数就加上25。

2.2应对反爬虫策略

针对爬虫,很多网站都采用了反爬虫技术。正常用户浏览网页的速度是比较慢的,不会在短时间内浏览过多的网页,在进行爬虫时网站会对访问进行统计,如果在短时间内单个IP的访问量超过了某个阈值,会被封杀。豆瓣的反爬机制设置了频率访问最大的限度,对同一IP地址的重复请求有制约,如果一段时间内请求过于频繁,这个IP就会被封掉[2]。

那么当用户真正需要爬取数据的时候,就必须对爬虫进行伪装[3]。以下是本文采用的应对反爬策略:

(1)通过User-Agent反爬虫。当使用requests库进行请求时,大部分情况下都要添加一个请求头headers,而最常见的就是添加User-Agent,帮助爬虫伪装成浏览器正常操作。在Chrome 浏览器的审查元素中找到Headers中的用户代理User-Agent字段,把请求头改成真正浏览器的格式,代码如下:

headers = {

'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',

'Host': 'movie.douban.com'

}

但当单个User-Agent的访问超过阈值时IP会被封锁。为了顺利利用爬虫技术爬取网站数据,频繁更换User-Agent可以避免触发相应的反爬机制。Python的库 fake-useragent对频繁更换User-Agent提供了很好的支持,可谓防反爬利器,更换User-Agent的代码如下:

from fake_useragent import UserAgent

import requests

for i in range(0,10):

ua=UserAgent()

headers={"User-Agent":ua.random}

link = 'https://movie.douban.com/top250?start=' + str(i * 25)

r = requests.get(link, headers=headers)

使用ua. random实现随机变换 headers,,每一次都会生成不一样的伪装请求头。

(2)设置爬虫的间隔时间

用户浏览网站时总会停顿一定时间,但爬虫程序运行时会太过频密地访问网页,很容易被网站监测出来[4],从而招致网站的反爬虫。因此,一般在爬取的时候用Python 的random库设置随机休眠时间从而模拟人为登录状态,代码如下:

import time

import random

sleep_time = random.randint(0,10) + random.random()

time.sleep(sleep_time)

2.3使用requests技术获取网页

Requests技术属于爬虫基础性工具包,它模拟人在浏览器中输入网址向服务器发送网络请求,实现自动爬取HTML网页页面信息的功能[5]。使用requests获取电影网页,并利用for循环翻页的代码如下:

for i in range(0,10):

link = 'https://movie.douban.com/top250?start=' + str(i * 25)

r = requests.get(link, headers=headers)

print(r.text)

link为目标网页地址;header是定义请求头的浏览器代理,进行伪装;r是requests的Response回复对象,从中可以获取想要的信息。r.text是获取的网页内容代码[6],如图1所示:

图1 网页的HTML代码

2.4解析网页、提取数据

使用requests库从网页中把整个HTML源代码爬取下来了,接着要从网页中提取所需的数据,在提取数据之前先要对HTML代码进行解析,解析网页的技术有re正则表达式、BeautifulSoup和lxml两个解析库。本文采用BeautifulSoup库对爬下来的页面进行解析,通过soup=BeautifulSoup(r.text, 'lxml')把网页响应体的字符串转化为soup对象。解析后定位网页各个元素所在的地址,使用 find、find_all和select 等方法提取数据。用div_list = soup.find_all('div', class_='info')找到当前页所有class为“info”的div元素,find_all的结果存放在div_list 列表中,从中提取每部电影的中文名、电影链接、评分、评价人数、上映年份、产地。通过获取到的每部电影的链接访问每部电影的页面来获取导演、片长、电影类型以及剧情简介等详情。

在提取数据时部分电影的信息是不全的,需要用try/except语句来捕获异常,并进行异常处理,否则在爬取不存在的数据时整个程序会停止运行。如某部电影的类型信息在网页中是不存在的,就作无信息处理,保证程序能顺利运行,代码如下:

try:

Video_type= soup.find_all('span', property='v:genre')[1].text.strip()

except:

Video_type=''

有时爬取到的数据中含有多余的字符,这时得对数据进行处理,保证提取的数据符合数据分析和处理要求。比如用Video_pianchang=soup.find('span', property='v:runtime').text.strip()爬取电影片长时爬取到的数据是“116分钟(国际版) ”,而数据处理时希望数据是116,利用正则表达式提取字符串中的数字,通过Video_pianchang = int(re.findall(r'\d+', Video_pianchang))就可以得到期望的数字116。

2.5保存数据

本文之所以选择MySQL进行数据存储,是因为MySQL是关系数据库管理系统,所使用的是访问数据库最常用的标准化语言SQL语言,该系统比较小型且很实用。在存储数据之前先创建一个网络爬虫的数据库douban,在douban数据库中创建movies表,接着往数据表中插入爬取到的每一部电影的数据,代码如下:

import pymysql

#使用connect方法,传入数据库地址、账号、密码、数据库名得到数据库对象

db= pymysql.connect(host='localhost' , user='root', passwd='123456', db ='douban')

#使用cursor()方法获取cursor操作游标来操作douban数据库

cursor = db.cursor()

for eachone in movies_list:

#执行sql语句,插入一条记录

cursor.execute("INSERT INTO movies VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s) ", (eachone))

db.commit()#执行提交操作

db.close()#关闭数据库的连接

将豆瓣电影TOP250网站上获取到的所有电影的中文名、电影链接、评分、评价人数、上映年份、产地、导演、片长、电影类型以及剧情简介保存到了movies数据表中,部分记录如表1所示。

3 数据可视化分析

获取了豆瓣电影TOP250网站上所有电影的所需数据后,为了让人们更直观地了解电影数据中有价值的信息,需要对数据进行整理分析并通过图表的可视化方式把数据中所蕴含的信息展示出来,便于观众快速获取所需的信息。本项目对数据做了以下处理:用柱形图来展示评价人数前10的电影,从柱形图中可以迅速观察到哪些电影受大众喜好的;对电影类型数量TOP10的电影数据进行分类统计并绘制饼图,从饼图中能快速看出哪些类型的电影是属于受大众追捧的热门类型;画出“泰坦尼克号”简介的词云图,观众一眼扫过词云图的关键词就能领略“泰坦尼克号”简介的核心内容。

3.1评价人数TOP10的电影统计图

从movies数据表中获取评价人数TOP10的电影数据,用pandas和numpy对数据进行预处理,采用pyecharts可视化绘图工具绘制柱形图如图2所示。

从图2中可以看出:豆瓣电影TOP250网站中评价人数前10的电影有“肖申克的救赎”、“这个杀手不太冷”、“千与千寻”、“泰坦尼克号”、“阿甘正传”、“霸王别姬”、“我不是药神”、“盗梦空间”、“疯狂动物城”、“三傻大闹宝莱坞”。其中排名第一的是“肖申克的救赎”,说明这部电影最受大众喜欢。该影片之所以获得如此高的评价,成为世界之最,归根结底是因为它引发了世界范围普通观众最广泛的共鸣。“这个杀手不太冷”、“千与千寻”、“泰坦尼克号”评价人数分列第2、第3位,第4位,也是很受大众喜欢的。

3.2 电影类型数量TOP10的饼图

根据电影类型Video_type对movies数据表中的数据进行分组,统计出各种类型电影的数量,取出TOP10的电影类型及相应数量,通过pandas和numpy对数据进行预处理,采用可视化绘图工具pyecharts绘制饼图如图3所示。

从图3中可以看出:豆瓣电影TOP250网站数量前10的电影类型有10种:爱情、喜剧、悬疑、科幻、奇幻、犯罪、动画、动作、家庭、惊悚。爱情类影片的数量43部,差不多是惊悚类数量的3.6倍,说明爱情类电影最受大众追捧,而喜剧、悬疑两类影片占比分列第2、第3位,爱情、喜剧、悬疑三类影片总占比为48.21%。

3.3 泰坦尼克号词云图

词云图,也称为文字云,是用类似云型的彩色图案对文本中频繁出现的词语进行展现,形成“关键词渲染”或者“关键词云层”的效果[7]。绘制泰坦尼克号词云图,先从movies数据表中获取泰坦尼克号影片的简介,然后用ls=jieba.lcut(s)语句把简介生成分词列表,经过 text=' '.join(ls)语句把分词列表连接成字符串。在分词后的内容中有着一些无实际意义的词语,为了达到理想的展示效果,采用stopwords = ["的","是","了" ] 语句去掉不需要显示的词。生成一个美观的词云需要三步:配置WordCloud函数参数,用wc.generate(text)语句向wc中加载文本,通过 wc.to_file("Titanic.png") 把词云保存到“Titanic.png”图像格式文件中。绘制“泰坦尼克号”词云图的主要代码如下:

ls = jieba.lcut(s) #生成分词列表

text = ' '.join(ls) #连接成字符串

stopwords = ["的","是","了" ] #去掉不需要显示的词

wc = wordcloud.WordCloud(font_path="Lantinghei.ttc",

width=700,

height=400,

background_color='white',

max_words=100,stopwords=s)#配置对象参数

wc.generate(text) #加载词云文本

wc.to_file("Titanic.png") #保存词云文件

打开“Titanic.png”图像格式文件,可以看到“泰坦尼克号”词云展示图如图4所示,浏览者只需匆匆一瞥就能够通过关键词来领会“泰坦尼克号”的核心内容。

4 总结:

本文基于Python编程语言,以豆瓣电影TOP250为爬取目标,完成了对电影的中文名、电影链接、评分、评价人数、上映年份、产地、导演、片长、电影类型以及剧情简介数据的爬取和分析,并使用可视化方法展示了评价人数TOP10的电影统计图、电影类型数量TOP10的饼图和电影简介的词云图。通过这些数据的提取和分析,挖掘了经典电影和热门电影的一些关键信息,为电影行业研究观众的喜好和电影行业的发展提供了参考,具有一定的应用价值。

参考文献:

[1]蔡文乐,周晴晴,刘玉婷等.基于Python 爬虫的豆瓣电影影评数据可视化分析[J].现代信息科技,2021,5(18):86-89+93.

[2]简悦,汪心瀛,杨明昕.基于Python 的豆瓣网站数据爬取与分析[J].电脑知识与技术,2020, 16(32):51-53.

[3]黄蓉,毛红霞.基于豆瓣网某系列电影数据采集与可视化分析[J].现代信息科技,2020,4(23): 4-7.

[4]高雨菲,毛红霞.基于Python 的豆瓣影视短评的数据采集与分析[J].现代信息科技,2020, 4(24):10-12+16.

[5]杨健,陈伟.基于Python的三种网络爬虫技术研究[J].软件工程,2023,26(2):24-27+19.

[6]唐松.python 网络爬虫从入门到实践(M).北京:机械工业出版社,2019,30.

[7]祝永志,荆静.基于Python 语言的中文分词技术的研究[J].通信技术,2019,52(07): 1612-1619.

*本文暂不支持打印功能

monitor