微博用户信息采集分析系统设计与实现

2019-10-18 02:57张扬范岩夏玲玲
软件导刊 2019年9期
关键词:新浪微博网络爬虫数据分析

张扬 范岩 夏玲玲

摘 要:系统运用Python语言克服新浪微博反爬虫问题,使用Scrapy框架实现了高效、稳定的微博用户信息爬虫程序,全面获取用户在微博中的基本信息,并导入Neo4j图数据库和Echarts数据可视化库进行人物关系分析和挖掘。此外,系统针对微博中存在大量“网络水军”的现状设置了过滤选项,可以有效排除“网络水军”非正常行为对分析结果的影响。系统调试结果表明,系统能够实现对特定微博下转发、评论用户信息的实时、稳定、高效采集与分析,有效帮助人们从海量数据中提取复杂的关联关系,简洁、直观地分析微博用户之间的交互关系。

关键词:新浪微博;网络爬虫;模拟登录;数据分析

DOI:10. 11907/rjdk. 191139 开放科学(资源服务)标识码(OSID):

中图分类号:TP319文献标识码:A 文章编号:1672-7800(2019)009-0125-05

Design and Implementation of Microblog User Information

Acquisition and Analysis System

ZHANG Yang, FAN Yan, XIA Ling-ling,CHEN Jun-an,WANG Qin

(Department of Computer Information and Cyber Security, Jiangsu Police Institute, Nanjing 210031, China)

Abstract: An efficient and stable crawler system based on Scrapy for microblog user information acquisition and analysis is designed. In the system, by overcoming anti-crawler problem of Sina Weibo, it can obtain all basic profile information of microblog users. The obtained user information can be imported into Neo4j graph database and Echarts visual diagram to analyze and mine the relationship between users. Additionally, according to the current situation of a large number of Internet paid posters existed in Microblog, the system provides a filtering option, which can effectively eliminate the influence of abnormal behavior of paid posters on the analysis results. The debugging results show that the system can crawl and analyze user information for specific microblog forwarding and commenting to achieve the real-time, stable and effective performance. It can effectively help people extract complex relationships from massive data and analyze the interaction between Microblog users concisely and intuitively.

Key Words: Sina Weibo; network crawler; simulation login; data analysis

0 引言

随着自媒体时代的到来,社交网络服务(Social Network Service,SNS)已融入大众日常生活中。个人将自己的信息上传到各种各样的社会化媒体平台如微博、论坛、博客、在线社区、即时通讯软件(微信、QQ)、社交网站(Facebook、Twitter)等,通过社交平台管理自己的社交圈,由此造成大量社交数据在互联网上被公开。社交数据中汇聚了大量的用户关系数据和信息传播数据,有效提取出这些数据对于研究人类社会、经济等的潜在规律以及探索人类社会关系中的奥秘至关重要。

新浪微博作为国内最具影响力的社交平台之一,截至2018年12月,月活跃用户数已达4.46亿,蕴含着海量有价值的用户信息及社交关系数据。罗咪[1]通过模拟登陆抓取动态网页,设计了一个基于Python的新浪微博爬虫系统获取用户数据;张章学[2]对社交网络中的信息存储进行分析,构建了用户敏感数据获取模型,在获取用户个人信息基础上,利用好友列表获取其整个社交平台中用户的敏感数据。以新浪微博为例,研究发现用户所有敏感数据中,职业获取率最低;Tumasjan A等[3]对Twitter上的10万多条信息进行分析,发现Twitter上的情绪如与政客相关的积极和消极情绪,与选民的政治偏好密切相关;魏冬梅等[4]对Web信息获取方法、原理和关键技术进行研究,提出一种基于Python和相關库,结合模块化方法构建Web文本信息获取框架的策略。社交数据的获取与关系数据的存储和管理息息相关,张琳和熊斯攀[5]基于Neo4j图形数据库设计并实现了Linked-US社交网络平台,更好地管理和更新社交网络数据及其内在关系;Fan YH[6]将Scrapy与Redis相结合对原始Scrapy框架进行改进,设计了一个基于Web信息Scrapy框架的分布式爬虫系统。

本文以新浪微博为例,设计并实现一套基于Python的用户信息采集系统,可以实现模拟登录新浪微博,获取参与热点话题的微博用户信息,并利用Neo4j图形数据库存储及可视化展示用户关系。

1 微博数据获取方法

1.1 基于微博API的数据获取

新浪微博提供的API接口可以使开发人员高效、便捷地获取微博数据,用户在新浪微博开放平台注册成为开发者,通过Oauth2.0用户授权后即可在任意开发环境下根据具体需求获取所需微博数据[7]。尽管新浪微博提供的API已经比较完善,但还存在一些不足。一方面出于对用户隐私数据的保护,部分用户信息暂未支持API接口;另一方面新浪公司对API的调用频率进行了严格限制,致使数据采集速度欠佳,面对热点话题中“吃瓜群众”的爆发式增长,难以获取大量实时数据。

