【转载】新浪微博数据挖掘方案

来源:互联网 发布:golang init 函数 编辑:程序博客网 时间:2024/05/08 03:22
 
 
 
摘???? 要: 随着新浪微博用户群体的增长, 新浪微博的数据获取是微博研究首先需要解决的问题。
该文提出了基于新浪微博API 与基于页面解析的新浪微博数据获取方案。
程序逻辑控制API 调用方法与频率, 获取JSON 对象并解析实现高效数据获取。
同时将传统的网络爬虫结合网页解析技术结合API 同时使用, 解决了因API 接口开放不完善, 且因在返回结果数量上限与调用频率方面的限制, 导致不能有效实现新浪微博数据的全面获取的问题。
经过实验测试, 通过2套方案的结合可以实现新浪微博数据高效全面的获取。
 
关键词: 新浪微博; 新浪API; 数据检索; 网页解析
 
 
微博作为Web 2. 0 时代新生网络应用形式, 在最近几年中得到了迅猛的发展。新浪微博中一条用户状态限定280 字符的内容长度, 不但更适合现代社会快速生活节奏的需要, 而且也更方便用户通过移动通信终端上传和分享自己感兴趣的微博信息[ 1 ] 。
 
在美国, 微博网站Tw it ter 自2006 年创建以来[ 2 ] , 用户数量在近几年中突飞猛进, 其中2009 年T w it ter 的用户增长率达到2 565% , 是社交网站Faceboo k 与LinkedIn 增长率总和的10 倍[ 3] 。在中国, 已有14%的互联网用户开始使用微博, 而新浪微博的市场份额占有率接近87%, 是中国微博产业的主导力量[ 4] 。
 
微博的使用人群数量基数大, 状态信息更新频繁、信息传播迅速。并且微博平台媒介用户占有率相对集中, 因此基于微博数据的分析研究成为了十分值得关注的研究方向。HAN Ruix ia[ 5] 介绍了微博平台的特点与基本概念, KAN G Shulo ng [ 6] 针对新浪微博研究了其群体结构与度分布特征。
 
WANG Rui[ 7] 通过数据分析解释了用户好友数量与用户状态受关注程度之间的关系, 但其中并没有介绍数据来源, 而新浪微博API 仍处于测试阶段, 不但内容开放不全面, 而且查询结果返回最大数量与调用频率方面也存在诸多限制, 难以实现全面的数据获取。
 
周立柱等[ 8- 10] 提出了一套依赖网络爬虫抓取网页内容并根据一定的规则提取页面中的有用信息的思路, 但因为没有涉及登录模式, 因此也难以运用在新浪微博的数据获取过程中。因此, 如何实现新浪微博数据的全面高效获取, 成为了研究新微博的首要问题。本文提出利用新浪微博API与传统网页解析方案, 以实现新浪微博数据的高效抓取。
 
 
 
1 ???? 基于API 的数据获取
互联网络数据的获取通常是通过网络爬虫实现的。在一段网络爬虫程序中, 通过设定入口URL 地址, 程序按照一定的爬行策略将网页内容以文本文件的形式保存在本地存储系统中, 并提取网页中有效地
址作为下一次爬行的入口URL 地址, 直到爬行完毕或者满足既定爬行条件后程序终止。
相比网络爬虫,新浪微博的开放API 接口可以更加简洁的获取相应的数据, 为程序高效获取微博数据提供了保障。
 
1. 1 ???? OAUTH认证
使用新浪API 首先要解决的是用户认证问题。所谓认证是指用户在不向第三方透露自己的用户名密码的同时, 使第三方软件提供方申请获得该用户资源的授权。OA UT H 认证为用户资源的授权提
供了一个安全的、开放而又简易的标准, 被用于新浪微博API 的用户验证协议
 
过程如下:
 
1) 用户向新浪微博OAU TH 服务提供商申请应用, 获得应用专属App Key 和App Secret , 分别以HMAC-SHA1 算法对用户发出的请求进行数字签名。
 
2) 通过新浪微博开放平台获取RequestToken。未经服务器授权的Request Token 中包含了对应密钥、加密算法、发起请求的时间戳、随机字符串与版本号信息。
 
