一种基于Scrapy-Redis的分布式微博数据采集方案
- 格式:pdf
- 大小:1.86 MB
- 文档页数:4
scrapy-redis实现爬⾍分布式爬取分析与实现本⽂链接:⼀ scrapy-redis实现分布式爬取分析所谓的scrapy-redis实际上就是scrapy+redis当中对redis的操作採⽤redis-pyclient。
这⾥的redis的作⽤以及在scrapy-redis的⽅向我在⾃⼰fork的repository(链接:)已经做了翻译(README.rst)。
在前⾯⼀篇⽂章中我已经借助两篇相关⽂章分析了使⽤redis实现爬⾍分布式的中⼼。
⼆分布式爬取实现1. 对scrapy-redis中⾃带example的分析在库的README中已经对example的使⽤做了说明,可是初步接触时执⾏example中的spider会存在⾮常多疑问。
⽐⽅,分布式体如今哪?是通过那⼏⽅⾯实现的?其次,在执⾏结果中⾮常难发现分布式的影⼦。
感觉就像两个spider在⾃⼰爬⾃⼰的东西。
对于第⼀种疑问。
我在翻译和标注scrapy-redis中settings.py已经做了说明。
⽽第⼆中疑问也是实现2中⾃⼰的example所要做的。
2. 更清晰验证scrapy-redis实现分布式的思路与编码实现。
(1)思路实现两个爬⾍,定义爬⾍A爬取的关键词bussiness下的全部链接(通过start_urls设定)。
爬⾍B爬取game下的全部链接。
观察⼆者同⼀时候执⾏时爬取链接的url,是各⾃范围的url还是⼆者的交集。
这样因为⼆者定义的爬取范围是不⼀致的。
通过爬取现象能够得出结果。
(2)实现代码放在了github的repo中()。
为了易于观察,设置DEPTH_LIMIT为1。
(3)现象与分析现象:能够发现。
⼆者是⾸先同⼀时候爬取单个关键词下的链接(⾸先爬取哪⼀个取决与先执⾏爬⾍的start_urls)。
完成后进⽽爬取还有⼀个关键词下链接。
分析:通过同⼀时候爬取单个关键词能够说明两个爬⾍是同⼀时候被调度的,这就是爬⾍的分布式。
scrapy-redis基本原理Scrapy-Redis是一个基于Scrapy框架的分布式爬虫解决方案,它利用了Redis作为分布式数据存储和消息队列,以实现多台机器上的爬虫协同工作。
在这篇文章中,我们将介绍Scrapy-Redis的基本原理和工作流程。
Scrapy-Redis的基本原理可以分为以下几个部分:1. 分布式爬虫架构,Scrapy-Redis利用了Redis的分布式特性,将爬虫的URL队列和爬取结果存储在Redis中,从而实现了多台机器上的爬虫协同工作。
这种架构可以大大提高爬取效率和可扩展性。
2. 基于Redis的队列管理,Scrapy-Redis使用Redis作为URL队列的存储和管理工具。
当一个爬虫节点需要获取新的URL进行爬取时,它会从Redis中的队列中取出URL进行处理。
这样不同的爬虫节点可以共享同一个URL队列,实现了分布式的URL调度。
3. 基于Redis的去重过滤,Scrapy-Redis还利用了Redis的集合数据结构来实现URL的去重过滤。
当一个URL被爬取过后,它会被加入到Redis的集合中,下次再遇到相同的URL时就会被过滤掉,避免重复爬取相同的页面。
4. 分布式爬虫的协同工作,Scrapy-Redis通过Redis的发布订阅功能实现了爬虫节点之间的通信和协同工作。
当一个爬虫节点获取到新的URL进行爬取后,它会将爬取结果发布到Redis的频道中,其他节点可以订阅该频道获取爬取结果,从而实现了分布式爬虫的协同工作。
总的来说,Scrapy-Redis利用了Redis的分布式特性和高效的数据结构,实现了一个高效的分布式爬虫解决方案。
它的基本原理包括分布式爬虫架构、基于Redis的队列管理、基于Redis的去重过滤和分布式爬虫的协同工作。
通过这些原理的应用,Scrapy-Redis可以实现高效的分布式爬取,并且具有良好的可扩展性和可维护性。
scrapy-redis实现分布式爬⾍⼀介绍原来scrapy的Scheduler维护的是本机的任务队列(存放Request对象及其回调函数等信息)+本机的去重队列(存放访问过的url地址)所以实现分布式爬取的关键就是,找⼀台专门的主机上运⾏⼀个共享的队列⽐如Redis,然后重写Scrapy的Scheduler,让新的Scheduler到共享队列存取Request,并且去除重复的Request请求,所以总结下来,实现分布式的关键就是三点:#1、共享队列#2、重写Scheduler,让其⽆论是去重还是任务都去访问共享队列#3、为Scheduler定制去重规则(利⽤redis的集合类型)以上三点便是scrapy-redis组件的核⼼功能#安装:pip3 install scrapy-redis#源码:D:\python3.6\Lib\site-packages\scrapy_redis⼆、scrapy-redis组件1、只使⽤scrapy-redis的去重功能#⼀、源码:D:\python3.6\Lib\site-packages\scrapy_redis\dupefilter.py#⼆、配置scrapy使⽤redis提供的共享去重队列#2.1 在settings.py中配置链接RedisREDIS_HOST = 'localhost'# 主机名REDIS_PORT = 6379 # 端⼝REDIS_URL = 'redis://user:pass@hostname:9001'# 连接URL(优先于以上配置)REDIS_PARAMS = {} # Redis连接参数REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient'# 指定连接Redis的Python模块REDIS_ENCODING = "utf-8"# redis编码类型# 默认配置:D:\python3.6\Lib\site-packages\scrapy_redis\defaults.py#2.2 让scrapy使⽤共享的去重队列DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"#使⽤scrapy-redis提供的去重功能,查看源码会发现是基于Redis的集合实现的#2.3、需要指定Redis中集合的key名,key=存放不重复Request字符串的集合DUPEFILTER_KEY = 'dupefilter:%(timestamp)s'#源码:dupefilter.py内⼀⾏代码key = defaults.DUPEFILTER_KEY % {'timestamp': int(time.time())} #2.4、去重规则源码分析dupefilter.pydef request_seen(self, request):"""Returns True if request was already seen.```Parameters----------request : scrapy.http.RequestReturns-------bool"""fp = self.request_fingerprint(request)# This returns the number of values added, zero if already exists.added = self.server.sadd(self.key, fp)return added == 0```#2.5、将request请求转成⼀串字符后再存⼊集合from scrapy.http import Requestfrom scrapy.utils.request import request_fingerprintreq = Request(url='')result=request_fingerprint(req)print(result) #75d6587d87b3f4f3aa574b33dbd69ceeb9eafe7b#2.6、注意:- URL参数位置不同时,计算结果⼀致;- 默认请求头不在计算范围,include_headers可以设置指定请求头- ⽰范:from scrapy.utils import requestfrom scrapy.http import Request```req = Request(url='?name=8&id=1',callback=lambda x:print(x),cookies={'k1':'vvvvv'})result1 = request.request_fingerprint(req,include_headers=['cookies',])print(result)req = Request(url='?id=1&name=8',callback=lambda x:print(x),cookies={'k1':666})result2 = request.request_fingerprint(req,include_headers=['cookies',])print(result1 == result2) #True```2、使⽤scrapy-redis的去重+调度实现分布式爬取View Code3、持久化#从⽬标站点获取并解析出数据后保存成item对象,会由引擎交给pipeline进⾏持久化/保存到数据库,scrapy-redis提供了⼀个pipeline组件,可以帮我们把item存到redis中#1、将item持久化到redis时,指定key和序列化函数REDIS_ITEMS_KEY = '%(spider)s:items'REDIS_ITEMS_SERIALIZER = 'json.dumps'#2、使⽤列表保存item数据4、从Redis中获取起始URLscrapy程序爬取⽬标站点,⼀旦爬取完毕后就结束了,如果⽬标站点更新内容了,我们想重新爬取,那么只能再重新启动scrapy,⾮常⿇烦scrapy-redis提供了⼀种供,让scrapy从redis中获取起始url,如果没有scrapy则过⼀段时间再来取⽽不会关闭这样我们就只需要写⼀个简单的脚本程序,定期往redis队列⾥放⼊⼀个起始url。
Scrapy-Redis分布式爬虫与搜索网站构建-搜索引擎论文-图书档案学论文——文章均为WORD文档,下载后可直接编辑使用亦可打印——摘要:随着大数据时代的到来, 信息的获取与检索尤为重要。
如何在海量的数据中快速准确获取到我们需要的内容显得十分重要。
通过对网络爬虫的研究和爬虫框架Scrapy的深入探索, 结合Redis 这种NoSQL数据库搭建分布式爬虫框架, 并结合Django框架搭建搜索引擎网站, 将从知乎, 拉钩, 伯乐等网站抓取的有效信息存入ElasticSearch搜索引擎中, 供用户搜索获取。
研究结果表明分布式网络爬虫比单机网络爬虫效率更高, 内容也更丰富准确。
关键词:网络爬虫; Scrapy; 分布式; Scrapy-Redis; Django; ElasticSearch;Abstract:With the advent of the era of big data, the acquisition and retrieval of information is particularly important.How to get the content we need quickly and accurately in massive data is very important.Based on the study of web crawler and in-depth explorationof crawler framework Scrapy, a distributed crawler framework is constructed by combining with the NoSQL database of Redis, and a search engine website is constructed by combining with Django framework.The effective information collected from websites like zhihu, drag hook and bole is stored into the ElasticSearch search engine for users to search and obtain.The results show that the distributed network crawler is more efficient than the single network crawler, and the content is more abundant and accurate.Key words:web crawler;Scrapy;distributed;Scrapy-Redis;Django;ElasticSearchKeyword:web crawler; Scrapy; distributed; Scrapy-Redis; Django; ElasticSearch;1 引言爬虫的应用领域非常广泛, 目前利用爬虫技术市面上已经存在了比较成熟的搜索引擎产品, 如百度, 谷歌以及其他垂直领域搜索引擎, 这些都是非直接目的的;还有一些推荐引擎, 如今日头条, 可以定向给用户推荐相关新闻;爬虫还可以用来作为机器学习的数据样本。
(19)中华人民共和国国家知识产权局(12)发明专利申请(10)申请公布号 (43)申请公布日 (21)申请号 201610466951.7(22)申请日 2016.06.22(71)申请人 广东亿迅科技有限公司地址 510635 广东省广州市天河区中山大道109号1号楼13层(72)发明人 余虎 潘嘉朋 张郭强 徐少强 (51)Int.Cl.G06F 17/30(2006.01)(54)发明名称一种分布式爬虫系统及其实现方法(57)摘要本发明公开了一种分布式爬虫系统,该系统包括页面采集模块、目标url采集模块、调度监控模块和存储目标url队列模块。
该系统通过增加了一个调度节点,把爬取逻辑和监控逻辑分离,并对全局调控,一旦发现主爬虫节点出现异常,马上分配另一新节点取代为主节点。
另外,本发明把缓存目标url队列改为持久化存储目标url队列,同时增加一个已处理url队列,对于所有的爬取需求,url统一存放。
此外,本发明还提供了一种分布式爬虫系统的实现方法。
通过本发明能够适时地调控,增强系统的健壮性,同时也节省资源,增强爬虫的效率。
权利要求书1页 说明书4页 附图3页CN 106021608 A 2016.10.12C N 106021608A1.一种分布式爬虫系统,其特征在于,所述系统包括:页面采集模块、目标url采集模块、调度监控模块和存储目标url队列模块;页面采集模块,其通过从目标url队列提取信息,提取成功后目标url插入已处理url队列,采集到的信息存储到mongodb集群;目标url采集模块,通过主爬虫获取符合已定义规则的url,并把该url压入目标url队列;调度监控模块,贯穿整个系统,与每个模块都直接联系,并监控爬虫状态信息和集群状态信息;存储目标url队列模块,包括两个队列:目标url队列和已处理url队列。
2.根据权利要求1所述的系统,其特征在于,所述调度监控模块中的调度节点,把爬取逻辑和监控逻辑分离,并对全局调控,一定发现主爬虫节点出现异常,马上分配另一新节点取代为主节点。
第39卷湖北师范大学学报(自然科学版)Vol 39第3期JournalofHubeiNormalUniversity(NaturalScience)No 3ꎬ2019基于Scrapy的分布式数据采集与分析以知乎话题为例李光敏1ꎬ李㊀平2ꎬ汪㊀聪1(1.湖北师范大学计算机科学与技术学院ꎬ湖北黄石㊀435002ꎻ2.黄冈师范学院数学与统计学院ꎬ湖北黄冈㊀438000)摘要:随着互联网技术的飞速发展和网络数据的急速增长ꎬ如何对海量数据进行快速有效地采集和分析已经成为大数据分析与应用领域中亟待解决的重要问题ꎮ基于Scrapy框架实现主从式结构的分布式网络爬虫ꎬ运用开源项目Scrapy-Redis来部署网络爬虫ꎬ继而完成对知乎网站话题的爬取与分析工作ꎬ共爬取44346个话题㊁94688个回答和31202个用户数据ꎬ并从话题㊁回答㊁用户这三个方面应用可视化技术进行多维度分析ꎮ结果表明ꎬ开放式网络问答社区的话题主题与网络用户性别㊁地理位置分布及专业背景等因素具有显著的线性相关关系ꎮ该方法可推广应用于自动模式识别㊁网络舆情预测等大数据应用领域ꎮ关键词:Scrapyꎻ分布式ꎻ数据分析ꎻ知乎中图分类号:TP391.1㊀㊀文献标识码:A㊀㊀文章编号:2096-3149(2019)03-0001-07doi:10.3969/j.issn.2096-3149.2019.03.001进入21世纪以来ꎬ互联网发展得越来越快ꎮ根据中国互联网络信息中心CNNIC于2018年1月31日发布的第41次«中国互联网络发展状况统计报告»的数据显示: 到2017年12月为止ꎬ我国上网人数已经达到7.72亿ꎬ较去年共新增上网人数4074万人ꎻ用手机上网的人数突破7.5亿ꎬ与2016年相比共增加了5734万人[1]ꎮ互联网发展的势头越来越迅猛ꎬ数据量呈指数级爆炸式增长ꎬ这些海量的信息包含了各种不同类型的数据ꎬ并且以不同的格式分散存放在互联网世界的每个角落ꎮ互联网就像一个无比巨大的数据库ꎮ为了安全有效㊁准确无误地获取我们需要的数据诞生搜索引擎ꎮ搜索引擎通过从网络中获取数据生成关键字㊁索引ꎬ且建立了数据库ꎻ当上网者需要对某个关键词进行搜索的时候ꎬ搜索引擎就会到数据库中去查询ꎬ并把查询的结果展现到用户的面前[2]ꎮ网络爬虫在其中主要是用来对网上的数据进行搜集整理ꎬ为了提高效率引入了分布式技术ꎮA.Rungsawang和N.Angkawattanawit[3]发展了一种具备自主学习能力网络爬虫框架ꎬ可以通过渐进的方式连续爬取更多相关网页ꎮA.Bonato等[4]考虑了一个复杂网络爬虫的简化模型ꎬ在模型中爬虫以待访问节点权重为决定遍历时优先顺序的依据ꎬ从而建立了一种效率更高的数据采集方法ꎮG.Baldassarre等[5]将社交网络的概念融入到物联网中ꎬ提出了多物联网(MIoT)的概念ꎬ并发展出针对多物联网的性能优异的爬虫工具ꎮ本文主要内容是基于Scrapy框架分布式爬取知乎话题及数据分析ꎮ对网络爬虫的原理进行相关研究ꎬ以及如何实现分布式来提高爬虫的效率ꎬ最后对获取到的数据进行相关分析ꎮ1㊀Scrapy分布式框架设计1.1㊀Scrapy框架结构收稿日期:2019 03 02基金项目:湖北省教育厅科研计划重点项目(D20172502)作者简介:李光敏(1979 ㊀)ꎬ男ꎬ湖北十堰人ꎬ副教授ꎬ研究方向为自然语言处理.通讯作者:李㊀平(1979 ㊀)ꎬ男ꎬ湖北黄冈人ꎬ副教授ꎬpingfan@hgnu.edu.cn.1Scrapy框架结构如图1所示ꎬ总共由8个部分组成ꎬ主要包含以下组件:ScrapyEngine:该部分负责对整个框架所有组件之间的数据流进行控制ꎬ并在某些动作发生时触发相应的事务ꎮScheduler:接受ScrapyEngine传过来的Requestꎬ再按照排序传递给Downloaderꎬ同时该部分还要负责URL去重ꎮDownloader:该部分接受Scheduler传过来的Requestꎬ根据要求从互联网中下载网页内容ꎬ并将数据返回给SpidersꎮSpiders:由用户负责编写ꎬ用来解析请求网页后返回的数据ꎬ从中提取出Item和新的URLꎬ并把Item传给Itempipeline组件ꎮItemPipeline:当目标网页被爬虫获取后ꎬ解析生成的Item就会被发送到Pipelineꎬ然后进行相应的处理ꎬ比如输出数据㊁保存到数据库等等ꎮDownloaderMiddlewares:介于Engine和Downloader之间ꎬ主要功能是负责处理这两者之间的Re ̄quest和Responseꎬ用户也可以根据自己的需要来编写自己的中间件ꎮSpiderMiddlewares:位于ScrapyEngine和Spider之间ꎬ负责对爬虫的输入和输出进行处理ꎮSchedulerMiddlewares:介于Scrapy引擎和调度器之间ꎬ用来对ScrapyEngine发送到网站的请求与响应进行处理ꎮ图1㊀Scrapy框架结构图1.2㊀Scrapy-Redis结构Scrapy-Redis将Scrapy框架与Redis数据库结合起来实现了分布式爬虫ꎻ它通过把Scrapy框架中的Request队列ꎬ存入Redis数据库中ꎬ然后再分配给各个爬虫进行爬取ꎮScrapy-Redis主要由以下六个模块组成:Connection:该模块引入了Python的Redis库ꎬ以此来对Redis数据库进行各种操作ꎬ其它几个模块连接数据库都通过调用Connection模块ꎮDupefilter:这个模块重写了Scrapy自带的判重机制ꎬ利用set数据类型来存储每一个Request的fingerprintꎮ对于新的Requestꎬ将其fingerprint插入set中ꎬ若返回值为0ꎬ则说明该fingerprint已经存在ꎬ否则这个Request没有重复ꎬ并加入Request队列中ꎬ等待调度ꎮQueue:这个模块定义了三种队列来对Request进行调度ꎬ分别是栈㊁队列和优先级队列ꎮ本项目采用队列的形式ꎬ利用其先进先出的特点便于将最先请求的Request分配给爬虫获取数据ꎮPipeline:与Scrapy框架中的ItemPipeline类似ꎬ它可以将各个爬虫所传过来的Item存储到Redis数据库中ꎮScheduler:该模块重写了Scrapy的Scheduler类ꎬ它通过Redis来存储数据ꎬ对各个Spider进行统一调度ꎮSpider:这个模块通过connection模块ꎬ给爬虫绑定了信号ꎬ进而通过这个信号来掌握爬虫的状态ꎮ22㊀爬虫总体设计2.1㊀爬取对象本文实现的爬虫将以知乎网站的话题为爬取目标ꎬ爬取知乎的话题列表ꎬ然后将这些话题按照关注者的数量降序排列并选取前100个话题ꎬ再把这些话题下的精华回答爬取下来ꎬ同时获取这些回答的作者的相关信息ꎬ比如姓名㊁性别㊁学历㊁专业㊁粉丝数等等ꎮ2.2㊀总体架构本分布式爬虫采用主从式结构ꎬ这种结构的网络爬虫是由一个中心节点以及若干个爬虫节点构成ꎬ首先中心节点将任务分配给各个爬虫节点ꎬ然后各个爬虫节点再按照分配给自己的任务进行爬取[6]ꎮ具体架构由一个Master服务器和若干个Slave服务器组成ꎬ其中Master端安装Redis数据库ꎬ用来存储调度所有的请求ꎬ而Slave端只需安装Scrapy㊁Scrapy-Redis来搭建一个爬虫ꎬ访问Master端的数据库来获取请求ꎬ进而访问网页提取数据并存储到本机ꎮ整个爬虫系统按功能可划分为两个主要模块ꎬ分别是数据爬取和数据分析ꎮ数据爬取模块包括网页下载㊁信息提取㊁随机IP㊁随机UA和数据存储五个功能ꎻ数据分析模块则从话题㊁回答㊁用户这三个方面展开ꎮ总体架构如图2所示ꎮ㊀㊀㊀㊀图2㊀系统架构图㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀图3㊀知乎话题关注数量Top20分布2.3㊀分布式及数据存储利用Scrapy-Redis来实现分布式爬取ꎮ首先ꎬ整个分布式架构由一个Master服务器和若干个Slave服务器组成ꎬ其中Master端安装Redis数据库ꎬ用来维护爬取队列ꎬ而Slave端只需安装Scrapy㊁Scrapy-Redis来搭建一个爬虫ꎬ访问Master端的数据库来获取请求ꎬ进而访问相应网页提取数据并存储到本机ꎮ数据存储共分为三部分ꎬ分别是代理IP㊁网页链接和Item的存储ꎮ其中ꎬ代理IP与网页链接均存储在Redis数据库中ꎮ在Scrapy的pipelines.py文件中用户可以编写自己需要的存储方式ꎬ为了方便后期的数据分析ꎬ所有的Item均以csv格式存储ꎮ3㊀分布式爬虫实现3.1㊀爬虫的实现爬虫程序分为四个部分ꎬ分别为:items.py㊁spider.py㊁pipelines.py和settings.py四个文件ꎮitems.py文件中ꎬ利用Item类以及Field对象来声明一个数据对象用来存储从网页中提取的数据ꎮ该程序中定义了三个对象ꎬ分别为:话题㊁回答和用户ꎮspider包含list.py和topic.py两个文件ꎬ分别用来爬取话题数据与回答数据ꎮ这两个程序中均定义了start_requests()函数ꎬ和若干个解析网页的回调函数ꎬ比如parse_topic_info()㊁parse_children_topic()㊁parse_user()㊁parse_top()等函数ꎮ其中start_requests()函数用来发起初始请求启动下载ꎬ然3后调用这些回调函数来解析返回的数据生成Itemꎬ然后传给ItemPipelineꎬ并提交新的请求ꎮpipelines.py文件中定义了TopicPipeline()和TopAnswerPipeline()这两个类ꎮ它们都包含一个process_item()函数用来处理Itemꎬ其中前者用来保存话题Itemꎬ而后者用来保存回答Item和用户I ̄temꎬ且均以csv格式存储ꎮsettings.py文件中主要配置项如下:ROBOTSTXT_OBEY=FALSEꎬ指不遵循Robots协议DOWNLOAD_DELAY=1ꎬ指下载延迟为1秒DOWNLOAD_TIMEOUT=15ꎬ指下载超时时间最高为15秒DOWNLOADER_MIDDLEWARES={}ꎬ在这里添加自己定义的下载中间件ITEM_PIPELINES={}ꎬ在这里添加自己定义的Pipeline类3.2㊀代理池的实现1)存储模块的实现该模块使用Redis的有序集合来存储代理ꎬ集合里的每个元素都是不重复的ꎬ每个代理以IP加端口的形式存入数据库中ꎮ另外ꎬ有序集合的每个元素都有对应的分数字段ꎬ该集合会根据每个元素对应的分值对集合进行排序ꎮ对于我们存储的代理ꎬ分数可以作为判断代理是否可用的标志ꎬ100分为最高分ꎬ表示最可用ꎬ0分为最低分ꎬ表示代理不可用ꎬ且当分数减到0时从数据库中移除该代理ꎮ2)获取模块的实现Crawler()类中定义了若干个从免费代理网站爬取代理的方法ꎬ通过对代理页面进行解析ꎬ找到IP和端口的数据并返回给存储模块进行存储ꎮ3)检测模块Tester()类用来对所有爬取下来的代理进行循环检测ꎬ每个新获取的代理存储时分数都设为10分ꎮ当检测可用时ꎬ分数就直接设置为100分ꎬ若不可用ꎬ则分数减1分ꎮ4)接口模块我们可以使用Python的库Flask来实现这个接口模块ꎬ首先创建Flask对象ꎬ然后定义该对象的三个接口ꎬ分别是首页(显示一段文本来表明这是代理池的接口)㊁随机代理页(随机显示代理池中的IP和端口)㊁获取数量页(显示代理总数)ꎮ程序运行后ꎬFlask会启动Web服务ꎬ通过访问相应的接口即可获得可用代理ꎮ3.3㊀分布式爬虫的部署一台机器同时作为Master端和Slave端ꎬSlave端通过同时开启若干个爬虫进程来模拟ꎮ该机器安装Scrapy-Redisꎬ配置Redis服务端㊁客户端以及安装Scrapyꎮ在settings.py文件中添加Scrapy-Redis的参数配置如下:SCHEDULER="scrapy_redis.scheduler.Scheduler"DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"SCHEDULER_PERSIST=TrueSCHEDULER_QUEUE_CLASS='scrapy_redis.queue.FifoQueue'REDIS_URL='redis://127.0.0.1:6379'以上配置的意思为将Scrapy的调度器和判重类改为Scrapy-Redis的调度器和判重类ꎬ同时保持Redis数据库中的Request和Dupefilter不被清除ꎬ以便暂停和恢复爬虫ꎮ然后设置了使用先进先出的队列来调度请求ꎬ最后指定了Redis数据库的IP和端口ꎬ用来连接数据库ꎮ4㊀数据分析4.1㊀数据分析流程首先ꎬ我们通过Python的数据分析库Pandas的read_csv方法读取csv格式的数据文件ꎬ生成Dat ̄ 4aFrameꎻ然后ꎬ再对该DataFrame按照需要进行统计筛选ꎬ比如计数㊁排序等等操作[7]ꎮ其次ꎬ数据清洗ꎮ最后ꎬ对爬取并清洗后的大量数据进行可视化操作ꎮEcharts是由国内的百度公司在Github上开源的纯Javascript的图表库ꎬ提供直观ꎬ生动ꎬ可交互ꎬ可高度个性化定制的数据可视化图表ꎮPyecharts是运行于Python环境下ꎬ用于生成Echarts图表的类库ꎬ利用该类库可以非常方便地生成各式各样的Echarts图表ꎬ比如饼图㊁条形图㊁折线图等ꎬ便于清晰地展示业务数据的规律和趋势ꎬ对进一步挖掘数据背后的信息具有重要作用ꎮ4.2㊀话题数据分析图3为知乎话题关注数量TOP20分布ꎮ首先ꎬ从该图我们可以看出关注度最高的话题是电影ꎻ其次ꎬ像心理学㊁美食㊁旅行㊁阅读㊁健身等等话题的关注也比较靠前ꎬ这些都反映了人们普遍关注与生活息息相关的话题ꎬ更加注重精神上的愉悦ꎬ而不是物质上的愉悦ꎮ同时ꎬ我们可以注意到ꎬ互联网话题的关注度也在前十ꎬ也从侧面表明了在当今这个时代互联网已经越来越普及ꎮ图4为知乎话题活跃回答者数量TOP10分布ꎬ与图3相比较ꎬ我们发现部分话题有所重合ꎬ像心理学㊁电影㊁教育㊁互联网㊁法律㊁音乐等ꎬ说明关注度较高的话题相应的活跃回答者数量也比较高ꎮ同时ꎬ互联网这个话题的活跃回答者数量仅次于教育话题ꎬ位居第四ꎬ更加印证了互联网的热度ꎮ㊀㊀㊀图4㊀知乎话题活跃回答者数量Top10分布㊀㊀㊀㊀㊀㊀㊀㊀㊀图5㊀知乎话题精华回答年份分布4.3㊀回答数据分析图5为知乎话题精华回答年份分布ꎮ知乎过去是采用邀请制的注册方式ꎬ用户数量相对较少ꎬ直到2013年3月才开放注册ꎬ所以我们从图中可以看到2010年的精华回答数量是最少的ꎮ随着知乎的开放注册ꎬ精华回答的数量逐年递增ꎬ且增长速度也越来越快ꎬ同时这也说明知乎的用户数量也是逐年增加的ꎮ从图中发现2017-2018期间的精华回答数减少ꎬ是因为本文在2018年4月获取的数据ꎬ所以不包含2018全年的精华回答数据ꎬ我们可以预测到2018年年底ꎬ这100个话题的精华回答数量将达50000左右ꎮ图6为知乎话题精华回答字数分布ꎬ我们可以看出大部分精华回答都是长篇篇幅ꎬ其数量占到了精华回答总数的55.7%.短篇和中篇的数量加起来也不及长篇的数量ꎬ仅有极少数回答达到了超长篇ꎮ这些表明大部分知乎用户都倾向于书写长篇篇幅的回答ꎮ㊀㊀㊀图6㊀知乎话题精华回答字数分布㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀图7㊀城市-时间-回答数量分布图图7为城市-时间-回答数量分布图ꎬ单从城市这一轴来看ꎬ越是经济发达的城市ꎬ回答的数量也就越高ꎬ比如图中的北京㊁上海㊁深圳㊁广州这四座一线城市ꎮ而从时间这一轴来看ꎬ绝大部分知乎5用户集中在上午7点到晚上12点间使用知乎回答问题ꎬ这也符合人的正常作息时间ꎮ综合来看ꎬ除了美国存在时间差的问题ꎬ其余城市的用户回答问题的时间趋势大致相同ꎬ分别在中午11点前后ꎬ下午4点到5点以及晚上9点之后比较活跃ꎮ4.4㊀用户数据分析图8为知乎用户粉丝数量TOP20ꎬ我们可以看到粉丝数最高的是张佳玮用户ꎬ其粉丝数一共有1619930个ꎬ超过第二名丁香医生的粉丝数达到51万之多ꎮ我们可以发现接下来的几位用户分别是知乎的天使投资人李开复ꎬ知乎的联合创始人周源㊁黄继新和张亮ꎬ这也反映了知乎的用户们比较关注身为知乎创始人的动态ꎮ图9为知乎用户获赞数TOP20ꎬ与图5~6对比ꎬ我们可以发现有不少重叠的用户ꎬ比如张佳玮㊁丁香医生㊁yolfilm㊁vzch等用户ꎬ这也从侧面说明了粉丝基础决定获赞总数ꎮ而且张佳玮用户仍然名列第一ꎬ共计获得了4754459个赞ꎮ㊀㊀㊀图8㊀知乎用户粉丝数量Top20㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀图9㊀知乎用户获赞数Top20图10为知乎用户类型分布ꎮ2017年9月20号ꎬ知乎平台宣布完全开放机构号的注册ꎬ这些机构号将和普通用户一样分享自己认知范围内的知识㊁经验和见解ꎮ从图10中我们可以看出知乎主要还是普通用户居多ꎬ机构号仍然是少数ꎬ大约只占到总数的1.19%.图11为知乎用户性别分布ꎬ很明显ꎬ我们可以看到知乎男性用户最多ꎬ大约占据知乎用户总数的60%ꎬ而女性用户占了29.4%左右ꎬ只有男性用户数量的一半ꎮ当然ꎬ从图11中我们还能看到有一小部分用户并未注明自己的性别ꎮ㊀㊀㊀㊀㊀㊀㊀㊀㊀图10㊀知乎用户类型分布㊀㊀㊀㊀㊀㊀㊀㊀㊀㊀图11㊀知乎用户性别分布5㊀总结本文首先对网络爬虫的产生及其基本原理作了相关介绍ꎬ然后介绍了Scrapy框架的基本结构㊁工作原理和运行的基本流程ꎬ接着介绍了Scrapy-Redis的各个组件及其功能ꎬ阐述了分布式爬虫的设计与实现ꎬ并以知乎话题为爬取对象ꎬ对爬虫进行了相关测试ꎬ检验了分布式爬虫的效果ꎬ最后对获取的数据进行了相关分析且以图表的形式展现出来ꎮ虽然本文实现的分布式爬虫能达到基本要求ꎬ并成功地拿到了知乎话题的数据ꎬ但是仍然存在一 6些不足之处ꎮ一是自动化程度不够ꎻ其次ꎬ账号数量较少ꎬ限制了分布式爬虫的效率ꎻ再次ꎬ每个爬虫都只分配了一个固定的账号ꎬ容易导致账号流量异常ꎬ需要输入验证码才能解封ꎮ针对以上问题ꎬ在将来可以应用机器学习等先进的技术来实现验证码的识别ꎬ使爬虫变得更加智能化ꎻ同时可以使用更多的账号实现Cookies池ꎬ并随机分配给各个爬虫来更好地应对网站的反爬措施ꎮ参考文献:[1]中国互联网络信息中心.第41次中国互联网络发展状况统计报告[EB/OL].http://www.cnnic.net.cn/hlwfzyj/hl ̄wxzbg/hlwtjbg/201803/t20180305_70249.htmꎬ2018-03-05.[2]王㊀敏.分布式网络爬虫的研究与实现[D].南京:东南大学ꎬ2017.[3]RungsawangAꎬAngkawattanawitN.Learnabletopic ̄specificwebcrawler[J].JournalofNetworkandComputerApplica ̄tionsꎬ2005ꎬ28(2):97~114.[4]BonatoAꎬRMdelRío ̄ChanonaꎬMacRuryCꎬetc.Therobotcrawlergraphprocess[J].DiscreteAppliedMathematicsꎬ2018ꎬ247(1):23~26.[5]BaldassarreGꎬGiudicePLꎬMusarellaLꎬetc.TheMIoTparadigm:Mainfeaturesandan ad ̄hoc crawler[J].FutureGenerationComputerSystemsꎬ2019ꎬ92:29~42.[6]安子建.基于Scrapy框架的网络爬虫实现与数据抓取分析[D].吉林:吉林大学ꎬ2017.[7]李代祎ꎬ谢丽艳ꎬ钱慎一ꎬ等.基于Scrapy的分布式爬虫系统的设计与实现[J].湖北民族学院学报(自然科学版)ꎬ2017ꎬ35(3):317~322.DistributedcrawlinganddataanalysisbasedonscrapytakingZhiHutopicforexampleLIGuang ̄min1ꎬLIPing2ꎬWANGCong1(1.CollegeofComputerScienceandTechnologyꎬHubeiNormalUniversityꎬHuangshiꎬ435002ꎬChinaꎻ2.CollegeofMathandStatisticsꎬHuanggangNormalUniversityꎬHuanggangꎬ438000ꎬChina)Abstract:Withtherapiddevelopmentofinternettechnologyandfastgrowthofnetworkdataꎬhowtocollectandanalyzemas ̄sivedataquicklyandeffectivelyhasbecomeanurgentproblemtobesolvedinbigdataanalysisandcorrespondingapplication.Thispaperdeploysthedistributednetworkcrawlerwithmaster ̄slavestructurebasedonScrapyframeworktocompletethecraw ̄lingandtoanalysisofZhihu stopic.Atotalof44ꎬ346topicsꎬ94ꎬ688answersand31ꎬ202userdatahavebeencrawledꎬandcarriedonmultidimensionalanalysisgivenvisualchartfromfromtopicsꎬanswersandusers.Theresultofdataanalysisshowsthatthereisasignificantcorrelationbetweenthefocusedtopicsandsomefactorssuchasgenderꎬgeographicallocationandprofessionalbackgroundofnetworkusers.Themethodofdatacollectionandanalysisinthepapercanbepopularizedandap ̄pliedtoautomaticpatternrecognitionꎬnetworkpublicopinionpredictionandotherbigdataapplicationfields.Keywords:ScrapyꎻdistributedꎻdataanalysisꎻZhihu7。
Scrapy+Scrapy-redis+Scrapyd+Gerapy分布式爬⾍框架整合简介:给正在学习的⼩伙伴们分享⼀下⾃⼰的感悟,如有理解不正确的地⽅,望指出,感谢~⾸先介绍⼀下这个标题吧~1. Scrapy:是⼀个基于Twisted的异步IO框架,有了这个框架,我们就不需要等待当前URL抓取完毕之后在进⾏下⼀个URL的抓取,抓取效率可以提⾼很多。
2. Scrapy-redis:虽然Scrapy框架是异步加多线程的,但是我们只能在⼀台主机上运⾏,爬取效率还是有限的,Scrapy-redis库为我们提供了Scrapy分布式的队列,调度器,去重等等功能,有了它,我们就可以将多台主机组合起来,共同完成⼀个爬取任务,抓取的效率⼜提⾼了。
3. Scrapyd:分布式爬⾍完成之后,接下来就是代码部署,如果我们有很多主机,那就要逐个登录服务器进⾏部署,万⼀代码有所改动..........可以想象,这个过程是多么繁琐。
Scrapyd是专门⽤来进⾏分布式部署的⼯具,它提供HTTP接⼝来帮助我们部署,启动,停⽌,删除爬⾍程序,利⽤它我们可以很⽅便的完成Scrapy爬⾍项⽬的部署。
4. Gerapy:是⼀个基于Scrapyd,Scrapyd API,Django,Vue.js搭建的分布式爬⾍管理框架。
简单点说,就是⽤上述的Scrapyd⼯具是在命令⾏进⾏操作,⽽Gerapy将命令⾏和图形界⾯进⾏了对接,我们只需要点击按钮就可完成部署,启动,停⽌,删除的操作。
1. 创建Scrapy项⽬:()项⽬的结构如下:(这个项⽬⾥包含了多个spider,接下来,就以我圈出来的为例讲解)因为我这个需要⽤到固定的代理,在这个讲⼀下代理如何使⽤:代理在middlewares.py这个模块中的process_request⽅法中进⾏配置(如果想知道为什么在这⾥配置,可以去google⼀下scrapy框架爬⾍的整体结构流程),如下:然后在settings.py中指定具体的代理是什么:如 PROXY_URL='http://10.10.10.10:8080'2. Scrapy-redis分布式配置:1. ⾸先,确认Scrapy-redis库已经安装~未安装,可以 pip install scrapy-redis 进⾏安装。
㊀㊀文章编号: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。