基于网络爬虫的新浪微博数据抓取技术
2019-02-18王金峰彭禹王明钟声赵雪辉
王金峰 彭禹 王明 钟声 赵雪辉
【摘 要】随着人工智能和大数据时代的到来,各种数据都变得越来越重要。新浪微博作为国内最大的社交平台之一,因为其拥有大量用户,每天都产生着庞大的数据,所以如何快速获取到这些数据并实现结构化的存储以便后续利用是一个挑战。论文对微博网页端平台进行分析,选用Scrapy框架和Requests、Selenium等工具,提出了对微博数据进行抓取的高可行性方案,该方案能够实现多用户同时抓取,获得微博用户的关系数据和微博内容等。
【关键词】网络爬虫;新浪微博;大数据
【Keywords】web crawler; sina microblog; big data
【中图分类号】TP311.1 【文献标志码】A 【文章编号】1673-1069(2019)01-0162-02
1 引言
随着移动互联网的飞速发展,人们越来越多地在社交网络上发表自己的见解,分享自己的生活,与他人进行交流讨论。新浪微博作为国内最大的社交平台之一,同时也成了各类消息发布的最主要渠道之一。截至2017年9月,微博月活跃用户3.76亿,日活跃用户1.65亿,每天都有用户发布上亿条微博,评论、转发或点赞其他微博。一个如此庞大和公开的社交平台,每天都能产生海量信息,能为各种舆情监控、商业推广分析、自然语言处理等系统提供大量的数据支持[1]。在国外,开展了针对于Twitter和
Facebook等社交平台的一系列研究,但是不同于国外的Twitter和Facebook等平台,微博官方并没有提供相关接口给人们下载与微博相关的数据集,并且微博的登录、浏览等操作都有较敏感的反爬虫机制,这给数据的采集带来了困难,对普通的想获取相关数据的人员来说是个极大的挑战。因此,快速获得微博数据的方法就是构建一个稳定高效的爬虫抓取系统。
2 网络爬虫
2.1 原理
网络爬虫(Web Crawler),是自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站。爬虫一般分为数据采集、处理和储存三个部分。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
2.2 网络爬虫框架Scrapy
Scrapy是Python开发的一个快速、可扩展的Web抓取框架,用于抓取Web站点并从页面中提取结构化的数据。通过Scrapy中的Spider模块,能方便地定义网址爬取和数据提取的规则。
3 微博爬虫策略
现在各种爬虫的搜索策略[2]主要为:深度优先搜索策略、广度优先搜索策略、非完全PageRank策略以及大站优先搜索策略。
微博跟其他普通网站相比,动态性和网页结构都比较复杂,其对于爬虫的防范也更加严格,普通的爬虫程序一般不能直接获取到相应的网页内容,但其网页内容中的数据格式较为统一。所以,针对微博相关的浏览机制,运用一些工具和方法,就可以较为方便地获取到微博中的有关数据。
3.1 微博爬取入口选择
微博网页端基本分为PC端用户入口(域名:weibo.com)和移动端用户入口(域名:weibo.cn)。这两种页面虽然展现内容的方式和策略有所区别,但能获取的数据基本相同,且由于PC入口为大多数网页端用户浏览微博的主要途径,从安全性和用户体验等角度考虑,该入口交互设计都更复杂,并设置有许多动态刷新的内容,这给数据的爬取造成了一定难度,而移动端网页可以直接发送不同的HTTP请求来获取相应的内容[3],相比
PC端而言,后者网页结构更加简单,设置的反爬措施也更少,所以选取通过移动网页入口来进行数据的爬取和解析。
3.2 微博登录和爬取
在微博中进行网页浏览是需要进行登录并保持登录状态的,否则是无法获取到相关信息的。我们使用多个微博账户通过Selenium自动化工具加Firefox浏览器无头模式访问微博登录页面进行登录,登录成功后将其相应的cookies保存起来。为了提高爬取的稳定性和成功率,还需要建立一个User-Agent池,再對Scrapy的middlewares模块进行扩展,在其中的process_request方法里对Scrapy的request加入自动化登录微博后获得并已保存在数据库的Cookies,在Scrapy请求微博服务器时使用一个可用的Cookies并随机抽取一个User-Agent进行伪装,这样就能顺利访问页面,减少爬虫请求被微博服务器屏蔽和账户被封号的概率。采用的抓取策略是广度优先搜索,通过社交关系[4],抓取用户的关系数据。只要利用一小群“种子用户”,每个用户都对应有一个微博ID,通过使用微博ID也就能获得该用户的全部个人信息和他所发布的微博。以某个“种子用户”为起点,获得他的关注人和粉丝等关系[5],再对其好友进行关系搜索,并按此方法递归爬取,将得到的用户去重[6]和排序,加入待爬取的队列,从而得到一个庞大的待爬取的用户数据集。理论上,这可以爬取到微博上所有的用户信息。
4 微博数据抓取
4.1 微博信息的爬取
得到用户ID后,就能通过发起不同的HTTP请求访问他们的个人信息、微博列表、粉丝列表和关注列表等页面,将页面下载之后,能看到这些页面都是有固定结构的HTML代码,只要在Scrapy里自定义的Spider中通过正则表达式或者Xpath等工具分别对Response结果进行不同的解析,就能得到相应的结构化数据。
一般的爬取只需保留四类数据:①微博信息;②个人信息;③用户关系(只保留关注者的信息);④微博评论信息。例如,微博信息主要抓取的是该用户发布过的所有微博的内容、时间、转发数、评论数、点赞数、发布微博时的地点(经纬度坐标)以及发布微博所用的设备或平台等,如果是转发微博,还可以获得源微博的URL链接等。
同时,微博下面的评论与回复也可以按需求进行抓取并以时间排序,作为对话语料数据保存。
4.2 低价值信息的过滤
微博中因为各种各样的原因[7],通常会存在一些爬取价值不大的账号和信息,例如,常见的无人使用的“僵尸账号”或一些“恶意营销号”等,如果不加处理而直接爬取则会浪费许多爬取性能和储存空间,这就需要过滤待爬取的原数据。
目前,在爬取过程中不能很好地识别或直接判断无价值信息,但微博用户可以设定某些条件来达到过滤的目的[8],如设置被爬取的主体账号的粉丝和关注数阈值在5000之内,判断其是否有正常的头像,昵称是否是常见的“垃圾账号”类的昵称等,也可针对不同的爬取需求来设置爬取对象的属性,如地域、年龄、发布的微博数等,从而得到相应的结果数据。
5 结语
本爬虫从技术和思路上提供了获取微博上相关数据的一些方法,对于中小型的数据需求有较好的适用性,并且基于Scrapy框架进行了扩展,相比于一般的爬虫系统,有着更好的应对反爬虫的机制,提高了爬取的效率和稳定性。
作为主流社交互动平台,在当今大数据时代,微博存在着巨大的可挖掘价值。如何提供更快、更准确的数据爬取技术,将会是今后极具研究价值和挑战的方向。
【参考文献】
【1】张赛,徐恪,李海涛.微博类社交网络中信息传播的测量与分析[J].西安交通大学报,2013,47(2):124-130.
【2】張俊林.这就是搜索引擎:核心技术详解[M].北京:电子工业出版社,2012.
【3】周立柱,林玲.聚焦爬虫技术研究综述[J].计算机应用,2005,25(9):1965-1969.
【4】刘玲,杨长春.一种新的微博社区用户影响力评估算法[J].计算机应用与软件,2017,34(7):212-216+261.
【5】冯静.微博用户排名机制的研究[D].秦皇岛:燕山大学,2012.
【6】严磊,丁宾,姚志敏,等.基于MD5去重树的网络爬虫的设计与优化[J].计算机应用与软件,2015,32(2):325-329+333.
【7】刘晶,李琳,李石君.基于社交网络大规模行为数据的用户关系研究[J].计算机应用与软件,2016,33(7):38-41.
【8】康书龙,叶施仁,肖春.基于用户质量的微博社区博主影响力排序算法[J].计算机工程与应用,2016,5(4):128-132.