随着网络的迅速发展,更多的人愿意在网上发表自己对某些事物的情感、态度、看法,这些信息中蕴藏着大量有价值的信息,如果能够抓取到这些数据并对其进行分析,可以有效改进产品服务、预测股票走势、挑选优良产品、挑选一部好看电影等。
1 网络爬虫概述
网络爬虫,又称网页蜘蛛(web spider),是一个功能强大的能够自动提取网页信息的程序,它模仿浏览器访问网络资源,获取用户需要的信息,可以为搜索引擎从万维网上下载网页信息,因此,也是搜索引擎的重要组成部分。
传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列中。然后,根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直至达到系统的某一条件时停止。另外,所有爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询与检索;对于聚焦爬虫来说,这一过程的分析结果还可能对后续的抓取过程提供反馈和指导。
2 数据的抓取
2.1 寻找爬虫入口
豆瓣上有大量的电影影评,对比可以发现所有短评页面都遵循https://movie.douban.com/subject/[唯一标识数字]/comments?status=P的规则,也就是说,抓取到电影的唯一标识数字就可以抓取到该电影的短评网址。
唯一标识数字的抓取可以通过谷歌浏览器:更多工具->开发者工具->Network查看豆瓣影评搜索功能的工作状态,发现可抓取数据的网页https://movie.douban.com/j/search_subjects?type=movie&tag=最新&sort=recommend&page_limit=20&page_start=0。
其中,tag为查询电影的类型,共有[“热门”“最新”“经典”“可播放”“豆瓣高分”“冷门佳片”“华语”“欧美”“韩国”“日本”“动作”“喜剧”“爱情”“科幻”“悬疑”“恐怖”“动画”]类型;sort为排序方式;page_limit为每页显示的电影个数;page_start为查询电影起始位置。
通过分析可发现,每次点击加载更多电影时,该网页会给主页面传递更多的电影信息,提供json格式的文本,可以通过Python的json库将其解析成字典便于后续处理。
抓取信息时,只需要更改tag及page_start(20的倍数)就可以抓取到大量的电影数据。可以发现,所需要的电影唯一标识数字在cover属性中,切割获取到唯一标识数字,将大量标识数字保存到标识数字集合(set)中为后续操作做准备。那么,每部电影的起始页就是https://movie.douban.com/subject/唯一标识数字/comments?status=P在标识数字集合中抓取的唯一标识数字。
2.2 翻页处理
通常情况下,短评不只有一页,因此,需要进行翻页操作。
第一种方法是在当前页面抓取下一页的网址,但这种方法增加了解析的过程,而且非登录状态下只能查看前10页,每页20条短评共200条短评,需要加入条件来终止数据抓取,但使用这种方式无法确认当前页面是多少,所以无法达到想象状态。
第二种方法是找寻页面的共同点,https://movie.douban.com/subject/唯一标识数字/comments?start=0&limit=20&sort=new_score&status=P&percent_type=。通过该地址发现,每个电影的网址都遵循这样的规律,唯一标识数字代表某部电影;start代表影评起始数(20的倍数),这样只需更改这两个条件就可以抓取到每部电影的前200条短评了。(注:豆瓣对同一用户的请求频率有限制,如果同一用户请求过快,就会要求进行身份验证,所以登录状态下是不行的,那么就需要大量账号切换使用,但大量账号不太现实。所以本文的爬虫是在非登陆状态下进行的。)
2.3 设置headers
headers是HTTP请求和响应的核心,承载了客户端浏览器、请求页面、服务器等相关信息。通过谷歌浏览器:更多工具->开发者工具->Network->headers可以轻松抓取到headers信息,为减少IP被封的频率,要不停更换Cookie和User-Agent,其他信息保持原样即可。
User-Agent是一个特殊字符串头,使服务器可以识别操作系统、浏览器的信息。研究时可在百度上下载大量User-Agent信息,每次随机抽取其中一个即可。
Cookie保存用户的身份信息,由于是在分登陆状态下,Cookie主要是bid信息,因此,可以直接使用随机字符串生成该信息。(注:豆瓣设有时间访问上限,也就是说一段时间内同一段IP的访问次数有限)
2.4 使用requests实现循环抓取网页源码
确认已经安装requests模块,import request测试是否会报错,如果没有报错则代表已经安装成功,否则使用pip install requests进行安装。requests模块使用Python语言编写基于urllib的http库,操作比urllib更加方便简单,仅需要几个简单的操作就可以实现网页源码的获取。
使用requests.get()方法对豆瓣的短评页面进行网页源码的抓取。首先,从标识数字集合中抽取一部电影,然后逐一抓取该电影的前10个网页。循环传入每页网站及随机生成的headers头文件,并使用变量接受返回值。其次,使用r.status_code查看请求返回状态码,常见的请求返回状态码有三种:200(成功)、404(服务器找不到请求的网页)、403(禁止)服务器拒绝请求。其中,404为默认抓取前10页数据,但该电影的影评可能不足10页,所以可以终止对该电影影评的继续抓取,在标识数字集合中抓取下一部电影继续运行;403为某段时间内同一IP下请求次数过多,可以使用IP代理进行抓取,也可以让爬虫等待一段时间后再进行网页源码抓取。最后,使用r.text获取网页源码,鉴于网页源码比较乱,通常需要从中提取所需内容。
2.5 使用PyQuery解析数据
与requests相同,首先确认已经安装PyQuery模块。PyQuery库是一个非常强大、灵活的网页解析库,PyQuery是Python仿照jQuery的严格实现。语法与jQuery几乎完全相同。
由于获取到的网页源码是没有价值的,所以需要解析每个网页源码,即获取一个网页源码就要对其解析出数据然后保存。
图1 网页部分源码
可以发现,每段短评都在comment-item->comment类下的p标签中,可以使用PyQuery.find()方法寻找所有comment-item类,然后对得到的文本再次使用find.()查找comment类,最后查找到p标签下的文本,这样即可找到所需短评。但这种方式只能解析一个短评,如果解析当前页面的所有短评就需要使用循环解析。
2.6 保存文件
爬虫获取的数据可以存储为csv格式。csv是一种通用的、相对简单的文件格式,被用户、商业和科学界广泛应用。csv主要用于程序之间转移表格数据,有些程序本身是不兼容的格式,但许多程序都支持csv格式。当使用csv文件时,若csv文件的路径构造不存在,Python会创建一个新的路径来存放csv文件;若csv路径存在,Python则会重写该csv文件。此外,也可以保存到json文件、Excel表格,以及本地数据库中。
3 结语
文章根据网站的特点,设计了一种基于Python中requests模块及PyQuery模块进行影评采集的爬虫程序,可采集豆瓣网大量影评信息。通过上述方法,实现了豆瓣网大量影评信息的抓取。在具体实践过程中,可将爬虫部署到云主机,不间断地抓取数据,随时使用随时到主机中提取。网络的发展,使利用爬虫获取数据已经成为一种常用手段。通过该方法不仅可以抓取影评,只要稍加修改就可以抓取其他数据。
参考文献
[1]郭丽蓉.基于Python的网络爬虫程序设计[J].电子技术与软件工程,2017,(12).
[2]网络爬虫.https://baike.baidu.com/item/网络爬虫.
[3]白雪丽.浅析基于Python爬虫技术的特性及应用[J].山西科技,2018,33(2).
[4]王锦阳.主题网络爬虫的并行化研究与设计[D].成都:西南石油大学,2017.
[5]夏火松,李保国.基于Python的动态网页评价爬虫算法[J].软件工程,2016,19(2).
基金项目
国家级项目“大连民族大学2017年大学生创新创业训练计划项目”(201712026024)。
(作者高宠系大连民族大学计算机科学与工程学院学生)