Crawlscrapy分佈式爬蟲

1.概念:多臺機器上能夠執行同一個爬蟲程序,實現網站數據的分佈爬取redis

2.原生的scrapy是不能夠實現分佈式式爬蟲服務器

  a)調度器沒法共享dom

  b)管道沒法共享scrapy

3.scrapy-redis 組件:專門爲scrapy開發的一套組件,該組件能夠讓scrapy實現分佈式分佈式

  a)pip install scrapy-rediside

4.分佈式爬取的流程:網站

  a)redis配置文件配置url

    band 127.0.0.1 進行註釋spa

  b)redis服務器開啓code

  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,
}
相關文章
相關標籤/搜索