因此,通过微博的API接口进行数据采集虽然高效、便捷,但难以满足本系统对数据获取的实时性要求。

1.2 基于Python网络爬虫的数据获取

与新浪微博API相比,基于Python的网络爬虫利用程序模仿普通用户使用浏览器访问微博获取实时数据。网络爬虫技术的优势在于通过对网页源代码的解析,几乎可以获取所有网页展示信息,而且基于Python的网络爬虫获取数据没有速度限制,在理想状态下每小时可获取上百万条用户信息[8-10]。

实现该项技术的难点在于新浪微博官方对微博爬虫采取抵制态度,其反爬虫机制一直在不断完善,导致模拟登录过程中障碍重重;此外,对网页源代码的分析和构造请求也并不简单。本文将重点阐述系统设计与实现过程中如何应对反爬虫机制。

2 系统设计

2.1 模拟登录

模拟登录是本系统要攻克的第一个难题。模拟登录指让计算机模仿人工操作,以达到欺骗服务器的目的。本系统结合以下3种方式修改请求头以实现模拟登录。

(1)随机调用User-Agent。用户代理(User-Agent,UA)是指包含浏览器信息、操作系统信息等的一个特殊字符串头,服务器通过它判断当前访问对象是浏览器还是网络爬虫。系统中使用Python安装fake-useragent库,每次向该库请求时都会获得一个随机的User-Agent,伪装成不同浏览器,降低了被服务器辨认为网络爬虫的概率。

(2)建立并维护proxy代理池。当同一IP请求微博网页次数过多将出现414状态码,因此考虑获取代理网站提供的高速代理并建立代理池,每次请求随机抽取一个可用代理,伪装成不同地址,迷惑服务器。经筛选发现购买代理服务商提供的稳定、高可用优质IP价格昂贵,而部分代理服务商也提供免费的代理IP,但数量少且极易失效。针对免费代理极易失效的特点,本系统建立代理池,将刚获取的代理IP设为100分,每次根据分数高低依次检测代理IP,当检测到不可用时扣1分,分数低至阈值时直接从数据库移除,当检测到可用即设为100分,如图1所示。

本系统建立的代理池以免费IP为主,包括获取模块、储存模块、检测模块、接口模块,分别负责抓取各大代理商提供的免费高匿代理,以集合的形式将代理存入Redis数据库,定期检测代理的可用性和提供对外服务的接口。

从代理池可扩展性及数据库连接安全性考虑,代理池导入Flask轻量级Web应用框架,将数据库中存储的IP随机映射到Web端口,程序使用requests.get()方法即可获取IP,如图2所示。

(3)建立并维护Cookie池。Cookie是指某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据,一般在登录账号后即可使用浏览器自带的调试工具查看。在没有登录或同一账号访问频率过高的情况下,新浪微博极易出现403状态码。因此需要购买大量微博账号构建Cookies池,每次请求时随机获取一个Cookie。Cookies池包括生成、储存、检测、接口4个模块,虽然微博账号不会失效但生成的Cookie有效期一般只有2~4天,因此要及时剔除失效的Cookie并重新登录更新Cookie。

在获取Cookie的过程中有一个难点,即购买的微博账号安全等级较低使得每次登录微博均要输入验证码,不同接口验证码类型也不相同,包括短信验证码、图形验证码、四宫格滑动验证码等。本系统最终选择在https://passport.weibo.cn/signin/login站点登录并识别把握较大的四宫格滑动验证码,如图3所示。具体采用识别验证码的模板匹配方法破解微博登录验证码。微博验证码宫格只有4个,验证码样式最多4*3*2*1=24种。首先将24种验证码图片保存下来并设为模版,然后将登录微博时出现的验证码与模板进行匹配,当相似度超过阈值时就能得到为模版定义的拖动顺序,然后应用自动化测试工具Selenium模拟用户拖动操作即可。

2.2 数据抓取

为实现爬虫稳定、高效的运行,数据抓取模块使用当下最流行的Scrapy爬虫框架,其具有异步、并发、可扩展等优势,在单位时间内可达到较高的吞吐量[11-13]。本系统爬取的目标数据包括热门微博下参与评论、转发用户的基本信息及评论内容,具体通过以下3个模块实现。

(1)微博评论抓取。通过对新浪微博WAP站点的分析可知微博评论页面的url很简单[14]。如以“https://weibo.cn/comment/H4tkWk09n?page=2”为例,每条微博评论的url前半部分“https://weibo.cn/comment/”完全相同。url后半部分中“H4tkWk09n”是每條微博的唯一标识符,暂将其称为wid。url中“page=2”指当前评论的页数,每页包含10条评论,评论越多,评论页数越多。因此爬虫运行前只需获取微博的唯一标识符wid,构造出初始url如“https://weibo.cn/comment/H4tkWk09n?page=1”,每页爬完后修改page=page+1即可递归爬取直至页面中没有评论内容[15]。

