8.分布式爬虫框架

分布式爬虫框架

分布式爬虫框架分为两种:控制模式(左)和自由模式(右):
fig1
控制模式中的控制节点是系统实现中的瓶颈,自由模式则面临爬行节点之间的通信处理问题。因此,在实际工程中,我们通常使用混合模式:

  • 各个爬行节点有各自的功能(爬取的对象不同),它们都注册到一个服务节点上,服务节点能分辨各个爬行节点的分工,用户的请求存放在队列中,处理不同请求的程序从队列中取出请求,然后询问服务节点,由服务节点分配爬行节点给请求的处理程序。

下面介绍分布式爬虫框架的几个重要模块;

URL Manager:爬虫系统的核心。负责URL的重要性排序,分发,调度,任务分配。单个的爬虫完成一批URL的爬取任务之后,会找 URL Manager要一批新的URL。一般来说,一个爬取任务中包含几千到一万个URL,这些URL最好是来自不同的host,这样,不会给一个 host在很短一段时间内造成高峰值。

Content Acceptor:负责收集来自爬虫爬到的页面或是其它内容。爬虫一般将爬取的一批页面,比如,一百个页面,压缩打包成一个文件,发送给Content Acceptor。Content Acceptor收到后,解压,存储到分布式文件系统或是分布式数据库,或是直接交给 Content Parser(比如基于BS4写的脚本)去分析。

Proxy Manager:负责管理系统用到的所有Proxy,说白了,负责管理可以用来爬取的IP。爬虫询问Proxy Manager,得到一批 Proxy IP,然后每次访问的时候,会采用不同的IP。如果遇到IP被屏蔽,即时反馈给Proxy Manager,Proxy Manager会根据哪个host屏蔽了哪个IP做实时的智能的调度。

分布式爬虫其实和单机爬虫是一样的,只不过分布式爬虫把工作分配到不同的机器上执行,scrapy是用于单机爬虫的框架。

消息队列

分布式爬虫中节点的通信是一个重要问题,所以需要消息队列。

消息队列:消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。

消息队列封装了任意节点之间的通信路径。节点只需把消息发送到消息队列就做下一步工作,而不是关心是否成功发送到某个目标节点。

通过消息队列,应用程序可独立地执行–它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。通过消息队列,应用程序可独立地执行。

Redis和Scrapy-Redis

Redis是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Key-Value的形式适合构建消息队列。

scrapy-redis是为了更方便地实现scrapy分布式爬取,而提供了一些以redis为基础的组件。

安装方式:

