基于Scrapy的信息采集与分析
2020-01-03谢钢
谢钢
摘 要:针对携号转网服务背景下电信企业的客户维系和客户精细化服务需求,以及电信运营商对网上不良信息监测和清理的需要,以国内主流社交媒体为主要研究对象,进行网络爬虫策略的研究与实现。文章对基于Python的Scrapy爬虫框架技术进行了分析,设计和实现了基于Scrapy的微博信息采集与分析爬虫,其能按照关键词进行爬取和分析;爬虫使用非关系型数据库MongoDB存储数据、利用Selenium实现模拟登陆、结合Redis数据库存储爬取队列。
关键词:Scrapy;爬虫;微博;MongoDB
Abstract:In view of the demand of telecommunication enterprise customer maintenance and refined customer service under the background of carrying signal to network service,and telecom operators need to monitor and clean up bad information on the internet,taking domestic mainstream social media as the main research object,this paper studies and implements the strategy of web crawler. This paper analyzes the framework technology of Scrapy crawler based on Python,designs and implements a crawler for microblog information collection and analysis based on Scrapy. The system crawls and analyzes according to keywords,uses non-relational database MongoDB to store data,uses Selenium to realize simulated login,and stores crawling queue with Redis database.
Keywords:Scrapy;crawler;microblog;MongoDB
0 引 言
在全业务大环境下,个人客户市场是国内电信整体市场的核心根据地,同时也是中国电信的薄弱领域和努力方向。2019年11月27日,工信部召开携号转网启动仪式,即日起,携号转网正式在全国提供服务,电信业务经营者不得干涉用户的自主选择。号码可携制度促进了运营商间的竞争,提高了用户使用的方便性,同时客户的维系挽留成为电信企业的重中之重。研究网络爬虫技术,采集和分析国内主流社交媒体的大量数据,弄清个人和企业客户需求,聚焦影响客户感知的主要矛盾,是开展科学化精细化客户服务、提升公司服务能力、完善客户维系关怀机制的核心实现技术。
随着互联网技术的高速发展,社交类应用,尤其是微博这一新兴媒体的快速发展,也出现了一些新的问题。一是容易造成隐私和个人信息泄露等网络安全问题;二是一些不良有害信息的传播,主要是以微博、即时通信等为载体,微博作为即时交互平台,传播性广、即时性强,整合了博客、即时通信、社交网络等技术优点,在带来便利沟通的同时,也容易被非法利用。2014年,全国“扫黄打非”工作小组办公室等多部门联合下发《关于开展打击网上淫秽色情信息专项行动的公告》,要求“基礎电信运营企业、网络接入服务企业立即开展自查自纠,主动清理网上淫秽色情信息或链接”[1],通过网络爬虫技术获取微博源数据,是解决快速定位信息源、监测网络不良信息的主要技术途径,利用自媒体主体的微博信息,研究者还可以完成数据分析、舆情监测、热点预测、情感分析等工作[2]。网络爬虫技术可以实现自动化地获取大批量数据。
本人就职于中国电信股份有限公司娄底分公司网络运营部,因为实际工作中对网络数据的分析需要,一直关注和研究爬虫技术,并使用Python语言实现了基于Scrapy框架技术的爬虫系统功能。
1 Scrapy框架
网络爬虫,是一种按照一定规则自动抓取Web信息的程序或者脚本。粗略来看,爬虫的功能和实现过程包括构造目标URL、模拟浏览器伪造请求头部、发起请求、解析数据、清洗并存储数据、绕过反爬机制(使用IP代理、破解验证码、模拟登录等)等。Scrapy框架为爬虫功能的实现提供了一套解决方案,它将爬虫按照工作流程分为五个部分:Scrapy引擎、爬虫、下载器、调度器和数据队列[3]。在正式发起请求前,添加下载中间件处理:可以在向服务器请求数据之前,加上User-Agent伪装浏览器,或者加上Cookie信息模拟登陆、维持访问状态。在服务器返回数据到下载器后,下载中间件也可以判断返回的状态,然后对Response对象做进一步的处理。服务器返回的数据最终到达爬虫模块。在对返回的数据进行简单处理后可以用Yield的方式将其提交到Item Pipeline模块,进行完整的数据清洗和数据存储。
模块化的设计使得Scrapy框架能够满足大规模的网络爬虫需求,开发者按照Scrapy的处理流程和工作逻辑,完成相应的代码书写即可。此外,Scrapy框架也可以方便地实现具备分布式爬虫能力的系统,结合Redis服务器,将调度器的URL队列存储到公网上的Redis服务器即可。所有运行同一爬虫的分布式机器都将从Redis服务器中提取URL下载,爬取效率将大大提升。Redis中存储的URL信息可以持久化保存,如果爬虫碰到异常情况关闭,待爬虫程序重新启动后,不需要再从0开始爬取,直接从Redis数据库的队列中继续提取URL,即可恢复之前的爬取进度[4]。
2 爬虫系统总体设计
经过调查和需求分析,爬虫系统设计为六大功能模块:模拟登陆获取Cookie、爬取指定话题下的实时微博、爬取基于高级搜索功能下的话题微博、爬取指定用户的所有微博、爬取用户信息、数据分析与可视化。该系统主要实现爬取制定话题下的实时微博及其个人信息并进行可视化分析的功能。
3 浏览器自动登录功能设计与实现
微博是一个动态网页程序,登录后才能搜索或者查看微博用户的信息,Selenium是一个基于浏览器的测试工具,用于测试Web程序。与直接发送表单数据进行交互的爬虫不同,Selenium直接使用浏览器进行操作,模拟人工点击、拖动和填写等浏览网页的操作。目前很多网站程序使用JS对用户提交的表单数据进行加密处理,在加密过程中还使用了时间戳混淆、公钥加密等方式,使用传统表单交互需要花大量时间去分析程序的加密逻辑,自动登录代码需要模拟这个加密逻辑;当网站更改加密方式后,开发者需要再次分析新的加密逻辑,并编写新的代码去加以适配和破解。使用Selenium可以简单高效地解决浏览器模拟自动登录问题。该功能模块的实现过程为:通过Selenium打开浏览器,访问对应的登录URL,定位到输入表单,输入用户名和密码,最后使用Click模拟点击登录按钮。登录成功后直接将Cookie信息保存到数据库中,待下次访问需要登录的页面直接将Cookie信息添加进请求头即可。如果登录过程中需要验证码,可以人工进行识别干预,也可以使用OCR文字识别,或者调用百度、腾讯的识别API输入验证码。
4 数据解析
4.1 正则表达式的使用
正则表达式(Regular Expression),可以用于检索、替换匹配搜索规则的文本。设置正则表达式的方法与Windows中资源管理器的通配符搜索类似。使用正则表达式可以快速、高效地将网页中的内容提取出来。Python中的正则表达式有search、match、findall、sub四个常用的方法。其中search方法会扫描整个文本,并将第一个匹配的结果返回,没匹配到信息则返回None值。match方法从第一个字符开始查找,如果文本中包含表达式的子串,则返回Match对象,没有则返回None。findall方法会在全文中查找符合表达式的字符串,然后返回结果列表,非常适合提取HTML页面。sub方法用于删除指定格式的字符串,可以用在数据清洗阶段。
4.2 XPath数据抓取
XPath(XML Path Language)是一种可以在XML文档里查找信息的工具,最初只用于检索XML文档,现在同样适用于查找HTML文档。XPath的功能非常强大,可以将HTML的元素作为节点,通过简洁的路径选择表达式完成信息的抽取。此外,其还提供100多个内建函数,可以检索字符串、数字、时间以及节点和序列。一个HTML文档有许多的标签节点,节点中有id、class等属性信息。各个节点之间还有层级关系,根据这个特点,可以通过XPath来定位节点并抓取目标数据。
5 数据存储使用MongoDB数据库
MongoDB数据库类似于JSON的格式存储数据,组织数据的结构为“数据库”—“集合”—“文档”—“字段”,其中集合类似于关系型数据库中的表,文档相当于关系型数据库中的一条记录,字段则是关系型数据库中的列。与关系型数据库不同,MongoDB的集合里面,每个文档的数据类型不用事先定义,数据中的字段可以随意变动,因此并发写入速度比传统的关系型数据库高很多。MongoDB数据库中文档的字段以键值对的形式组织[5],有利于爬虫数据的保存和读取。Python操作MongoDB的语法和原生的语法相似,可以将其内容快速地迁移到Python当中来。
爬虫将数据爬取出来后需要保存到本地,系统选择MongoDB作为存储数据库。根据爬取数据类型不同,共定义三种数据结构,分别为存储微博信息、存储用户信息和存储指定话题每天微博数量的数据类型。
6 可视化分析功能实现
绘图在数据可视化分析工作中非常重要,通过数据可视化,可以直观地看出数据的关联性和变化趋势,还可以帮助研究者找出样本中的异常值、得出有关模型的思路等。Matplotlib是基于Python的一个开源项目,旨在为Python提供数据绘图包,是Python中非常底层的数据可视化库,可以和图形工具包如PyQt、WxPython一起使用[6]。Matplotlib具有高度可定制化的特点,支持的图表资源种类丰富、简单易用、出图质量可达到出版质量级别;其支持散点图、饼图、条形图、折线图、极坐标图等2D图形,同时也支持绘制3D立体图形。绘制的图像可以保存成多种文件格式,如PNG、PDF、PS、EPS和SVG等格式。
爬虫系统数据分析模块一共分为四个部分,统计发布微博的终端、统计某话题下发布微博的地区、按时间统计某话题下微博发布的趋势、根据微博的文本内容生成词云图。实现流程为:首先定义基于Matplotlib的绘图函数,传入字典元素,绘制折线图和条形图;再定义基于WordCloud第三方库的词云函数,输入词频的字典元素,输出词云图;然后定义利用Jieba分词技术统计词频的函数,统计出词频信息,以字典的形式输出;最后分别定义实现数据分析四个模块的函数,查询出所需要的数据。篇幅所限,此处略去功能实现代码。
7 结 论
针对电信公司业务和服务需求,研究基于Python的Scrapy爬虫框架理论及实现技术,研究内容涉及爬虫的原理、自动化测试、非关系型数据库、数据分析、加解密、Python程序设计等相关知识,设计和实现的爬虫系统通过爬取微博的关键词搜索页面、用户主页面实现话题下微博的爬取,按要求提取用户需要的内容,这些数据可以帮助电信公司研究人员分析客户需求和监测不良信息。
参考文献:
[1] 时镇军.互联网不良信息监控在电信运营商的研究与应用 [J].江苏通信,2020,36(2):49-52.
[2] 陈兴蜀,常天祐,王海舟,等.基于微博数据的“新冠肺炎疫情”舆情演化时空分析 [J].四川大学学报(自然科学版),2020,57(2):409-416.
[3] 林红静,黄梦醒.基于微博信息的关键词库爬虫策略 [J].海南大学学报(自然科学版),2016,34(2):112-120.
[4] 崔庆才.Python3网络爬虫开发实战 [M].北京:人民邮电出版社,2018.
[5] 谢乾坤.左手MongoDB,右手Redis——从入门到商业实战 [M].北京:电子工业出版社,2019.
[6] 杨迎.基于Python语言的Web数据挖掘与分析研究 [J].现代信息科技,2019,3(23):63-65.
作者简介:謝钢(1975—),男,汉族,湖南娄底人,中级工程师,本科,研究方向:信息系统管理、网络及接入网技术。