scrapy分布式(一)

正文:

由于时间原因,先暂时不做数据分析的爬取,直接拿成品,只做我们要进行的分布式爬取环境和相关代码的编写学习;
结构图看 http://baijiahao.baidu.com/s?id=1585117266335386391&wfr=spider&for=pc
在本机进行redis库操作 https://www.cnblogs.com/xinyangsdut/p/7631163.html(其中一些redis的设置,作者写的很简练同时也很明白)
理论利用redis    https://blog.csdn.net/zwq912318834/article/details/78854571
还可以参考:

https://www.cnblogs.com/cq146637/p/9081061.html
https://blog.csdn.net/qq_25046261/article/details/79748576
http://baijiahao.baidu.com/s?id=1585117266335386391&wfr=spider&for=pc

简单写一段

1.什么是分布式爬虫?

简单说,就是把一件事,同时几股力量来做
举个例子:
比如说自己一个windows主机,一个kali虚拟机,一个ubuntu虚拟机
windows主机爬取urls,然后kali和ubuntu进行共享操作,即公用urls队列

2.为什么用redis?

scrapy单机架构,只在本机维护一个爬取队列,Scheduler进行调度,而要实现多态服务器共同爬取数据关键就是共享爬取队列,而redis的Key-Value形式存储,结构灵活。
redis可以做到去重,防止中断
Duplication Filter 指纹过滤器,scrapy用集合实现这个request去重功能,scrapy中把已经发送的request指纹放到一个集合中,把下一个request的指纹放到集合中比对,如果该指纹存在于集合中,说明这个request发送过了,如果没有则继续操作。

3.如何利用redis?

已经有开源工作者为我们弄好了
https://github.com/rmax/scrapy-redis

二.settings.py文件注意的

SPIDER_MODULES = ['sinaNews.spiders']
NEWSPIDER_MODULE = 'sinaNews.spiders'
# 使用scrapy-redis里的去重组件,不使用scrapy默认的去重方式
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis里的调度器组件,不使用默认的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 允许暂停,redis请求记录不丢失
SCHEDULER_PERSIST = True
# 默认的scrapy-redis请求队列形式(按优先级)
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
# 队列形式,请求先进先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
# 栈形式,请求先进后出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
# 只是将数据放到redis数据库,不需要写pipelines文件
ITEM_PIPELINES = {
#    'Sina.pipelines.SinaPipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,
}
# LOG_LEVEL = 'DEBUG'
# Introduce an artifical delay to make use of parallelism. to speed up the
# crawl.
DOWNLOAD_DELAY = 1
# 指定数据库的主机IP
REDIS_HOST = "192.168.13.26"
# 指定数据库的端口号
REDIS_PORT = 6379

三.scrapy.py文件中要注意的

一个是修改继承类,二个是修改def __init__,便于输入redis命令控制

class SinaSpider(RedisSpider):
    name = "sina"
    # 启动爬虫的命令
    redis_key = "sinaspider:strat_urls"
  # 动态定义爬虫爬取域范围
    def __init__(self, *args, **kwargs):
        domain = kwargs.pop('domain', '')
        self.allowed_domains = filter(None, domain.split(','))
        super(SinaSpider, self).__init__(*args, **kwargs)

四.步骤

第一步:在slaver端的爬虫中,指定好 redis_key,并指定好redis数据库的地址
第二步:启动slaver端的爬虫,爬虫进入等待状态,等待 redis 中出现 redis_key
第三步:启动脚本,往redis数据库中填入redis_key
第四步:slaver端的爬虫开始爬取数据
这个步骤就很详细了,还是画个图吧。。。(难得有个图)

1,2,3都是slave端,都是scrapy程序,先跑起来,等待抓取指令,ok,指令来了,抓取到的数据放在4的redis库里,1,2,3又可以在redis库里拿到url进行爬取;本来是一个scrapy进行爬取,这时有3个scrapy同时进行爬取。

五.命令:

scrapy runspider xxxx.py      (slave先跑起来)
lpush sinaspider:start_urls http://news.sina.com.cn/guide/  (发送redis_key,开始爬取,并发送开始的start_url)

 
2018.8.28

发表评论

电子邮件地址不会被公开。 必填项已用*标注