基于微博API的分布式抓取技术
- 格式:pdf
- 大小:1.01 MB
- 文档页数:6
php获取新浪微博数据API的实例代码分享下php取得新浪微博数据API的一个例子,学习下在php编程中,使用新浪微博数据API进行开发的方法,感兴趣的朋友可以参考下。
php获取新浪微博数据API要取得新浪微博的数据,可以通过其提供的API,地址:open.weibo/wiki/API文档_V2。
获取数据的方法:复制代码代码示例:<?php/***通过新浪微博数据API取得微博数据*edit:jbxue*/functiongetWeiboData(){$count=15;//参数source后面输入你的授权号$url="api.weibo/2/statuses/home_timeline.json?source=12 3456789&count=".$count."&page=1";echo$url.'<br/>';$curl=curl_init();curl_setopt($curl,CURLOPT_URL,$url);//设置是否显示header信息0是不显示,1是显示默认为0//curl_setopt($curl,CURLOPT_HEADER,0);//设置cURL参数,要求结果保存到字符串中还是输出到屏幕上。
0显示在屏幕上,1不显示在屏幕上,默认为0curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);//要验*的用户名密码curl_setopt($curl,CURLOPT_USERPWD,"username:password" );$data=curl_exec($curl);curl_close($curl);$result=json_decode($data,true);echo'<pre>';print_r($result);echo'</pre>';}>说明:json_decode($data)会输出一个对象,而json_decode($data,true)则强制输出为数组。
1引言随着移动互联网的飞速发展,人们越来越多地在社交网络上发表自己的见解,分享自己的生活,与他人进行交流讨论。
新浪微博作为国内最大的社交平台之一,同时也成了各类消息发布的最主要渠道之一。
截至2017年9月,微博月活跃用户3.76亿,日活跃用户1.65亿,每天都有用户发布上亿条微博,评论、转发或点赞其他微博。
一个如此庞大和公开的社交平台,每天都能产生海量信息,能为各种舆情监控、商业推广分析、自然语言处理等系统提供大量的数据支持[1]。
在国外,开展了针对于Twitter和Facebook等社交平台的一系列研究,但是不同于国外的Twitter和Facebook等平台,微博官方并没有提供相关接口给人们下载与微博相关的数据集,并且微博的登录、浏览等操作都有较敏感的反爬虫机制,这给数据的采集带来了困难,对普通的想获取相关数据的人员来说是个极大的挑战。
因此,快速获得微博数据的方法就是构建一个稳定高效的爬虫抓取系统。
2网络爬虫2.1原理网络爬虫(Web Crawler),是自动地抓取万维网信息的程序或者脚本,它们被广泛用于互联网搜索引擎或其他类似网站。
爬虫一般分为数据采集、处理和储存三个部分。
传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL 放入队列,直到满足系统的一定停止条件。
2.2网络爬虫框架ScrapyScrapy是Python开发的一个快速、可扩展的Web抓取框架,用于抓取Web站点并从页面中提取结构化的数据。
通过Scrapy中的Spider模块,能方便地定义网址爬取和数据提取的规则。
3微博爬虫策略现在各种爬虫的搜索策略[2]主要为:深度优先搜索策略、广度优先搜索策略、非完全PageRank策略以及大站优先搜索策略。
微博跟其他普通网站相比,动态性和网页结构都比较复杂,其对于爬虫的防范也更加严格,普通的爬虫程序一般不能直接获取到相应的网页内容,但其网页内容中的数据格式较为统一。
大数据环境下的微博爬虫技术研究第一章前言随着大数据时代的到来,社交媒体平台中的数据量不断增加。
微博作为中国最大的社交媒体平台之一,包含着大量的用户数据和社交关系数据,成为了研究用户行为和信息传播的重要数据来源。
本文将围绕微博爬虫技术展开探讨,主要研究如何在大数据环境下高效稳定地爬取微博数据。
第二章微博爬虫概述微博爬虫是指通过程序自动化访问并获取微博数据的技术。
一般而言,微博爬虫需要实现以下功能:登录账号、搜索关键词、获取用户信息和微博内容等。
微博爬虫技术主要分为两大类:开放API爬虫和模拟登录爬虫。
前者是利用微博开放API接口进行数据获取,速度较快,但是API返回结果受到访问频率和数据量的限制。
后者需要进行模拟登录操作,可以获取更全面的数据,但是难度较大,容易被微博官方检测到。
第三章微博爬虫技术关键问题微博爬虫技术面临的关键问题主要包括反爬虫机制、数据量较大、访问频率限制等。
为了避免被微博官方封禁,需要采取反反爬策略,例如使用代理IP、设置访问间隔时间、调整访问顺序等手段。
此外,大量的数据量也给数据存储和处理带来了挑战,需要使用分布式存储和计算技术来提高效率。
第四章微博爬虫技术案例研究本章将介绍两个典型的微博爬虫案例:基于开放API的微博爬虫和基于模拟登录的微博爬虫。
前者主要运用了微博API提供的接口和数据格式,能够较为快速高效地获取微博数据。
后者则需要模拟登录操作,可以获取更全面的数据,但是也更具有挑战性。
第五章微博爬虫技术应用场景微博爬虫技术可以用于研究用户行为、社交网络分析、政治言论分析等多个领域。
例如,可以通过微博爬虫获取大量用户的社交关系数据,进而分析社交网络结构和特征;还可以结合NLP技术对微博文本进行情感分析和主题分类,从而研究公众舆情和政治言论动向等。
第六章微博爬虫技术未来发展方向随着大数据技术和云计算技术的不断发展,微博爬虫技术也会不断更新迭代。
未来的微博爬虫技术可能会更加智能化、自动化和实时化,从而更好地服务于用户需求。
基于微博数据的舆情分析及预测模型研究舆情分析是指通过对社交媒体上的舆情信息进行收集、整理和分析,从而了解公众对特定事件或话题的态度和情感趋势。
微博作为中国最大的社交媒体平台之一,拥有庞大的用户群体和丰富的信息资源,因此成为了研究舆情分析的重要数据来源。
本文将基于微博数据,探讨舆情分析的方法和预测模型。
一、微博数据的收集与整理微博数据的收集可以通过API接口进行,也可以通过网络爬虫技术获取。
对于大规模数据的收集,可以使用分布式爬虫框架进行加速。
收集到的数据需要进行预处理,包括数据清洗、去噪、分词等操作,以保证后续分析的准确性和效率。
二、舆情分析的主要方法1. 文本情感分析:通过对微博文本进行情感分类,判断其积极、消极或中性。
常见的方法包括基于词典的方法、机器学习方法和深度学习方法等。
词典方法依靠提前构建的情感词典进行词语情感打分,从而对整句的情感进行估计。
机器学习方法则是通过训练分类器,从已标注好的数据中学习情感特征,然后对未标注的数据进行情感分类。
深度学习方法则是通过神经网络模型提取文本的上下文特征,从而进行情感分类。
2. 主题挖掘:通过对微博文本进行聚类或关联规则挖掘,提取出微博数据中的热门话题或关键词。
主题挖掘可以使研究者更好地了解公众的关注点和讨论热点,从而更准确地预测舆情发展。
3. 社交网络分析:微博作为一个社交平台,用户之间的关注关系以及转发、点赞等行为会对舆情产生影响。
通过对微博用户之间的关系网络进行分析,可以揭示其对舆情的扩散和影响力。
网络分析方法包括社区检测、影响力评估等。
三、舆情预测模型舆情预测模型旨在根据历史数据的分析,预测未来舆情趋势。
常用的模型包括:1. 时间序列模型:通过对时间维度上的数据建模,来捕捉舆情的季节性或周期性变化趋势。
常见的时间序列模型包括ARIMA模型、指数平滑模型等。
2. 机器学习模型:通过对历史舆情数据进行特征提取和训练,来预测未来舆情的发展。
常用的机器学习模型包括支持向量机(SVM)、随机森林(Random Forest)等。
Python爬⾍爬取新浪微博内容⽰例【基于代理IP】本⽂实例讲述了Python爬⾍爬取新浪微博内容。
分享给⼤家供⼤家参考,具体如下:⼀般做爬⾍爬取⽹站,⾸选的都是m站,其次是wap站,最后考虑PC站。
当然,这不是绝对的,有的时候PC站的信息最全,⽽你⼜恰好需要全部的信息,那么PC站是你的⾸选。
⼀般m站都以m开头后接域名,所以本⽂开搞的⽹址就是 。
前期准备1.代理IP2.抓包分析通过抓包获取微博内容地址,这⾥不再细说,不明⽩的⼩伙伴可以⾃⾏百度查找相关资料,下⾯直接上完整的代码完整代码:# -*- coding: utf-8 -*-import urllib.requestimport json#定义要爬取的微博⼤V的微博IDid='1259110474'#设置代理IPproxy_addr="122.241.72.191:808"#定义页⾯打开函数def use_proxy(url,proxy_addr):req=urllib.request.Request(url)req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0")proxy=urllib.request.ProxyHandler({'http':proxy_addr})opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)urllib.request.install_opener(opener)data=urllib.request.urlopen(req).read().decode('utf-8','ignore')return data#获取微博主页的containerid,爬取微博内容时需要此iddef get_containerid(url):data=use_proxy(url,proxy_addr)content=json.loads(data).get('data')for data in content.get('tabsInfo').get('tabs'):if(data.get('tab_type')=='weibo'):containerid=data.get('containerid')return containerid#获取微博⼤V账号的⽤户基本信息,如:微博昵称、微博地址、微博头像、关注⼈数、粉丝数、性别、等级等def get_userInfo(id):url='https:///api/container/getIndex?type=uid&value='+iddata=use_proxy(url,proxy_addr)content=json.loads(data).get('data')profile_image_url=content.get('userInfo').get('profile_image_url')description=content.get('userInfo').get('description')profile_url=content.get('userInfo').get('profile_url')verified=content.get('userInfo').get('verified')guanzhu=content.get('userInfo').get('follow_count')name=content.get('userInfo').get('screen_name')fensi=content.get('userInfo').get('followers_count')gender=content.get('userInfo').get('gender')urank=content.get('userInfo').get('urank')print("微博昵称:"+name+"\n"+"微博主页地址:"+profile_url+"\n"+"微博头像地址:"+profile_image_url+"\n"+"是否认证:"+str(verified)+"\n"+"微博说明:"+description+"\n"+"关注⼈数:"+str(guanzhu)+"\n"+"粉丝数:"+str(fensi)+"\n"+"性别:"+gender+"\n"+"微#获取微博内容信息,并保存到⽂本中,内容包括:每条微博的内容、微博详情页⾯地址、点赞数、评论数、转发数等def get_weibo(id,file):i=1while True:url='https:///api/container/getIndex?type=uid&value='+idweibo_url='https:///api/container/getIndex?type=uid&value='+id+'&containerid='+get_containerid(url)+'&page='+str(i)try:data=use_proxy(weibo_url,proxy_addr)content=json.loads(data).get('data')cards=content.get('cards')if(len(cards)>0):for j in range(len(cards)):print("-----正在爬取第"+str(i)+"页,第"+str(j)+"条微博------")card_type=cards[j].get('card_type')if(card_type==9):mblog=cards[j].get('mblog')attitudes_count=mblog.get('attitudes_count')comments_count=mblog.get('comments_count')created_at=mblog.get('created_at')reposts_count=mblog.get('reposts_count')scheme=cards[j].get('scheme')text=mblog.get('text')with open(file,'a',encoding='utf-8') as fh:fh.write("----第"+str(i)+"页,第"+str(j)+"条微博----"+"\n")fh.write("微博地址:"+str(scheme)+"\n"+"发布时间:"+str(created_at)+"\n"+"微博内容:"+text+"\n"+"点赞数:"+str(attitudes_count)+"\n"+"评论数:"+str(comments_count)+"\n"+"转发数:"+str(reposts_count)+"\n")i+=1else:breakexcept Exception as e:print(e)passif __name__=="__main__":file=id+".txt"get_userInfo(id)get_weibo(id,file)爬取结果更多关于Python相关内容可查看本站专题:《》、《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家Python程序设计有所帮助。
㊀㊀文章编号:1009-2552(2018)11-0059-04㊀㊀DOI:10 13274/j cnki hdzj 2018 11 013一种基于Scrapy ̄Redis的分布式微博数据采集方案邓万宇ꎬ刘光达ꎬ董莹莹(西安邮电大学计算机学院ꎬ西安710121)摘㊀要:作为向网民展示世界和汇聚民意的重要渠道ꎬ微博正日益成为网络舆情的传播高地ꎮ如何对微博数据进行灵活高效地采集并存储ꎬ对后续的数据挖掘与分析工作起到重要作用ꎮ文中在分析新浪微博站点特征结构的基础上设计了一种局部最佳搜索策略ꎬ采用Python开源框架Scrapy搭配Redis数据库ꎬ设计实现了一套抓取速度快㊁定制性强㊁扩展性高的分布式爬虫系统ꎬ获取的数据具有良好的实时性和准确性ꎬ为后续工作提供了有力的数据支撑ꎮ关键词:Scrapy ̄Redisꎻ局部最佳搜索ꎻ分布式ꎻ微博数据采集中图分类号:TP391㊀㊀文献标识码:AAdistributedmicroblogdatacollectionmethodbasedonscrapy ̄redisDENGWan ̄yuꎬLIUGuang ̄daꎬDONGYing ̄ying(SchoolofComputerꎬXi anUniversityofPost&TelecommunicationsꎬXi an710121ꎬChina)Abstract:AsanimportantchannelfortheInternetuserstodisplaytheworldandgatherpublicopinionsꎬmicroblogisincreasinglybecomingahighgroundforthespreadofInternetpublicopinion.Howtocollectandstoremioroblogdataflexiblyandefficientlyplaysanimportantroleinthesubsequentdataminingandanalysis.Thispaperdesignsalocaloptimalsearchstrategybasedonanalyzingthefeaturestructureofweibo.comꎬusingthePythonopensourceframeworkScrapyandRedisdatabasetodesignandimplementadistributedcrawlersystemwithfastcrawlingspeedꎬhighcustomizationꎬandgoodscalability.Thecrawlersystemhasgoodreal ̄timeandaccuracydataꎬwhichprovidespowerfuldatasupportforfollow ̄upwork.Keywords:Scrapy ̄Redisꎻlocaloptimalsearchꎻdistributedꎻmicroblogdatacrawling收稿日期:2018-07-16基金项目:国家自然科学基金项目(61572399)ꎻ西安邮电大学研究生创新基金(CXJJ2017042)作者简介:邓万宇(1979-)ꎬ男ꎬ教授ꎬ硕士研究生导师ꎬ研究方向为数据挖掘㊁机器学习与知识服务ꎮ0㊀引言随着公众参与互联网的热情越来越高ꎬ微博用户的数量呈快速增长的态势ꎬ微博已经成为了网络舆情中最具影响力的传播载体之一ꎬ微博的发展引起了人们的广泛关注[1-5]ꎮ针对微博环境下的舆情分析需要大量的数据支撑ꎬ鉴于官方提供的API相关限制造成的数据获取困难ꎬ针对其开发一套专用的网络爬虫系统变得具有实际意义ꎮ目前国内外在网络爬虫领域已经有了很多研究[6-9]ꎮLarbin㊁Nutch㊁Heritrix等已经是比较成熟的网络爬虫项目ꎬ经过调研ꎬ发现它们在用户亲和性㊁分布式扩展㊁以及开发复杂度上存在着一些问题ꎮ综合考虑开发成本及工作比重ꎬ本着快速㊁简便㊁可配置的原则ꎬ为后续分析挖掘工作提供可靠的数据支撑ꎬ我们选择基于python开源框架Scrapy搭配基于内存的数据库Redis来开发一套部署方便㊁可定制性高的中小规模分布式网络爬虫来完成微博数据的采集工作ꎮ1㊀结构设计1.1㊀Scrapy ̄RedisScrapy是一款基于Python开发的开源web爬虫框架ꎬ可快速抓取Web站点并提取页面中的结构化数据ꎬ具有高度的扩展性和鲁棒性ꎮ而Redis作为一个基于内存的Key ̄Value数据库ꎬ以高性能著95称ꎬ其读写频率可以超105每秒[10-11]ꎮ通过周期性的把更新的数据或者把修改操作写入磁盘和写入追加的记录文件ꎬ实现了主从同步机制ꎮScrapy ̄Redis是使用Scrapy框架与Redis数据库工具组合实现的一个网络分布式抓取开源项目ꎮ其分布式体现在多个Spider同时工作时产生的URL及requests请求ꎬ将存入统一的RedisQueue队列ꎬ然后通过布隆过滤器BloomFilter去重ꎬ再分配给各爬虫进行抓取ꎮ其整体框架及内部运行流程如图1所示ꎮ图1㊀Scrapy ̄Redis框架结构及内部数据流首先ꎬSpider从Redis中获取初始URLꎬ引擎从Spider中获取初始爬取请求Requestsꎮ引擎安排请求Requests到调度器Scheduler中ꎬ并向调度器请求下一个要爬取的Requestsꎮ期间本地的Slave调度器会通过网络先将获取的Requests请求插入到Re ̄dis中ꎬ经过内部去重后ꎬ再从Redis获取一个Re ̄questsꎮ然后调度器将Requests返回给引擎ꎬ引擎将得到的Requests通过下载器中间件DownloaderMid ̄dlewares发送给下载器进行页面下载ꎮ一旦下载完毕ꎬ下载器会生成一个该页面的Response返回给引擎ꎮ引擎从下载器中得到该Response并通过爬虫中间件SpiderMiddlewares发送给Spider处理ꎮSpi ̄der处理Response并通过爬虫中间件SpiderMiddle ̄wares返回爬取到的Item以及新的Request给引擎ꎮ引擎将上步中Spider爬取到的Item发送给管道ItemPipelinesꎬ将新的Request继续发送给调度器ꎬ并向调度器请求可能存在的下一个要爬取的请求Requestsꎮ至此ꎬ循环执行上述步骤直至调度器中不再有更多的请求Requestsꎮ1.2㊀分布式架构采用主从式架构ꎬ有一台独立的Master服务器来负责管理待抓取的URL队列以及Requests请求ꎬ每次将URL分发至各个Slave客户端ꎬ然后由Slave客户端启动爬虫主程序对目标站点进行爬取ꎮ系统物理架构如图2所示ꎮ2㊀微博爬虫设计本文设计的微博爬虫是一类主题爬虫[12-16]ꎬ具图2㊀分布式物理架构有目标单一ꎬ布局较小ꎬ占用资源少等特点ꎬ只专注于解决微博领域的一些问题ꎮ通过分析微博站点结构ꎬ利用微博用户间的 关注 与 粉丝 关系ꎬ采用局部最佳搜索策略ꎬ实验证明抓取的数据带有一定的天然相关性ꎮ2.1㊀爬行策略设计本文在设计微博爬虫系统时ꎬ充分考虑了微博站点URL的结构特点ꎬ并在此基础上着重分析并利用了用户与用户之间ꎬ用户与博文之间的关联关系ꎬ设计了一种最佳优先爬行策略ꎬ能够引导爬虫抓取具有一定相关性的用户信息与微博内容数据ꎮ爬虫根据预先设定的一个或若干初始种子URL开始ꎬ直接访问并下载页面ꎬ经页面解析器去掉页面上的HTML标签得到页面内容ꎬ通过用户关注列表㊁粉丝列表获取新的目标用户IDꎬ经过字符串拼接ꎬ构造新的网页URL放入RedisQueue队列ꎬ期间经过去重和排序操作ꎮ然后将筛选通过的URL加入待爬队列进而供爬虫抽取进行下一步的下载和页面解析操作ꎮ此过程将一直循环执行ꎬ直到列表队列为空ꎬ则整个抓取过程结束ꎮ整个流程如图3所示ꎮ2.2㊀定义抓取对象微博页面中包含多种内容ꎬ通过定义Item来选择需要抓取的对象信息ꎮ我们定义了两种数据的字段信息如表1-2所示ꎮ表1㊀userinfo数据方法定义名称字段名称字段说明定义ItemUserInfoItemId用户IDNickName昵称Gender性别Location所在地区BriefIntroduction个人简介Birthday生日Authentication微博认证Tweets微博数Follower关注数Fans粉丝数06图3㊀基于用户ID的最佳爬行策略表2㊀tweets信息数据方法定义名称字段名称字段说明定义ItemTweetsItemWId微博IDContent微博内容IsTransfer是否为转发TransferReason转发理由Transfer转发数Like点赞数Comment评论数PubTime发表时间Tools设备来源2.3㊀编写Spider类区别于单机爬虫Spider类的编写ꎬ分布式Wei ̄boSpider是自定义编写的针对微博页面解析的Spi ̄der类ꎬ它不再继承原始的scrapy.Spider类ꎬ而是继承了RedisSpider类ꎬ用来从redis读取urlꎮ同样也不再使用start_urlsꎬ取而代之的是redis_keyꎬscrapy ̄redis将key从Redis中pop出来ꎬ成为请求的url地址ꎮ关键代码如下:redis_key= WeiboSpider.start_urlsʊSpecifytheinitialurladdressallowed_domained=[ https:ʊweibo.cn ]ʊAllowedcrawledpagerange爬虫正常启动进入到解析页面阶段ꎬ首先解析到的是用户的资料页面ꎬ使用Xpath获取页面标签中所有textꎬ添加以下代码:Infotext= :end .join(selector.xpath( body/div[@class= c ]ʊtext() )).extract()ʊGettotaluserpersonalinformation获取infotext后ꎬ再通过python正则表达式工具包re匹配获取拟定的用户个人信息数据ꎮ处理完个人信息页面后ꎬ使用yield返回请求Request分别指向三个urlꎬ即tweets㊁follow和fansꎬ基于当前用户ID使用callback回调函数分别执行三个不同页面的解析工作ꎬ代码如下:yieldRequest(url= https:ʊweibo.cn/u/{}?page=1 .format(ID))ꎬcallback=self.parse_tweetsꎬmeta={ baseitem :userinfoꎬdon t_filter=True}ʊGoingtorequestuserweibocontenthomepageyieldRequest(url= https:ʊweibo.cn/u/{}follow .format(ID))ꎬcallback=self.parse_relationshipꎬdon t_filter=True}ʊGoingtorequestuserfollowerpageyieldRequest(url= https:ʊweibo.cn/u/{}fans .format(ID))ꎬcallback=self.parse_relationshipꎬdon t_filter=True}ʊGoingtorequestuserfanspage在完成Spider类的编写后ꎬ需要在Scrapy的setting中配置连接参数ꎮ除去单机爬虫所需的基本的配置项外ꎬ实现分布式还需修改配置以下信息:SCHEDULER= scrapy_redis.scheduler.Scheduler ʊLoadingmiddlewareDUPEFILTER_CLASS= scrapy_redis.dupefilter.RF ̄PDupeFilter ʊLoadurlfilter2.4㊀数据存储Scrapy支持多种文本存储格式ꎬ比如jsonꎬcsv和xml等ꎮ此外Scrapy还提供了多种数据库的API来支持数据库存储ꎬ比如MySQL㊁MongoDB等ꎮ本文引入pymongo工具包ꎬ修改Pipeline文件实现了数据保存到MongoDB数据库当中ꎮ主要代码如下:启动爬虫时ꎬ初始化MongoDB连接:self.client=pymongo.MongoClient(self.mongo_url)ʊGetserveraddressandestablishconnectionsele.db=self.client(self.mongo_db)ʊConnecttothedatabase执行插入操作:self.db(self.userinfo.insert(dict(item))ʊInsertintouserinfotable16self.db(self.tweets.insert(dict(item))ʊInsertintotweetstable关闭爬虫同时关闭数据库连接:self.client.close()ʊClosetheconnection2.5㊀系统测试系统由三台物理节点组成ꎬ一台Master服务器ꎬ两台Slave服务器ꎮ由Master管理Url队列和分发下载任务ꎬ两台Salve同时下载网页提取数据ꎮ以新浪微博wap端作为抓取目标ꎬ运行8小时后ꎬ抓取用户信息34W项ꎬ微博1680W条ꎮ将抓取到的微博数据存储到基于分布式文件存储的MongoDB数据库中ꎬ为下一步的数据扩展应用提供一个可扩展的高性能数据存储解决方案ꎮ使用MongoDB可视化工具MongoBooster展示部分所获数据ꎬ如图4所示ꎮ图4㊀抓取的UserInfo存储在MongoDB3㊀结束语本文立足于快速㊁灵活抓取微博数据这一目的ꎬ设计实现了一套面向微博数据采集的高效分布式爬虫系统ꎮ采用Scrapy ̄Redis分布式设计思想对目标数据进行加速爬取ꎬ并通过对微博站点的结构分析ꎬ设计了一种适用于微博站点的爬虫爬行策略ꎬ使得获取的源数据带有一定的天然相关性ꎮ此外ꎬ还介绍了框架支持的多种持久化存储方式以及Mon ̄goDB数据库存储的具体实现ꎮ本文实现的分布式微博爬虫可为后续的微博数据挖掘与分析工作提供精准可靠的源数据支持ꎮ参考文献:[1]李洋ꎬ陈毅恒ꎬ刘挺.微博信息传播预测研究综述[J].软件学报ꎬ2016ꎬ27(2):247-263.[2]WangRuꎬSeungminRhoꎬChenBo ̄weiꎬetal.Modelingoflarge ̄scalesocialnetworkservicesbasedonmechanismsofinformationdif ̄fusion:SinaWeiboasacasestudy[J].FutureGenerationComput ̄erSystemsꎬ2017ꎬ74(C):291-301.[3]YuDing ̄guoꎬChenNanꎬRanXu.ComputationalmodelingofWeibouserinfluencebasedoninformationinteractivenetwork[J].OnlineInformationReviewꎬ2016ꎬ40(7):867-881.[4]BelaFlorenthalꎬMikeChen ̄HoChao.ACross ̄CulturalComparisonofaGlobalBrand sStrategiesonMicro ̄BloggingSites:SinaWeibo ̄vs.Twitter[J].InternationalJournalofOnlineMarketing(IJOM)ꎬ2017ꎬ6(4):54-72.[5]JiangꎬLeemanꎬFu.NetworkedFraming:ChineseMicrobloggersFramingofthePoliticalDiscourseatthe2012DemocraticNationalConvention[J].CommunicationReportsꎬ2016ꎬ29(2):1-13.[6]CarlosCastillo.Effectivewebcrawling[J].ACMSIGIRForumꎬ2005ꎬ39(1):55-56.[7]许笑ꎬ张伟哲ꎬ张宏莉ꎬ等.广域网分布式Web爬虫[J].软件学报ꎬ2010ꎬ21(5):1067-1082.[8]ChenXingꎬLiWei ̄jiangꎬZhaoTie ̄junꎬetal.DesignoftheDistribu ̄tedWebCrawler[J].AdvancedMaterialsResearchꎬ2011ꎬ201-204:1454-1458.[9]XieDong ̄xiangꎬXiaWen ̄feng.DesignandImplementationoftheTopic ̄FocusedCrawlerBasedonScrapy[J].AdvancedMaterialsResearchꎬ2014ꎬ850-851:487-490.[10]曾超宇ꎬ李金香.Redis在高速缓存系统中的应用[J].微型机与应用ꎬ2013ꎬ32(12):11-13.[11]GaoXiao ̄boꎬFangXian ̄mei.High ̄PerformanceDistributedCacheArchitectureBasedonRedis[M].SpringerBerlinHeidelberg:2014.[12]汪涛ꎬ樊孝忠.主题爬虫的设计与实现[J].计算机应用ꎬ2004(S1):270-272.[13]刘玮玮.搜索引擎中主题爬虫的研究与实现[D].南京:南京理工大学ꎬ2006.[14]ChenXiu ̄xiaꎬShangWen ̄qian.ResearchanDesignofWebCrawl ̄erforMusicResourcesFinding[J].AppliedMechanicsandMate ̄rialsꎬ2014ꎬ543-547:2957-2960.[15]ZhaoQiuꎬCengJunDaiꎬTaoLiu.DesignofThemeCrawlerforWebForum[J].AppliedMechanicsandMaterialsꎬ2014ꎬ548-549:1330-1333.[16]HuHꎬGeYJ.UsingWebCrawlerTechnologyforTextAnalysisofGeo ̄Events:ACaseStudyoftheHuangyanIslandIncident[J].ISPRS ̄InternationalArchivesofthePhotogrammetryꎬRemoteSensingandSpatialInformationSciencesꎬ2013ꎬXL ̄4/W3(4):71-78.责任编辑:丁玥26。
1引言近年来,社交网络的发展引人注目,参考文献[1]介绍了社交网络的发展现状及趋势。
目前,约有一半的中国网民通过社交网络沟通交流、分享信息,社交网络已成为覆盖用户最广、传播影响最大、商业价值最高的Web2.0业务。
微博作为一种便捷的媒体交互平台,在全球范围内吸引了数亿用户,已成为人们进行信息交流的重要媒介,用户可以通过微博进行信息记录和交流、娱乐消遣以及社会交往等[2]。
Twitter自2006年由Williams E等人联合推出以来,发展迅猛。
Twitter作为一种结合社会化网络和微型博客的新型Web2.0应用形式正风靡国外,其应用涉及商业、新闻教育等社会领域,已成为网络舆论中最具有影响力的一种[3]。
基于微博API的分布式抓取技术陈舜华1,王晓彤1,郝志峰1,蔡瑞初1,肖晓军2,卢宇2(1.广东工业大学计算机学院广州510006;2.广州优亿信息科技有限公司广州510630)摘要:随着微博用户的迅猛增长,越来越多的人希望从用户的行为和微博内容中挖掘有趣的模式。
针对如何对微博数据进行有效合理的采集,提出了基于微博API的分布式抓取技术,通过模拟微博登录自动授权,合理控制API的调用频次,结合任务分配控制器高效地获取微博数据。
该分布式抓取技术还结合时间触发和内存数据库技术实现重复控制,避免了数据的重复爬取和重复存储,提高了系统的性能。
本分布式抓取技术具有可扩展性高、任务分配明确、效率高、多种爬取策略适应不同的爬取需求等特点。
新浪微博数据爬取实例验证了该技术的可行性。
关键词:新浪微博;爬取策略;分布式爬取;微博APIdoi:10.3969/j.issn.1000-0801.2013.08.025A Distributed Data-Crawling Technology for Microblog APIChen Shunhua1,Wang Xiaotong1,Hao Zhifeng1,Cai Ruichu1,Xiao Xiaojun2,Lu Yu2(1.School of Computers,Guangdong University of Technology,Guangzhou510006,China;2.Guangzhou Useease Information Technology Co.,Ltd.,Guangzhou510630,China)Abstract:As more and more users begin to use microblog,people eagerly want to dig interesting patterns from the microblog data.How to efficiently collect data from the service provider is one of the main challenges.To address this issue,a distributed crawling solution based on microblog API was present.The distributed crawling solution simulates microblog login,automatically gets authorized,and control the invoked frequency of the API with a task controller.A time trigger method with memory database was also proposed to avoid extra trivial data duplication and improve efficiency of the system.In the distributed framework,the crawling tasks can be assigned to distributed clients independently,which ensures the high scalability and flexibility of the crawling procedure.The feasibility of the crawler technology according to Sina microblog instance was verified.Key words:Sina microblog,crawling strategy,distributed crawl,microblog API运营创新论坛1462010年国内微博迎来春天,微博如雨后春笋般崛起,四大门户网站均开设微博。
截至2012年12月底,新浪微博注册用户数已超过5亿,同比增长74%,日活跃用户数达到4620万,微博用户数与活跃用户数保持稳定增长,已经成为中国最大的移动社交网络。
社交网络大数据的分析和管理[4]吸引了许多人进行研究,通过对微博数据的挖掘,可以进行预测用户的爱好、预警热点新闻舆论、挖掘人际关系信息、预测信息传播趋势等有趣的研究。
成功地预测信息的传播可以提高市场的效益,促进商业产品的推广,也可以实时监控信息传播的新趋势。
不管是在商业上还是在政治上,都迫切需要数据采集以支持各种数据分析。
利用传统的网页爬虫[5]爬取数据需要大量时间解析网页,这种方式不但处理速度较慢,而且对数据的整合需要自己进行合理转换,不适合实时数据需求的系统。
而基于微博API的方法具有手动授权、接口限制等问题。
本文以舆情系统作为背景分析数据需求,提出基于微博API的数据抓取技术,以新浪微博为例,解决抓取过程中授权过期、接口约束、重复爬取等问题,制定合适的爬取策略,合理分配爬取任务和API。
采用分布式的爬取框架,可扩展性高,可以根据数据爬取需求合理增加或删减爬取机,而不必更改系统的框架。
2采集系统2.1采集目标本文主要从舆情分析角度分析数据需求,包括对用户和关键字的监控、预警、敏感词分析、用户情感分析。
在参考文献[6]中,微博消息的传播途径主要有:转发途径和粉丝途径,这意味着微博数据的爬取主要集中在用户关系图和转发关系图。
在微博消息传播中,用户、微博消息和用户关系是直接影响微博传播力的3个要素。
用户的行为包括对微博的转发、评论、回复、收藏等。
在这里,需要爬取微博的基本信息(转发和评论);抓取用户的基本信息(好友、粉丝、用户所发的微博和用户标签)。
2.2采集约束在基于微博API爬取信息的过程中,爬取的效率跟微博API约束有很大关联。
具体的API限制频率可以查看参考文献[7]。
由于API的约束,具体的爬取策略既要满足数据需求,又要克服这些约束利用有限的接口爬取更多的信息,需要对用户接口进行合理分配,也需要在程序中合理控制接口的调用情况,设计的爬取程序需要具有良好的容错能力,无论是access token的过期还是接口调用超过限制频次,在程序中都进行了很好的处理。
当access token过期时,会自动授权,然后继续爬取;当接口调用超过限制频次时,会让程序处于休眠状态直到接口恢复调用,继续爬取。
2.3采集准则根据微博API数据爬取的特点,提出如下爬取准则:用最少的接口爬取最多的信息,尽量避免重复,可扩展性强。
这里的“最少接口爬取最多信息”,是指合理安排接口的分配,尽量根据数据需求分配数据接口,避免重复爬取和存取数据。
另外,爬取的规模可以根据需求增加或减少,这要求系统的可扩展性强。
3采集系统设计3.1系统功能模块(1)公共微博爬取模块该模块调用微博API的读取接口statuses/ public_timeline,是整个爬取系统的入口,只有在公共微博爬取一定的用户信息和微博信息后,才可以进行后续用户维度和微博维度数据的爬取。
(2)用户维度爬取模块该模块主要调用微博API的用户信息相关接口。
在用户维度上,爬取信息主要是指抓取用户的关系图信息,从而建立起用户的关系图,这对信息的传播行为分析至关重要。
由于微博接口的限制,每次只能爬取200个用户和粉丝,这个数据对于后续的研究是远远不够的,所以用户关系图需要靠微博的转发关系进行扩展,假设用户A转发用户B的微博,则其存在转发关系。
(3)微博维度爬取模块该模块主要调用微博API的微博相关接口。
在微博维度上,爬取信息主要是指抓取微博的转发、评论信息,从而建立起微博的转发关系图。
对于每条微博,每次调用一次API只能爬取一层转发关系图,当一层关系图爬取足够多时,可以根据数据库里的信息建立多层转发图。
3.2系统框架爬取系统的整体框架如图1所示。
采用了分布式的架构并行爬取数据,分成两个主要部分。
①~④部分主要抓取最新的公共微博。
时间触发服务器在一定时间间隔上触发客户机抓取数据并将数据存入Hbase,将用户ID和微博ID存进内存数据库redis中。
redis主要有两个作用:一是进行ID存储,提供后续微博维147图1爬取系统的整体框架度和用户维度的爬取;二是进行重复控制,如果爬取到相同的微博或用户就不将信息存入Hbase。
(1)~(5)部分主要根据redis中用户ID和微博ID抓取其他信息,这里配置了一台task触发服务器,初始化时从redis获取ID,每次客户机通过thrift请求分配ID,task触发服务器响应请求将ID传给客户机进行爬取并将爬取后的信息存入Hbase。
整个框架的任务分工明确,可扩展性强,如果想要爬取更多用户信息,只需要增加爬取客户机向task触发服务器请求就可以,而不需要更改整个系统的框架。
4算法设计对于基于API数据的爬取,在很大程度上受限于接口约束和授权码过期等问题,如何设计合理的算法,在遵守准则的前提下克服以上约束,从而实现数据爬取的最优,是本文要解决的问题。
4.1算法分析(1)重复控制基于API爬取数据算法需要考虑如下几个问题。
第一,申请应用时接口有限,以新浪微博为例,每个应用只有15个测试用户,每个用户每小时只能爬取150次,也由于IP地址每小时1000次的限制,每小时只能有7个测试用户在一个IP地址上爬取1000次,用有限的接口爬取更多的信息,只有对接口进行有利地分配和调度,才能充分利用有限的接口爬取更多的数据信息,因此必须对爬取操作进行重复控制操作。
如果对某个接口,如公共微博的爬取接口statuses/public_timeline,接口调用频次超过公共微博的产生量,将导致接口很快被调用完,但爬取的数据很多是重复的,既浪费了接口,爬取的数据也少,违背了用最少的接口爬取更多数据的准则。
基于以上准则,数据爬取的重复控制需要做得很好,才能爬取更多的信息。