3) 向新浪微博服务器Request Token 授权地址发送请求, 服务器同意用户的请求, 并向其颁发未经用户授权的Oauth Token 与对应的Oauth Secret。
 
4) 将上一步得到的Token 与Secret 发给新浪微博用户授权地址申请Request Token 授权。
 
5) 授权后, 用户再向新浪微博Access Toke 地址发起请求, 将上步授权的Request To ken 换取成Access To ken。
 
6) 服务器同意用户请求, 并向其颁发通过新浪微博授权的Access To ken 与对应的密钥。
 
7) 用户将获得的授权的Access Token, 以基于http-header 的OAUTH 形式对请求进行签名,就可以获得软件对于用户身份资源的使用授权。
 
1. 2 ???? 新浪微博API
 
OAUTH 授权解决了程序访问API 的用户身份认证问题。
新浪API 可根据请求内容的不同, 返回特定的XML 或JSON 文件。
XML 作为一种跨平台的强结构性扩展标记语言, 因为所有的用信息都被对应的标签所标记,
 例如: 〈id〉1861021910〈/ id〉〈name〉Hugo〈/ name〉, 所以用户可以便捷地找出相应信息并理解其中内容。
本文的程序由JAVA 语言开发实现, 利用dom4j.jar 可以轻松实现XML文件的读取。
但是因为dom4j 对于XML的结构规范要求十分严格, 而微博中用户状态与信息可能包含一些用户自身偏好的个性化字符格式,这些字符导致程序将无法正确解析整个XML 文档, 因此采取JSON 返回方式具有更高的稳定性。
 
JSON 是一种轻量级的数据交换格式, 文件不具有明显的强结构特征, 如: { ???? id????: ???? 1861021910????,???? name????: ???? Hugo????} 。在复杂的JSON 对象中, 因为它不像XML 文件用规范的标签形式标记有效的内容, 虽然对于人来说较难整理, 但因为JSON 文件结构简单, 因此通过电脑分析JSON 文件具有强大的处理能力。
 
另外JSON 文件中因为不再具有用于标记内容属性的说明性标签, 所以JSON 文件相比XML 文件, 查询相同内容的返回文件更小, 因此更适合作为微博海量数据获取中的文件传输形式。
 
在新浪微博API 接口定义中, 如: http://api.t.sina.com.cn/statuses/followers.json?source=appkey&user_id=11051&count=100&cursor=1600  。
这个地址中, 
http://api.t.sina.com.cn 为新浪API 存放服务器地址, 
statuses/followers 为调用请求的具体方法, 
json? 表示返回的是JSON文件形式, 问号之后为传递参数。
appkey 是上述OAUTH 认证中用户第一步申请的专属App Key字符串; 
user_id 是所查询用户的数字ID; 
count=100 表示每一次查询最多返回100 条记录, 在新浪API 中这个数值最大为200, 缺省值为20; 
cursor= 1600 表示这一次查询从第1 600 条记录开始返回之后的100 条数据, 根据新浪微博API 调用限制,每次查询最大只能返回5000 条数据。
 
为了均衡服务器的负载, 通常API 服务商对用户的API 接口调用频率与查询范围也会根据用户权限的不同有所限制。
除了上述一次请求最多只能返回5000 个结果之外, 新浪微博API 对用户调用接口的查询次数也有限制。
普通授权用户每小时接口使用上限1000 次, 并且在程序运行中如果短时间内较多地调用API 接口, 虽然总次数并没有达到每小时的1000 次, 但因为在这段时间内调用高度频繁, 程序调用结果依然会返回403 错误, 即用户已达到API 使用上限。为了避免用户过高访问新浪API 接口, 程序必须通过线程控制API 访问频率,程序流程如图1 所示。
 
 
新浪微博数据挖掘方案 - dragonchen82 - 820716的博客-知识分享 向上的心!
 
 
???? 因为新浪微博的数据量是十分庞大的, 程序逻辑不但需要控制从什么地方开始抓取、在什么时候结束, 还需要了解程序已经处理过了哪些数据、还要处理哪些数据。数据抓取程序是一段需要长时间运
行的网络程序, 其中可能会因为各种意外而中止。
 