pip install scrapy-redis
Cola是一个分布式爬虫框架,用户只需编写几个特定的函数,而无需关注分布式运行的细节。任务会自动分配到多台机器上,整个过程对用户是透明的。pip install pyyaml安装下载或者用git clone源码,假设在目录/to/pth/cola,将该路径添加到Python path中。一种简单的方法是在site-packages中添加pth文件。site-packages因系统而异,如果是windows,假设python 装在C:\python27,那么就是C:\python27\Lib\site-packages;如果是linux,那么应该是/usr/local /lib/pythonX.X/dist-packages。在site-packages下新建一个cola.pth文件,里面写上路径:/to/path/cola。Cola目前自带了若干个爬虫,在项目根目录下的contrib中。下面就wiki为例,分别说明如何在单机和分布式环境下运行。依赖无论是维基百科还是新浪微博的实现,数据都存放在MongoDB中,所以要确保MongoDB的安装。在wiki下的wiki.yaml和weibo下的weibo.yaml中可以配置MongoDB的主机和端口。维基百科和新浪微博实现依赖于下面的几个包:mechanizepython-dateutilBeautifulSoup4mongoenginersa(仅新浪微博需要)可以使用pip或者easy_install来安装。单机模式单机模式非常简单,只需运行contrib/wiki/__init__.py即可。cd /to/path/cola/contrib/wiki python __init__.py要运行新浪微博的爬虫,需要在weibo.yaml中配置登录的用户名和密码。这里要注意,要保证这个用户名和密码在登录时不需要验证码。停止则需运行stop.py,注意不能通过直接杀死进程来停止,否则会导致cola非法关闭。 如果非法关闭,确保cola不在运行的情况下,则可以运行stop.py来恢复。但无论如何,都不推荐非法关闭,否则可能遇到不可预知的错误。python stop.py分布式模式首先需要启动cola master和cola workers。分别运行根目录下bin中的start_master.py和start_worker.py启动cola master:cd /to/path/cola python bin/start_master.py --data /my/path/data如果不指定--data,那么数据文件会放置在项目根目录下的data文件夹中。启动cola worker:python bin/start_worker.py --master <master ip address> --data /my/path/data--data选项同master。如果不指定master,会询问是否连接到本机master,输入yes连接。最后使用bin下的coca.py来运行指定的Cola job:python bin/coca.py -m <master ip address> -runLocalJob /to/path/cola/contrib/wiki-runLocalJob选项是要运行的job所在文件夹的绝对路径。输入命令后,该job会被提交到Cola集群来运行。停止Cola Job或集群停止整个集群,则可以运行:python bin/coca.py -m <master ip address> -stopAll而停止一个Job,则需要查询得到Job的名称:python bin/coca.py -m <master ip address> -showRunningJobsNames得到名称后,再运行:python bin/coca.py -m <master ip address> -stopRunningJobByName <job name>基于Cola实现的爬虫基于Cola实现的爬虫位于contrib/目录下。目前实现了四个爬虫:wiki:维基百科。weibo:新浪微博爬虫。从初始用户出发,然后是其关注和粉丝,依次类推,抓取指定个数的新浪微博用户的微博、个人信息、关注和粉丝。其中,用户微博只获取了内容、赞的个数、转发和评论的个数等等,而没有具体去获取此微博被转发和评论的内容。generic(unstable):通用爬虫,只需配置,而无需修改代码。目前Cola实现了一个抽取器(cola/core /extractor),能够从网页正文中自动抽取主要内容,即去除类似边栏和底脚等内容。但是,此抽取器目前准确度还不够,效率也不够高,所以需要谨慎 使用。weibosearch(unstable):新浪微博搜索的爬虫。这个爬虫使用 cola.core.opener.SpynnerOpener,基于spynner实现了一个Opener能够执行JavaScript和Ajax代 码。目前这个爬虫存在的问题是:新浪微博可能会将其识别成机器人,因此有可能会让输入验证码。wiki和weibo之前有所提及。主要说明generic和weibosearch。对于generic来说,主要要修改的就是配置文件:job:   patterns:     - regex: http://blog.sina.com.cn/$       name: home       store: no       extract: no     - regex: http://blog.sina.com.cn/s/blog_.       name: article       store: yes       extract: yes其中,regex表示要匹配的url的正则表达式;name是正则匹配的名称;store为yes时是存储这个网页,no为不存储;extract表示是否自动抽取网页正文,只有当store为yes的时候,extract才有作用。对于weibosearch,其使用了spynner来执行JavaScript和Ajax代码。所以需要确保以下依赖的安装:PyQt4(>=4.4.3)spynner如果你觉得可以基于cola实现一个比较通用的第三方爬虫,比如说腾讯微博等等,欢迎将此爬虫提交到contrib/中。编写自定义Cola Job见wiki编写自定义Cola Job。架构和原理在Cola集群里,当一个任务被提交的时候,Cola Master和Worker会分别启动JobMaster和JobWorker。对于一个Cola Job,当JobWorker启动完成后,会通知JobMaster,JobMaster等待所有JobWorker启动完成后开始运行Job。在一个 Cola Job启动时,会启动一个消息队列(Message Queue,主要操作是put和get,worker抓取到的对象会被put到队列中,而要抓取新的对象时,只要从队列中取即可),每个 JobWorker上都存在消息队列节点,同时会有一个去重模块(bloom filter实现)。Cola还不够稳定,目前会处于持续改进的状态。且Cola还没有在较大规模的集群上测试,但是接下来我会把Cola应用到新项目中,并逐步完善。也希望大家也能给我反馈,并帮助改进。Roadmap0.1版本正式推出前不会再增加新的功能了,主要目标让Cola更加稳定,并且提高cola/core/extractor的性能和精确度,完善contrib/generic和contrib/weibosearch。0.2版本计划:实现一个web接口,可以查看运行的cola job以及运行情况简化安装,支持easy_install或者pip安装。增加解决依赖库安装的机制。0.3版本计划:增加一个统一持久化抽象,支持保存到关系型数据库,MongoDB,文件系统,HDFS等等。0.4版本计划:支持Python 3 标签:Cola
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值