基于网络爬虫的新浪微博数据获取方式研究

2017-12-13 00:17吕鹏辉
电脑知识与技术 2017年33期
关键词:网络爬虫数据采集

吕鹏辉

摘要:随着Web2.0时代的到来,微博正逐步成为公共信息传播的主流媒体,如何高效率地获取完整的微博数据显得极为重要。该文以新浪微博的评论内容为研究对象,利用模拟登录[1]下网络爬虫、调用新浪微博API[2]以及通过微博手机版[3]中接口等三种方式进行数据采集,对比采集速率以及采集到的内容。实验表明,在采集微博评论时可以使用新浪微博API获取关注用户最新微博ID,使用模拟登录的方式针对这些ID获取对应微博评论,在保证数据完整性的前提下实现了采集速率的最大化。

关键词:模拟登录;微博API;网络爬虫;数据采集

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)33-0009-04

1 概述

21世纪是移动互联网迅猛发展的世纪,Facebook 、Twitter、新浪微博等一系列社交网络应运而生,使得人们获取信息的方式有了翻天覆地的变化。同时,随着社交网络的用户量急剧增长,以交友、信息共享為目的的社交网络[4]迅速成为人们阐述观点、传播信息、推广营销的理想平台,因此,越来越多的研究人员参与其中来进行多方面内容的研究。根据《第39次中国互联网络发展状况统计报告》中的数据显示,截止2016年12月,我国网民规模达7.31亿,相当于欧洲人口总量,互联网普及率达到53.2%。中国互联网行业整体向规范化、价值化发展,同时,移动互联网推动消费模式共享化、设备智能化和场景多元化。国内移动大数据服务商QuestMobile发布2016年度报告——“2016年度App价值榜”,数据显示,2016年12月,微博月活跃用户数再次实现46%的增长,在所有App中排名第8位,其中高价值用户比例高达76.3%,因此,微博数据研究是非常有意义的。

如何高效并准确地从社交网络中将所需要的信息检索出来十分重要,本文以新浪微博评论数据作为实验研究对象,所涉及实验均在Java语言环境下实现。研究了在模拟登录下通过网络爬虫,微博API接口以及微博手机版提供的接口进行数据获取的方案,并针对数据提取目标提出了融合方案。最后通过分析各采集方案的利弊,进一步提出采集方案融合的策略,得出API接口与网络爬虫融合能保证数据完整性并提高采集效率。

2 信息检索技术

信息检索[5]领域的先驱Gerard Salton提出,信息检索是关于信息的结构、分析、组织、存储、搜索和检索的领域。这一定义应用于今天仍然十分合适、非常准确。信息检索的主要焦点一直是文本和文本形式的文档,而文档与结构化数据库最重要的却别在于,文档中的大部分信息以文档形式存放,文本没有结构。因此,如何从社交网络中通过信息检索技术检索出所需要的文本数据,并将其转换为易于使用的结构化数据持久化到数据库中是非常重要的。

在对社交网络数据获取中,爬虫是一种较为常见的方式,爬虫通过追踪网上的超链接可以获取到互联网中对应的资源。如何能高效地获取到这些资源,保证资源的准确性,并在资源发生变化时保证所获取的资源是最新的非常具有挑战性。由爬虫获取到的资源通常都不是纯文本形式,微博中通常可以获取到HTML、JSON、XML等形式的资源数据。我们需要将这些形式的数据处理后,转换为文本文档以及与这些文档对应的结构化数据,并存放在文档数据库中。

爬取是指自动地发现并下载网页,网络爬虫指的是下载网页的程序。网络爬虫在爬取过程中通常需要面临的三大难题。第一,互联网规模过于庞大,对需要获取资源的定位比较困难;第二,互联网上的网页通常不受搜索爬虫数据库创建者的控制,数据结构可能经常发生改变;第三,站点拥有者可能不希望我们获取到其中一部分数据,并且频繁访问资源可能会被屏蔽掉。

3 数据采集方式

3.1 通过模拟登录进行数据采集