评论页面的源代码并不复杂,如图4所示。每条评论的具体内容均在html的

标签内,用xpath语法“selector.xpath(‘//div[@class=“c” and starts-with(@id,”C”)])”可以提取出
标签中的所有内容,再依次分离出用户id、用户昵称、评论内容、获赞数、评论时间、评论内容。第一个标签中的“/u/1946624694”,其10位阿拉伯数字是每位用户的唯一标识符,可用正则表达式提取出来。该参数不仅要存储,还需要传入下一模块构建用户基本信息的url。

(2)微博转发抓取。微博转发抓取与微博评论抓取大致相同,页面url结构也基本类似,如“https://weibo.cn/repost/H4tkWk09n?page=2”,表示wid 为H4tkWk09n的微博转发的第二页,构造url递归爬取时可模仿评论部分。

查看网页源代码也可发现,每条转发的全部内容均在

标签中,用xpath可分别提取出用户昵称、转发内容、转发时间及发布工具。很明显,获取的时间格式并不规范,研究发现微博有3种不同的时间表示方式,由此编写时间规范化函数,如图5所示,统一将时间设为年月日时分的格式,方便后期数据存储与分析。

如图6所示,文本两次出现“//@”,其中“//@”指转发微博。“板刷在笆篱的马甲”转发“老方有腔调”的微博,“老方有腔调”转发“哈三五四青年二代”的微博,“哈三五四青年二代”前面没有“//@”则表示转发原微博。如果“哈三五四青年二代”是一层转发,那么“板刷在笆篱的马甲”即为原微博的三层转发。由此可添加“转发层级”属性,用于后期分析热点事件的传播深度。

(3)用户基本信息抓取。用户基本信息包括微博数、关注数、粉丝数、昵称、性别、地区、生日,少数用户还自己完善了简介、感情状况、认证信息、性取向等信息。本系统对每种信息都进行爬取,能获取到信息则存入数据库,无则以“/”填充。

上述信息需在两个页面中获取,如“https://weibo.cn/u/2672074571”中包括用户的微博数、关注数及粉丝数,“https://weibo.cn/2672074571/info”中则包含用户的其它基本信息,如昵称、性别、地区、生日等。不同用户基本信息页面url中改变的仅为uid(如2672074571)这一参数。在微博评论抓取中获得uid后即可导入构造url。两个页面源代码分别如图7和图8所示,第一个页面源代码仍较规范可用xpath提取,而第二个页面源码中的信息会因不同用户完善资料程度的不同有种类和数量上的差别,因此使用re正则表达式对每条信息分别匹配查找。

通过以上3个模块最多可获得一个用户的21条信息,本系统将这些能够获取的数据全部加以储存并根据需要提取不同数据进行相应分析。

2.3 数据存储与分析

(1)Neo4j图数据库。Neo4j是一个高性能的NoSQL图形数据库,它将结构化数据存储在网络图上而不是表中[16]。本系统将每个微博用户抽象为节点,将评论或转发关系抽象为两个节点之间的连边,利用Neo4j形象地展现出丰富的用户关系,有效提升复杂关系数据查询效率[17]。

(2)ECharts库。ECharts是一个使用JavaScript實现的开源图表库,可以流畅地运行在PC和移动设备上,底层依赖轻量级的Canvas类库 ZRender,提供直观、生动、交互丰富、可高度个性化定制的数据可视化图表[18-20]。根据不同需求,本系统可导入Pyecharts生成各种ECharts图表形象地展示数据。

3 系统优化

3.1 图形用户界面

由于每次采集热点微博下的用户信息时都需获取微博的唯一标识符wid,并手动填入config.py文件中,对本系统用户特别是没有开发经验的使用者而言十分不方便。因此,系统基于Tkinter库设计并实现了图形用户界面,如图9所示。用户只需在界面文本框中输入微博url或感兴趣的主题关键字,系统将输入的内容存入临时文件中,并经过预处理提取出wid传递给爬虫进行爬取。

3.2 水军识别

对爬取的热点微博中的用户数据进行分析发现,部分微博数据存在蹊跷。如图10所示,微博转发量为点赞量的27倍且高达千万,而多数微博呈现的规律为转发数远小于点赞数,如图11所示。原因显而易见,大多数人愿意给喜欢的微博随手点个赞而不是花费更多的时间转发到自己首页。鉴于微博的转发、点赞规则:一个账号可以转发某条微博无数次,却只能点一次赞,可以认为图10是大量用户多次转发同一条微博所致。查看可疑微博转发内容证实了这一点,如图12所示,多名疑似机器号的用户转发同一条微博时附带无意义的内容。进入这些疑似机器用户的主页也可发现,其存在等级低、粉丝少、多次转发相同微博、无原创微博等共性特征,由此可以判定这些具有类似共性特征的用户为“网络水军”。

在某些特定数据分析需求下,大量“网络水军”严重影响了热点微博下用户信息的分析结果,亟需对爬取的用户队列进行优化,识别并移除“网络水军”。考虑到“网络水军”没有社交圈,粉丝数几乎为零,设置系统在爬取时识别粉丝数小于n(n可以根据数据分析需求进行相应的设置,本系统中设置n=3)的用户并标记为“网络水军”,在用户分析时可以选择将这些“网络水军”过滤掉。

4 结语

新浪微博作为国内最有影响力的社交媒体平台,为舆情分析、社会关系挖掘等提供了海量有价值的数据,如何获取和分析这些数据尤为重要。为实时获取并分析特定微博下转发、评论用户相关信息,本文设计了基于新浪微博的用户信息采集分析系统。本系统克服微博反爬虫机制,利用Scrapy框架全面、高效地获取数据,爬取的信息实时传入Neo4j图数据库并可根据需求生成Echarts图表。实验结果表明,本系统具有针对性强、稳定性高、数据采集速度快、分析结果直观等优点,为用户关系研究提供了新方法。

参考文献:

[1] 罗咪. 基于Python的新浪微博用户数据获取技术[J]. 电子世界, 2018(5): 138-139.

[2] 张章学. 社交网络敏感数据获取方法研究[J]. 软件导刊, 2018, 17(3): 56-58.

[3] TUMASJAN A,SPRENGER T O,SANDNER P G,et al. Election forecasts with twitter: how 140 characters reflect the political landscape[J]. Social Science Computer Review,2011,29(4): 402-418.

[4] 魏冬梅,何忠秀,唐建梅. 基于Python的Web信息获取方法研究[J]. 软件导刊, 2018, 17(1): 41-43.

[5] 张琳,熊斯攀. 基于Neo4j的社交网络平台设计与实现[J]. 情报探索, 2018(8):77-82.

[6] FAN Y H,Design and implementation of distributed crawler system based on scrapy[C].  Chongqing, Peoples R China: 2017 3rd International Conference on Environmental Science and Material Application (ESMA),2017:25-26.

[7] 徐嘉成. 基于k-means聚类和TF-IDF的新浪微博舆情分析[D]. 鞍山:辽宁科技大学, 2016.

[8] 李琳. 基于Python的网络爬虫系统的设计与实现[J]. 信息通信,2017(9): 26-27.

[9] 谢克武. 大数据环境下基于Python的网络爬虫技术[J]. 电子制作, 2017(9): 44-45.

[10] 陈智,梁娟,谢兵,等. 新浪微博数据爬取研究[J]. 物联网技术, 2016(12): 60-63.

[11] 邓万宇,刘光达,董莹莹. 一种基于Scrapy-Redis的分布式微博数据采集方案[J]. 信息技术,2018(11): 59-62.

[12] 安子建. 基于Scrapy框架的网络爬虫实现与数据抓取分析[D]. 长春:吉林大学,2017.

[13] 樊海英. 基于Scrapy的分布式网络爬虫系统的设计与开发[D]. 北京:北京工业大学,2017.

[14] 赖敬之. 基于网络爬虫的新浪微博数据分析网站的建立[J]. 通讯世界,2018(2): 73-74.

[15] 雷程程,张岸,齐清文,等. 格網化的位置微博数据抓取与人群信息提取[J]. 测绘科学,2017,42(2): 125-129.

[16] 林启胜,王磊,周喜,等. 基于图数据库的文献检索方法优化与实现[J]. 微电子学与计算机,2017,34(10):63-67.

[17] 王红,张青青,蔡伟伟,等. 基于Neo4j的领域本体存储方法研究[J]. 计算机应用研究,2017, 34(8): 2404-2407.

[18] 黄雅莉,钟琪. 基于Ajax与Echarts的网页动态数据加载[J]. 科技资讯,2018(23): 34-37.

[19] 王子毅,张春海. 基于ECharts的数据可视化分析组件设计实现[J]. 微型机与应用,2016,35(14):46-48,51.

[20] 赵海国. Ajax技术支持下的ECharts动态数据实时刷新技术的实现[J]. 电子技术,2018(3):25-27,57.

(责任编辑:孙 娟)

猜你喜欢
新浪微博网络爬虫数据分析
炼铁厂铁量网页数据获取系统的设计与实现
浅析大数据时代对企业营销模式的影响
社交媒体平台医患关系报道特点研究