如果程序意外终止时, 没有记录程序到达的位置, 那么每一条可能引起重复记录的数据都要进行判断,这样则大大降低了程序的运行效率。因此程序初始化将待处理的信息放入队列, 每成功处理一条信息
再从队列中删除, 以保证所有数据不重复不遗漏得以高效处理。程序的线程用于控制API 的查询次数。通常每调用50 至100 次请求后, 程序将暂停数分钟以保证新浪API 对于用户的请求限制。数据
存储与API 查询是2 个独立的过程。因为每次API 查询请求可能返回0 至5 000 条消息记录, 对于一次查询返回的信息, 如果信息的条目太多则会占用较大的系统开销, 若太小则会浪费一次JDBC
建立的存储session。所以存储控制用来均衡程序每一次向数据库提交信息的数量, 保证JDBC 的高效存贮。
 
1. 3 ???? 新浪微博API 与SDK的比较
新浪SDK 是为方便微博API 调用而开发的一套软件开发包, 其中封装了从授权认证到数据获取与解析的各项功能。
SDK 是建立在API 基础上的集成与开发, 基于SDK 的工程可以大大降低程序开发的工作量。目前已开发并发布的SDK 包括支持JAVA、C++ 、PHP、PYTHON 等12 种不同计算机语言的版本。
但新浪微博作为一种新生网络应用, SDK 开发并不完善, 功能性与稳定性均不如API 表现出色。
另外, 因为主要微博服务提供商, 如美国的Twitter、中国的新浪等, 授权验证与API 调用形式是相同的, 唯一不同的只是API 请求发送地址的区别, 因此通过API 自行编写的程序, 不但可以灵活实现新浪微博开放A PI 接口的所有功能, 同时只需要修改API 调用地址与参数, 就可以实现其他微博平台数据的抓取与处理。
 
2 ???? 基于网络爬虫的页面解析
通过调用API 接口可以实现新浪微博数据的便捷抓取与解析, 但所有微博服务商都不会无条件将完整API 开放给普通用户, 因此使用API 的方式永远只可以解决微博数据获取中的一部分问题。
如在新浪微博中, 很多重要查询功能的API 是不开放的, 同时对于开放的API, 一条查询的返回结果数目上限为5000, 而往往那些拥有较大信息量的节点才是微博研究最关心的问题。
于是在API 之外,还需要引入网络爬虫与网页解析技术, 来获取更多的信息。
 
2. 1 ???? 新浪微博模拟登录过程
用户通过浏览器访问新浪微博是需要登录的。
通常浏览器可以自动获取保存在用户电脑中的cookie 并创建session, 实现用户登录信息在微博页面中的传递。
与API 的使用一样, 新浪微博服务器无法对一段计算机程序的访问创建对应session, 因此, 实现爬虫程序对于指定微博页面的正确抓取, 必须首先解决程序对于网页的模拟登录问题。
新浪微博的模拟登录过程, 是向服务器端以一定的格式发送经过Base64 编码加密的原始用户名与密码信息, 服务器从http-header 里包含的授权信息Authorization 中提取字符串并解密后得到原有用户名与密码, 实现程序对网页的模拟登录过程。
 
其中Base64 加密算法是模拟登录过程的关键问题,
 
Base64 加密过程如下:
 
1) 将原始字符串以ut f-8 编码格式转换为原始二进制字符, 其中8 b 代表一个字节。
2) 将原始二进制字符分组, 每3 字节一组, 如果剩余字符不足3 字节, 则空余位数补???? 0????。
3) 将每组3 字节24 位编码分为4 段, 每段前+ ???? 00????组成新的4 字节32 位编码。
4) 将每组32 位编码, 以每8 b 分段, 将每段8bit 字符转化为十进制数字。
 
通过Base64 编码表将对应数字转化成相应字符, 实现Base64 加密过程。
 
加密实例如图2 所示, Base64 编码见[ 11 ] 。模拟登录的描述过程如下:
code=username+:+passwordauth=Basic+Base64.encode(code,utf-8)
OpenConnection(url)
connection.setMethord(GET)
connection.setProperty(Authorization,auth)
InputStream=connection.getInputStrem()
将加密后的用户名密码, 在每一次请求连接时作为Authorizat ion 属性发送出去, 用InputStream获取请求返回的内容, 从而实现了整个登录流程。
原始字符串log原始二进制01101100 01101111 01100111转换后二进制00011011 00000110 00111101 00100111转换后十进制27 6 61 39加密结果b G 9 n
 
