美文网首页
分布式爬取

分布式爬取

作者: 咻咻咻滴赵大妞 | 来源:发表于2019-01-07 23:20 被阅读0次

    分布式爬取需要安装pip3 install scrapy_redis

    首先修改setings.py文件:

    1.设置去重组件,使用的是scrapy_redis的去重组件,而不再使用scrapy自己的去重组件了
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

    2.使用设置调度器,使用scrapy_redis重写调度器,而不再使用自带的调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"

    3.实现断点爬取(请求的记录不会丢失,会存储在redis数据库中,不会清除redis的任务队列)
    SCHEDULER_PERSIST = True

    4.设置任务队列的模式3种选一种
    是scrapy_redis默认使用的队列模式(有自己的优先级)
    SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
    使用了队列的形式,任务先进先出
    SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
    采用了栈的形式,任务先进后出
    SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"

    5.设置管道文件
    ITEM_PIPELINES = {
    'example.pipelines.ExamplePipeline': 300,
    实现管道可以将爬虫端获取的item数据统一保存在redis数据库中
    'scrapy_redis.pipelines.RedisPipeline': 400,
    }
    6.设置数据库相关信息
    指定要存储的redis数据库的主机IP
    REDIS_HOST = '127.0.0.1'
    指定redis数据库主机的端口
    REDIS_PORT = 6379

    redis数据库

    "xcfCrawlSpider:requests":存储的是请求的request对象
    "xcfCrawlSpider:items":存储的爬虫端获取的items数据
    "xcfCrawlSpider:dupefilter":存储的指纹(为了实现去重)

    127.0.0.1:6379> type xcfCrawlSpider:requests
    zset
    127.0.0.1:6379> type xcfCrawlSpider:items
    list
    127.0.0.1:6379> type xcfCrawlSpider:dupefilter
    set
    

    分布式爬虫三种情况

    第一种情况:dmoz.py

    继承制:CrawlSpider

    只设置settings.py文件,并没有实现分布式,使用了sctapy_redis的数据存储和去重功能

    第二种情况:mycrawler_redis实现通用爬虫的分布式爬虫

    继承制:RedisCrawlSpider

    from scrapy_redis.spiders import RedisCrawlSpider
    
    class MyCrawler(RedisCrawlSpider):
        """Spider that reads urls from redis queue (myspider:start_urls)."""
        name = 'mycrawler_redis'
        allowed_domains = ['dmoz.org']
        #缺少了start_url,多了redis_key:根据redis_key从redis
        #数据库中获取任务
        redis_key = 'mycrawler:start_urls'
    

    启动爬虫:scrapy crawl 爬虫名称
    现象:爬虫处于等待状态
    需要在redis数据库设置起始任务:

    lpush mycrawler:start_urls 目标url

    redis数据库有三个key,爬取任务结束后,只会剩item一个表

    第三种情况:myspider_redis实现scrpy.spider爬虫的分布式爬虫(和第二种代码一样,只是继承的类不同)

    继承制:RedisSpider

      from scrapy_redis.spiders import RedisSpider
       class MyCrawler(RedisSpider):
            """Spider that reads urls from redis queue (myspider:start_urls)."""
            name = 'mycrawler_redis'
            allowed_domains = ['dmoz.org']
            #缺少了start_url,多了redis_key:根据redis_key从redis
            #数据库中获取任务
            redis_key = 'mycrawler:start_urls'
    

    启动爬虫:scrapy crawl 爬虫名称

    现象:爬虫处于等待状态

    需要设置起始任务:

    lpush mycrawler:start_urls 目标url

    相关文章

      网友评论

          本文标题:分布式爬取

          本文链接:https://www.haomeiwen.com/subject/syrmrqtx.html