分布式
-
概念:可以使用多台電腦組件一個分布式機群,讓其執行同一組程序,對同一組網絡資源進行聯合爬取。
-
原生的scrapy是無法實現分布式
- 調度器無法被共享
- 管道無法被共享
-
基於 scrapy+redis(scrapy&scrapy-redis組件)實現分布式
-
scrapy-redis
組件作用:- 提供可被共享的管道和調度器
-
環境安裝:
pip install scrapy-redis
-
編碼流程:
1.創建工程 2.cd proName 3.創建crawlspider的爬蟲文件 4.修改一下爬蟲類: - 導包:from scrapy_redis.spiders import RedisCrawlSpider - 修改當前爬蟲類的父類:RedisCrawlSpider - allowed_domains和start_urls刪除 - 添加一個新屬性:redis_key = 'xxxx'可以被共享的調度器隊列的名稱 5.修改配置settings.py - 指定管道 ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 400 } - 指定調度器 增加了一個去重容器類的配置, 作用使用Redis的set集合來存儲請求的指紋數據, 從而實現請求去重的持久化 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 使用scrapy-redis組件自己的調度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 配置調度器是否要持久化, 也就是當爬蟲結束了, 要不要清空Redis中請求隊列和去重指紋的set。如果是True, 就表示要持久化存儲, 就不清空數據, 否則清空數據 SCHEDULER_PERSIST = True - 指定redis數據庫 REDIS_HOST = '127.0.0.1' REDIS_PORT = 6379 6.配置redis數據庫(redis.windows.conf) - 關閉默認綁定 - 56Line:#bind 127.0.0.1 - 關閉保護模式 - 75line:protected-mode no 7.啟動redis服務(攜帶配置文件)和客戶端 - redis-server.exe redis.windows.conf - redis-cli 8.執行工程 - scrapy runspider spider.py 9.將起始的url仍入到可以被共享的調度器的隊列(sun)中 - 在redis-cli中操作:lpush sun www.xxx.com 10.redis: - xxx:items:存儲的就是爬取到的數據
爬蟲代碼:
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from scrapy_redis.spiders import RedisCrawlSpider from fbsPro.items import FbsproItem class FbsSpider(RedisCrawlSpider): name = 'fbs' # allowed_domains = ['www.xxx.com'] # start_urls = ['http://www.xxx.com/'] redis_key = 'sun' # 可以被共享的調度器隊列的名稱 link = LinkExtractor(allow=r'type=4&page=\d+') rules = ( Rule(link, callback='parse_item', follow=True), ) def parse_item(self, response): tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr') for tr in tr_list: title = tr.xpath('./td[2]/a[2]/@title').extract_first() status = tr.xpath('./td[3]/span/text()').extract_first() item = FbsproItem() item['title'] = title item['status'] = status yield item