互联网上的每个资源都有自己唯一的资源定位器(uniform resource locator),即URL。URL主要由三部分组成:协议方案、主机名、资源名。微博中主要使用超文本传输协议与客户端进行交互,主机名为weibo.com,URL指向微博中一项具体的资源。而微博中大部分页面需要登录才能得到完整信息[6],因此想要通过程序获取微博信息,必须要解决模拟登录问题。

通过对微博网页版登录方式的分析发现[7],主要登录步骤是:

1) 向微博服务器发送一个get请求,浏览器返回名为servertime和nonce的随机字符串。

2) 使用BASE64加密微博账号,使用RSA算法对(1)中的servertime和nonce以及微博密码三个值组成的字符串加密,向微博服务器URL发送包含加密过的账号以及密码的post请求。

3) 服务器收到请求后进行验证,验证成功后重定向一个URL给客户端,浏览器解析该URL并进入登录成功页面,并把登录标志写入本地cookie。

4) 之后每次访问微博URL时,在请求中加入以上cookie,经过地址重定向之后即可获取完整的微博资源。

模拟登录后,类似于用户正常访问,新浪微博对用户访问进行了访问限制,实际数据爬取过程中,如果微博爬虫访问过于频繁,网络IP以及微博账号会被封停[8],因此需要对数据抓取频率做出限制,控制访问频率。

3.2 通过微博API进行数据采集

微博开放平台开放了包括微博、评论、用户及关系在内的二十余类接口,通过Oauth2.0[9]用户授权后即可在任意开发环境下使用。丰富齐全的功能,可以满足各种类型的产品需求。

OAuth是目前国际通用的授权方式[10],它的特点是不需要用户在第三方应用输入用户名及密码,就可以申请访问该用户的受保护资源。OAuth最新版本是OAuth2.0,其认证与授权的流程更简单、更安全。OAuth为客户端提供了一种代表资源拥有者访问受保护资源的方法。在客户端访问受保护资源之前,它必须先从资源拥有者获取授权(访问许可),然后用访问许可交换访问令牌(Access Token,包含许可的作用域、持续时间和其它属性等信息)。客户端通过向资源服务器出示访问令牌来访问受保护资源。endprint

访问令牌提供了一个抽象层,将不同的授权结构(如用户名密码)替换成资源服务器可以理解的单一访问令牌。这种抽象使得分发短期有效的访问令牌成为可能,也使得资源服务器不必理解多种多样的授权机制。使用 Oauth2.0机制,进行认证授权,获取访问令牌,并通过访问令牌来访问受保护资源,如图1所示:

OAuth2.0的工作流程简述如下:

(1) 客户端从资源拥有者(最终用户)那里请求授权。授权请求(Authorization Request)能够直接发送给资源拥有者,或者间接的通过授权服务器发送请求;

(2) 资源拥有者为客户端授权,给客户端发送一个访问许可(Authorization Grant);

(3) 客户端出示自己的私有证书(client_id、client_secret)和上一步拿到的访问许可,来向授权服务器请求一个访问令牌;

(4) 授权服务器验證客户端的私有证书和访问许可的有效性,如果验证有效,则向客户端发送一个访问令牌(Access Token),访问令牌包括许可的作用域、有效时间和一些其他属性信息;

(5) 客户端出示访问令牌向资源服务器请求受保护资源;

(6) 资源服务器对访问令牌做出响应(Protected Resource)。

微博中进行Oauth2.0认证的基本流程:

完善开发者资料并提交认证[11];认证通过后新浪提供AppKey和AppSecret;用户向微博提供回调页面,通过认证程序获取到微博提供的32位十六进制code;将该code提交给认证服务器后,服务器返回24小时有效的Access Token;使用Access Token调用相应的API接口或者发布数据。

由于2014年11月微博接口升级后,对未授权本应用的用户,将无法获取其个人简介、认证原因、粉丝数、关注数、微博数及最近一条微博内容等信息,本文采集的主要是主动关注用户的数据。微博API提供了一系列基础数据接口[12],主要包括粉丝服务接口、微博接口、评论接口、用户接口、关系接口、短链接口、公共服务接口、Oauth2.0授权接口等。

