Crawlscrapy分布式爬虫

1.概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取

2.原生的scrapy是不可以实现分布式式爬虫

  a)调度器无法共享

  b)管道无法共享

3.scrapy-redis 组件:专门为scrapy开发的一套组件,该组件可以让scrapy实现分布式

  a)pip install scrapy-redis

4.分布式爬取的流程:

  a)redis配置文件配置

    band 127.0.0.1 进行注释

  b)redis服务器开启

  c)创建scrapy工程后,创建基于crawlspider的爬虫文件 

  d)  导入RedisCrawlSpider类,然后将爬虫文件修改成基于该类的源文件

  e)将start_url 修改成 redis_key="xxx"

  f )将项目管道和调度器配置成基于scrapy-redis组件中

  g)执行爬虫文件:scrapy runspider xxx.py

  h)将起始url放置到调度器的队列中:redis-cli,lpush 队列的名称(redis-key)起始url

 

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from redispro.items import RedisproItem
from scrapy_redis.spiders import RedisCrawlSpider

class QiubaiSpider(RedisCrawlSpider):
    name = 'qiubai'
    # allowed_domains = ['www.qiushibaike.com']
    # start_urls = ['https://www.qiushibaike.com/']

    #调度器队列的名称
    redis_key = 'qiubai'   # 表示跟start_urls含义是一样
    link = LinkExtractor(allow=r'/pic/page/\d+')
    rules = (
        Rule(link, callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        div_list = response.xpath('//div[@id="content-left"]/div')
        for i in div_list:
            img_url = 'http' + i.xpath('.//div[@class="thumb"]/a/img/@src')
            item = RedisproItem()
            item['img_url'] = img_url

            yield item

 

setting

#使用scrapy-redis组件的去重队列
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
#使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
#是否允许暂停
SCHEDULER_PERSIST = True


#如果redis服务器不在自己本机,则需要如下配置
REDIS_HOST = "112.21.68.59"
REDIS_PORT = 6379
ITEM_PIPELINES = {
#    'redispro.pipelines.RedisproPipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline':400,
}

 

posted @ 2019-05-24 21:43  新手码农__威  阅读(915)  评论(0编辑  收藏  举报