基于聚焦型网络爬虫的影评获取技术
2018-10-22杨小兵
高 宇,杨小兵
(中国计量大学 信息工程学院,浙江 杭州 310018)
大数据和云计算等新一代互联网技术的迅速发展,使得如何从大量数据中提取有效信息,挖掘其中的价值成为当前的研究热点.然而,很多用户通过搜索引擎获取数据的过程中,经常会出现很多不需要的信息,这加剧了有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾.在通过传统的搜索引擎进行数据获取的过程中,还需要用户对搜索到的信息进行分析,最终找到自己需要的信息.就目前的网络现状,这样的搜索引擎是非常浪费时间的,而且准确度不高.
本文在通用爬虫的基础上,实现了一个基于python的聚焦型网络爬虫系统,它根据既定的抓取目标,有选择的访问网络上的网页和相关的链接,从而获取所需信息.实验中,爬虫程序模拟登陆豆瓣电影网址获取最新上映电影的影评,并将爬取到的数据以JSON的格式存储到本地,以便能够后期进行数据分析.最后对影评信息使用Jieba分词,将出现频率高的词语以词云的形式直观展现出来.使用本文爬虫程序可以节省数据分析人员的开发时间,实现对海量数据起到针对性的提取.
1 基于Python的聚焦型网络爬虫架构
1.1 网络爬虫概述
网络爬虫是一种按照一定的规则,自动的抓取万维网上数据的程序或者脚本.网络爬虫主要分为两类:一类是搜索引擎服务商设计的通用爬虫,这类爬虫通过网页链接采集互联网信息,然后返回的信息供搜索引擎建立索引.所以,当用户在搜索引擎中输入文字搜索时,引擎会根据输入信息进行检索,找到搜索文字的相关内容并返回.另一类是对确切指定的网址进行数据抓取,获得所需信息.
1.2 工作流程
搜索引擎中网络爬虫的基本工作流程如下.
1)确定初始种子URL集合.
2)从集合中取出待抓取的URL队列,将其对应的网页下载下来,存储到已下载网页中,再将对应的URL放进已抓取URL队列中.
3)分析下载的网页数据,从中获取新网站的URL.若新的URL不在已抓取的URL队列中,就将其加入到待抓取URL集合中.
4)不断循环(2)、(3)步骤,直到待抓取URL队列中所有的URL已经完全抓取.
5)清洗数据,根据使用者文字搜索,展示相应页面.
整个通用的网络爬虫的基本工作流程图,如图1.
图1 网络爬虫结构Figure 1 Structure of web crawler
聚焦型网络爬虫是“面向特定主体需求”的一种网络爬虫程序,在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息.相对于通用网络爬虫,聚焦型网络爬虫还需要解决三个主要问题:
1)对抓取目标的描述或定义;
2)对网页或数据的分析与过滤;
3)对URL的搜索策略.
目前聚焦爬虫对抓取目标的选取可分为基于目标网页特征、基于目标数据模式和基于领域概念三类.基于目标网页特征的爬虫所获取、存储并搜索的对象一般为网站或者网页.基于目标数据模式的爬虫主要针对网页上的数据,所抓取的数据一般要符合一定的模式,或者可以转化或映射为目标数据模式.另一种描述方式是建立目标领域的本体或者词典,用于从语义角度分析不同特征在某一主题中的重要性.
1.3 Python语言
Python语言是一门功能强大、语法简洁的开源编程语言,可以运行在Windows、Mac和Linux等各种操作系统上.它继承了传统编译语言的强大性和通用性,同时也借鉴了简单脚本和解释语言的易用性.其次,Python非常擅长处理文本和字符串,它包含了常用的文本处理函数,支持正则表达式.可以方便地处理文本内容.更重要的是,Python具有丰富的标准库和可以添加大量的第三方库.它又被称为胶水语言,能够和其他语言模块轻松结合起来.
1.4 与爬虫相关的库及存储形式
爬虫中最主要的模块是网页下载模块、网页解析模块和数据存储模块.网页下载器中urllib和urllib2是python中的内置下载模块.本实验中采用的是Requests第三方库,支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传和确定响应内容的编码等.相比较内置模块,其对HTTP请求更加简单,操作也更加人性化.
网页解析器用来处理下载的网页内容,针对性地提取我们需要的数据.网页的内容一般是HTML格式,本实验采用Beautiful Soup解析网页和正则表达式匹配文本.Beautiful Soup可以将复杂HTML文档转换成一个简单的树型结构,通过节点进行搜索遍历所需要的内容.在编写处理网页文本的程序时,经常会出现查找符合某些复杂规则的字符串的需要,而正则表达式通常作为一个模板,可以将某个字符模式与所搜索的字符串进行匹配.
最后就是数据存储,利用python可以将数据转为JSON、CSV或者其他格式文件.为了便于后期进一步的数据分析,实验中将爬取的数据以JSON格式存储.为了防止乱码出现,存储时要特别注意数据的编码方式.
2 数据爬取设计
网络爬虫系统主要通过模块化进行设计,一般每个功能都需要独立的模块.这样能够方便以后进行代码的维护,而且还能提高代码的可读性.各种模块的功能实现之后,整个网络爬虫体系的功能也就已经完成.本实验以爬取豆瓣最新电影影评为例,详细讲解Python聚焦型爬虫的实现原理.
2.1 页面抓取
根据指定的URL,抓取豆瓣网最新上映电影页面.通过建立连接,发送HTTP请求.利用Requests建立与服务器的连接,当服务器接收到请求后,返回相应的HTTP应答.
2.2 页面处理
进行页面处理时,首先需要对HTML相关的源代码进行过滤和处理,分析出需要的信息,然后再对分析出的结果进行整合.对应网页的HTML结构文档如图2.
图2 网页的HTML结构文档Figure 2 HTML structure document of the web page
通过上文的HTML文档,能够查看电影的相关信息,比如片名、评分、演员和时长等.然而爬虫最终需要抓取的是影评信息,而电影影评对应的网址为:https://movie. douban. com/subject/*******/comments?start=##&limit=20.
其中*******对应的是电影的ID,##对应的是影评的页数.由此可知,实验中先要根据初始URL爬取到对应电影的ID,然后再爬取新的网址获取相应的影评信息.需要定位的DOM树节点及属性流程图如图3.
图3 DOM树节点流程图Figure 3 Flow chart of DOM tree node
正如上文介绍的,使用Beautiful Soup解析HTML网页标签,并提供定位内容的便捷接口.部分代码及注释为:
#获取所有正在上映电影的ID和片名,并以列表的形式存储
contents = soup. find_all(‘div’,id = ‘nowplaying’)
content = contents[0]. find_all(‘li’,class_ = ‘list-item’)
获取到相应电影的ID,就可以根据新的网址定位到其影评页面.对应的页面解析如图4.
图4 影评页面解析Figure 4 Analysis of review page
由图4可知,对应的影评信息在div节点,class属性为comment-item下,相应代码如下:
#包含影评及其他信息的代码
Comment_later = soup.find_all(‘div’,class_=’comment’)item
#提取出影评信息
Comment_later. find_all(‘p’)[0]. string
#在爬取影评信息的代码中,通过自定义列表索引,就可以获取不同的电影评论
Comment_list = getCByld (nowplaying_list[*][‘id’]
其中,*代表索引值,对应着不同电影,getCByld是爬取影评的函数.
运行上述代码可以爬取到影评信息,然后将这些数据以JSON的格式保存到本地.此外,本实验可以从输入端自定义索引,就可以获取相应的电影影评及词云展示,无需再通过搜索引擎查询,从而加快了我们对数据的获取能力.本实验爬取了网站的前10页影评,保存结果为图5,可以看到这些评论和网页中的电影评论完全一致.
3 数据可视化分析
数据可视化是数据分析很重要的一部分,它能够从繁杂的数据中更直观更有效的获取信息.当获取到影评信息之后,需要对数据进行可视化,首先需要做的是数据的清洗.
图5爬取的电影影评
Figure 5 Film review crawled
1)将所有的评论转化为字符串格式.代码为:
String_num=’’
for k in range(len(comment_list)):
String_num=String_num+str(comment_list[k]. strip()
2)利用正则表达式匹配中文,去掉所有的标点符号.匹配中文的代码为
pattern = re. compile(r’[u4e00-u9fa5]+).
3)对数据进行中文分词操作,并去掉数据中没有参考价值的虚词,实验中使用的是Jieba分词.
4)调用pandas包的groupby、agg和sort_values函数进行分组排序处理,以便用于后面词云显示.
5)最后调用WordCloud词云包,将数据用词云进行显示:plt. show(). 如图6.
图6 影评的词云显示Figure 6 Cloud display of movie reviews
4 结语
随着网络上的数据资源日益庞大,有效获取所需数据变得尤为重要.聚焦型网络爬虫作为一种自动获取相关数据的手段,有着较高的应用价值.本实验中,针对性地爬取某一电影的影评数据,确保了数据的真实性与最新性,避免了无关数据的干扰.这样的话,接下来的数据分析结果,才有参考价值.不过,若爬取的内容过多,Python执行会花费很多时间,如果结合Python的多线程技术,并考虑下载缓存优化和并发性,则将会使性能达到极大改善.