图2???? Base64 加密算法实例
 
2. 2 ???? 页面存储与数据处理
通过上节中InputStream 输入流, 可以取出指定URL 地址中的网页内容信息, 并将其以文本文件形式按一定的分类标准保存在本地存储系统中。
在新浪微博中相同种类页面的编码规则是一样的,
也就是说对于同种性质的页面, 只需要制定一套页面解析规则, 就可以处理属于这个分类的所有网页文件。
 
因为网页HTML 文件是一种不严谨的网页标记语言, 这会对网页信息的提取造成一定困难, 因此首先需要将不标准的HTML 语言转化为标准的DOM 树结构, 然后利用XPath 可以定位存放关键
信息的DOM 节点位置, 最后抽取XPath 特征节点中的内容。
 
在新浪微博用户搜索页面中, 生成DOM 树后所有有效信息均保存在属性( class) 为srch_main_con lf 的一对〈div〉节点中, 如用户名ID
信息uid = ???? 1726602xx x ???? 的相对地址为class =???? concernBox????的〈ul〉标签中第一个〈li〉标签中, 某〈a〉标签内的第3 个属性。
 
那么寻找这个uid 的相对路径为: //DIV[@class=srch_main_conlf]/UL[@class=concernBox]/LI[1]/DIV[1]A/IMG[Attributes(3)] 。
于是当找到了〈img〉标签中的第三个属性uid 后, 则取得了uid 的值。程序逻辑遍历这个DOM 树中的所有LI[ @ class= ????MIB_linedot_l???? ] 的节点, 便可以得到〈li〉节点中所有用户信息。
 
3 ???? 数据分析
测试机器为DELL R710 服务器, Intel XeonE5506 双核CPU, 2 GB 内存, 运行环境为Window sXP 平台下Eclipse3. 2, 程序由JAVA 开发实现, 接入网络为100MB 共享教育网专线。
 
3. 1 ???? 查询结果文件大小比较本文
 
提出了基于新浪微博API 与基于网页解析技术的2 套对比的新浪微博数据获取方案, 
其中基于API 的数据获取根据请求内容的不同可选择性返回XML 和JSON 文件。测试中首先人工选择100位好友不超过5 000 人的新浪微博用户, 以保证用户的所有数据均可以通过API 和网络爬虫正确获取。
 
表1 为这100 个用户的好友查询返回文件大小对比。
在测试中, XML 与JSON 是基于API 的查询结果, 因为基于API 与网络爬虫的两种数据获取方式无法做到时间上的完全同步, 因此程序结束时间点的差异导致程序返回的好友总数已在网络中产生了变化。
另外, 通过API 查询用户好友信息相比网络爬虫返回结果, 包括了更多的用户信息以及用户最新更新的一条状态。
因此可以看出相比网络爬虫方式获取数据, 新浪微博API返回文件大小更小, 且内容更丰富。而相对于同样基于API 查询的XML 返回方式, JSON 具有更高的返回效率。
 