如果想获得某个用户的信息,可以使用微博提供的用户接口、微博接口、评论接口等。通过OAuth2.0认证,很容易可以获取到用户信息,这些信息数据会以JSON格式返回。新浪官方提供的SDK会将其封装成JSON对象,解析起来也极为方便。

以下是通过https://api.weibo.com/2/users/show.json接口获取到李**先生的个人信息:

{

"id": 1197161814,

"idstr": "1197161814",

"class": 1,

"screen_name": "李**",

"name": "李**",

"province": "11",

"city": "1",

"location": "北京 东城区",

"description": "",

"url": "http://blog.sina.com.cn/kaifulee",

…}

返回的信息包括:用户UID、用户昵称、友好显示名称等34中信息,通过https://api.weibo.com/2/friendships/friends.json接口可以获取到授权用户的相关信息数据[13],其中主要数据如下表所示:

微博开放接口限制每段时间只能请求一定的次数。限制的单位时间有每小时、每天;限制的维度有单授权用户和单IP;部分特殊接口,例如发微博接口有单独的请求次数限制[14]。微博开放接口技术原理上是一个HTTP轮询[15](polling)协议,不是即时推送(real time push)协议。因此即使增大刷新频率也无法完全达到即时获得最新信息效果,在实验中采用每调用100次API,程序休眠3min,防止调用上限。同时,为防止数据重复存储,在存储前进行了判断,有效地提高了数据存储效率[16]。程序结构流程图如图2所示。

使用微博API获取数据相对来说较为简单,但是由于官方限制,在持续获取数据的数据量较大时会有很大的波动,稳定性不高[17];同时,获取到数据的数量也受到的较大的限制,只能获取到最新2000条评论、转发等数据,价值不高。

3.3 通过微博手机版进行数据采集

微博手机版提供了一个登录页面,通过代码从手机版URL地址为https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F获取输入框,输入微博账号、密码实现模拟登录,模拟登录后可进行数据爬取。https://m.weibo.cn/中提供了一系列可以获取到微博相关数据的URL,如https://m.weibo.cn/api/comments/show?id=WeiboId&page=Page等,通过这些页面可以获取到较为全面的微博评论、转发内容的json格式数据。以下是通过https://m.weibo.cn/api/comments/show?id=4122617462491844&page=5获取到的某条微博的评论列表数据:

{ "ok":1,

"msg":"数据获取成功",

"data":[{

"id":4123269881409570,

"created_at":"今天 15:13",endprint

"source":"红米2",

"user":{

"id":1828331790,

"screen_name":"梦想家壁虎",

"profile_image_url":"https://tva2.sinaim/…qgp5bmzyj2050050aa8.jpg",

"verified":false,

"verified_type":-1,

"mbtype":0,

"profile_url":"https://m.weibo...&featurecode=20000320"},

…}],

"total_number":1896,"max":190}

由于官方限制,不能频繁访问这些URL,否则会被微博官方封禁IP地址[18]。本方法中设置了每访问一次,休眠一秒,所以采集效率并不高。

4 实验及其结果分析

本实验分别使用几种不同的微博数据采集方式,采集了微博内容以及微博评论内容,对采集性能以及采集到的内容进行分析。

实验环境如表2所示:

4.1 采集数据速率

在网络正常、IP以及账号未被封禁的情况下,对模拟登录、微博API获取数据以及微博手机版三种方式采集到的微博id以及微博评论数如上图所示,可以看出通过新浪微博官方API采集数据相比其他两种更为快速。

4.2 采集内容数量

针对微博id为4144043707971889的微博,采集结果如表3所示:

模拟登录以及手机版能获取到全部的微博评论数据资源,而通过新浪微博API的方式只能获取当前用户已关注的用户微博,并且只能获取2000条以下的评论内容,价值不高。

4.3 采集数据性能

在经过大量测试后发现,对于三种方式而言,在保证账号以及IP不被微博官方屏蔽的前提下,数据采集方面的时间损耗主要取决于当时网络传输速度,数据处理总量。

