分布式爬虫

分布式爬虫:
1. 概念
将同一个爬虫程序放在多台电脑上(或者同一个电脑中的多个虚拟机环境),并且在多台电脑上同时启动这个爬虫。一个电脑运行一个爬虫程序称为单机爬虫。
2. 作用
可以利用多台电脑的带宽,处理器等资源提高爬虫的爬取速度;
3. 原理
分布式需要解决的问题:(共用的队列Queue和共用的去重集合set(),这两个是scrapy自身无法解决的问题。只能通过第三方组件。)
a> 需要保证多台电脑中的爬虫代码完全一致;
b> 多台电脑操作同一个网站,如何管理url去重?
scrapy如何做去重的?
i> scrapy会将所有的Request对象(request.url,request.method,request.body)进行加密,生成一个指纹对象fingerprint;
ii> 然后将指纹对象放入set()集合中进行对比,如果set()集合中已经存在这个对象,那么scrapy就会将这个Request抛弃。如果set()集合中不存在这个指纹对象,就将这个Request添加到调度队列queue中,等待被调度器调度;
c> 多台电脑就会有多个set()对象,能否使用各自的set()做去重?
不能。
i> 这个set()对象中的数据都是保存在电脑内存中的,电脑的内存空间(运行内存)是不能共享的。
2> 这个set()对象随着程序的启动而创建,程序的退出而销毁。
所以,要解决这个问题,需要让所有电脑共用同一个set()集合。不再使用scrapy内置的set()对象,而是使用scrapy-redis将这个set()集合在redis中创建,然后多台电脑访问同一个redis就可以实现set集合的共用。
d> 用于存放合法Request请求对象的队列,在scrapy中也是默认存在于内存中的,也是无法实现多台电脑的共享队列。如果是多台电脑的话,就需要保证多台电脑有共用的队列queue,这样可以保证所有电脑从同一个队列中获取Request对象进行调度,所有set()过滤出来的Request都放到同一个队列中。
所以,要解决这个问题,需要让所有电脑共用同一个队列。不再使用scrapy内置的queue,而是使用scrapy-redis将这个queue在redis中创建,然后多台电脑访问同一个redis就可以实现queue的共用。
e> 如何将不同电脑上获取的数据,保存在同一个数据库中。
4. 配置
a> (必须配置)
# 配置scrapy-redis
# Enables scheduling storing requests queue in redis.
# 更换scrapy内置调度器文件,使用scrapy_redis包中的scheduler调度器文件。
SCHEDULER = “scrapy_redis.scheduler.Scheduler”
# Ensure all spiders share same duplicates filter through redis.
# 更换scrapy内置的去重文件,使用scrapy_redis包中的dupefilter文件。
DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter”
b> (可选配置)
是否将解析出来的item数据,在redis中保存一份。如果需要保存,就配置这个pipeline。
ITEM_PIPELINES = {
‘scrapy_redis.pipelines.RedisPipeline’: 300
}
c> (必须配置)
# 配置REDIS_URL = ‘(redis://redis数据库用户(默认是root):redis数据库连接密码(默认为空))@(redis的连接地址):(redis的端口号)’
# hostname: redis的链接地址,由于多台电脑要连接同一个redis数据库,所以,这个链接地址可以是其中一台电脑的IP地址。注意:这个IP地址对应的电脑必须启动redis服务,否则其他电脑无法链接这个IP对应的redis。
# 如果是在阿里云上购买的redis数据库服务器,这个hostname就填写阿里云的redis服务器的公网IP。
REDIS_URL = ‘redis://root:@192.168.53.88:6379’
d> (必须配置)
配置redis服务,默认redis只支持localhost的本地连接,不允许远程连接,需要配置redis服务,开启远程连接功能。去本地安装包,找到redis.windows.conf文件:
1> 将protected-mode yes这个保护模式关闭,设置为no;
2> 将bind 127.0.0.1修改成REDIS_URL中设置的IP地址(192.168.53.88);
在修改redis.windows.conf配置文件以后,必须将 “Redis” 服务从计算机-管理中删除,然后重新根据修改后redis.windows.conf配置文件进行注册新的服务,这样修改的配置文件才生效。
注意:分布式爬虫程序中设置的所有的KEY,都是"xxx:xxx"结构,对应的是容器的名称(类似于MySQL中的表名),并不是容器内容中key:value的这个key。
e> (必须配置)
from …scrapy_redis.spiders import RedisSpider
class BoleSpider(RedisSpider):
name = ‘bole’
allowed_domains = [‘jobbole.com’]
# start_urls = [‘http://blog.jobbole.com/all-posts/’]
# 分布式就不需要再设置起始的url,需要通过redis进行添加起始的url。起始的url添加到哪去了?被添加到了公共队列queue中。让多台机器中的其中一台从公共的reids队列queue中,获取起始的url,并对这个起始的url进行请求和解析,获取更多的url,然后将所有的url构造成Request,还放入公共队列queue中,让其他机器获取这些Request请求。
redis_key = ‘jobbole:start_urls’

f> 向redis_key = 'jobbole:start_urls'这个键中,添加起始url.
	lpush jobbole:start_urls http://blog.jobbole.com/all-posts/
	
g> 修改MySQL数据库为远程连接,让所有电脑连接同一个数据库,爬取出来的数据都保存在同一个数据库的表中。
默认情况下,MySQL分配的root用户只允许本地连接localhost,如果需要通过IP建立数据库的连接,需要创建一个具有远程连接权限的用户:

创建一个名称为 "user" 的用户,%表示该用户可以使用任意IP进行连接,identified by是设置密码。
create user "user"@"%" identified by "123456";
给名称为 "user" 的用户分配所有数据库的读写权限,*.*表示user可以对任意数据库都有操作权限。
GRANT ALL privileges ON *.* TO 'user'@'%';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值