新浪微博数据挖掘方案 - dragonchen82 - 820716的博客-知识分享 向上的心!
 
 
表2 为用户状态查询结果比较。
测试分别通过API 与网络爬虫方式获取用户最新发布的100 条微博信息。
通过返回文件大小对比可以发现, 因为网络爬虫所保留的原始H TML 文本文件中包含大量转义地址信息、Jav aScript 标签等内容, 因此通过网页解析用户状态效率远小于通过调用API 方式得到的用户状态信息。
而在基于API 的查询中,JSON 返回方式相比XML 同样具有更高的返回效率。
新浪微博数据挖掘方案 - dragonchen82 - 820716的博客-知识分享 向上的心!
3. 2 ???? 程序处理性能比较
测试中发现, 无论通过调用API 方式还是网络爬虫方式, 在原始数据采集方面的时间损耗主要取决于数据采集总量大小以及当时的网络状况与新浪微博服务器负载。
而对于数据下载量相同的一段任务, 在相似的时间, A PI 调用方式与网络爬虫方式可以近似看成是无差别的, 因此这里只考察程序对下载后数据的处理能力。
程序逻辑分别将通过调用API 方式与网页爬虫方式得到的包含534 618 个用户信息的原始XML、JSON 与HT ML 文本文件进行处理, 将处理结果保存在My SQ L 数据库中, 每存储10 000 条信息记录一次处理时间, 其中XML 方式处理时间为248 299 ms, JSON 方式处理耗时为209 372ms, 而网页方式处理耗时为552 876 ms, 具体结果如图3 所示。
新浪微博数据挖掘方案 - dragonchen82 - 820716的博客-知识分享 向上的心!
从图3 可以看出, 基于新浪API 的XML 与JSON 处理方式具有更高的程序处理能力, 其中JSON 处理性能最高
而基于网络爬虫的网页解析方式不但处理速度较慢, 而且处理数量相同的有效信息需要消耗更大的原始信息文档, 因此基于新浪微博API 的数据抓取相比基于网络爬虫的网页文件解析都更具优势。
 
3. 3 ???? 基于API 与网页解析方案的结合
基于新浪API 的数据抓取策略性能高, 但因为服务器限制所以不能获得完整数据集, 基于网页解析的数据获取方案可以获得最大的数据文本但效率低下。通常需要将两者结合起来, 以实现最佳数据
抓取效果。如在研究新浪微博用户受关注程度的问题上, 首先通过新浪API 收集了857 个用户信息与这些用户的共53 万条好友信息。因为API 调用返回上限限制, 程序选择通过基于网络爬虫的页面解
析方案抓取这857 个用户的所有微博状态信息, 并计算出每一条用户状态的平均转发率和回复率。
新浪微博数据挖掘方案 - dragonchen82 - 820716的博客-知识分享 向上的心!
其中: F 表示当前用户的好友数量; rre 与rrt 分别代表当前用户状态的平均回复与转发率; 
Fi 表示当前用户第i 个好友的好友数量, 因此Wre 与Wrt 为定义的用户评论好友权重与用户转发好友权重。
 
 
 
图4 代表了用户好友权重对于用户微博平均回转发次数的影响, 
 
图4a 横坐标为数据不完全统计时用户好友数量, 反应了用户好友数对于用户状态平均转发关系的影响; 
图4b 中横坐标为Wrt , 反应了数据完全统计时用户好友权重对于用户状态平均回复与转发数的影响。
新浪微博数据挖掘方案 - dragonchen82 - 820716的博客-知识分享 向上的心!
新浪微博数据挖掘方案 - dragonchen82 - 820716的博客-知识分享 向上的心!
从图4 可以看出, 结合了2 套方案获取的数据信息可以更好地描述用户好友权重与用户状态受关注程度之间的线性关系, 奠定了新浪微博用户分析研究的基础, 
因此2 套方案的结合可以为今后新浪微博的研究提供全面完整的数据保障。
 
4 ???? 结???? 论
本文提出了基于新浪微博开放API 与基于网络爬虫的页面解析2 套新浪微博数据挖掘方案。
在新浪微博API 调用的返回数据形式中, JSON 相比XML 方式返回效率更高、处理速度更快, 对于特殊字符的解析能力也更强, 是程序使用API 调用方式的首选。
与基于API 的数据获取相比, 基于网络爬虫的页面解析方案效率与性能相比API 都有明显差距, 还要解决额外的程序模拟登录问题。
但页面解析技术可以为今后的数据分析获取更加完整的数据集。
通过 套方案的结合可以实现新浪微博数据全面高效的抓取和解析, 从而为针对新浪微博的网络结构分析用户行为与群体特征分析网络话题发现跟踪与预测等研究提供了完善的数据保障。
 
 
感谢您对我工作的理解和支持!
 
2012-06-06 16:35:34

 
陈龙 
 
爱学教育 网络运营中心
 
爱学教育: http://www.ixueedu.com/
爱学论坛: http://www.ixueeduu.com/
 
腾讯QQ:   84047848
移动电话: 13911098189
新浪微博: http://t.sina.com.cn/dragonchen82  @陈龙1982
个人博客: http:/ggmmchou.blog.163.com
0 0
原创粉丝点击