对采集到数据的性能以及内容分析比较后可以得出下表:

5 结束语

新浪微博作为国内社交网站的佼佼者,为舆情分析等问题的研究提供了海量有价值的数据,如何获取这些数据极为重要[19]。因此,文中分析了模拟登录、微博API、微博手机版获取数据等三种微博数据采集方式,从采集速率以及数据完整性出发进行对比,发现了在采集微博评论时可以使用新浪微博API获取关注用户最新微博ID,使用模拟登录的方式针对这些ID获取对应微博评论,这种方式在保证数据完整性的前提下实现了采集速率的最大化。这些分析结果对政府引导正确的舆论和采取相应措施有所帮助,对企业做出正确的决策有一定的参考价值。

参考文献:

[1] 孙青云,王俊峰,赵宗渠,等. 一种基于模拟登录的微博数据采集方案[J].计算机技术与发展,2014,24(3):6-10.

[2] Lomborg S, Bechmann A. Using APIs for Data Collection on Social Media[M]. Routledge,an imprint of Taylor & Francis Books Ltd, 2014.

[3] 徐雁飞,刘渊,吴文鹏. 社交网络数据采集技术研究与应用[J].计算机科学,2017,44(1):277-282.

[4] Mccormick T H, Lee H, Cesare N, et al. Using Twitter for Demographic and Social Science Research: Tools for Data Collection and Processing[J]. Sociological Methods & Research, 2017, 46.

[5] 杜超利. 时空要素驱动的事件网页信息检索方法研究[D].南京师范大学,2013.

[6] 周中华,张惠然,谢江. 基于Python的新浪微博数据爬虫[J].计算機应用,2014,34(11):3131-3134.

[7] 刘衍珩,李飞鹏,孙鑫,等. 基于信息传播的社交网络拓扑模型[J].通信学报,2013,34(4):1-9.

[8] 田霏霏,沈记全. 基于用户影响力的微博数据提取算法[J].计算机应用与软件,2017,34(1):55-61.

[9] 时子庆,刘金兰,谭晓华.基于OAuth2.0的认证授权技术[J].计算机系统应用,2012,(3):260-264.

[10] 任敏,谷文林,华雪东.基于新浪微博的公交系统数据采集及分析[J].现代电子技术,2015,38(9):159-162.

[11] Mannix J, Wilkes L, Daly J. Pragmatism, persistence and patience: a user perspective on strategies for data collection using popular online social networks[J]. Collegian, 2014, 21(2):127-133.

[12] 卢体广,刘新,刘任任. 微博数据通用抓取算法[J]. 计算机工程,2014,40(5):12-16+20.

[13] Di Li. Sentiment Analysis on Weibo Data[A]. IEEE Beijing Section.Proceedings of 2014 IEEE Computers, Communications and IT Applications Conference (ComComAp)[C].IEEE Beijing Section:,2014:6.

[14] 廉捷,周欣,曹伟,等. 新浪微博数据挖掘方案[J].清华大学学报:自然科学版,2011,51(10):1300-1305.

[15] Goswami A, Kumar A. Challenges in the Analysis of Online Social Networks: A Data Collection Tool Perspective[J]. Wireless Personal Communications, 2017(3):1-47.

[16] 王桦. 基于广度优先的主题爬虫的设计与实现[D].复旦大学,2011.

[17] DONG Ri-zhuang, GUO Shu-chao. Design and Implementation of Web Crawler[J]. Computer Knowledge and Technology, 2014.

[18] Efthymiou D, Antoniou C. Use of Social Media for Transport Data Collection[J]. Procedia - Social and Behavioral Sciences, 2012(48):775-785.

[19] Kim Y, Huang J, Emery S. Garbage in, Garbage Out: Data Collection, Quality Assessment and Reporting Standards for Social Media Data Use in Health Research, Infodemiology and Digital Disease Detection[J]. Journal of Medical Internet Research, 2016, 18(2):41.endprint

猜你喜欢
网络爬虫数据采集
炼铁厂铁量网页数据获取系统的设计与实现
基于开源系统的综合业务数据采集系统的开发研究