一、概念
概念:多台機器對一個項目進行分部聯合爬取。
作用:增加工作機關,提升爬取效率。
前提:每一台工作機器都需要scrapy的運作環境。原生的scrapy是不能實作分布式爬蟲的,需要結合scrapy-redis
每台機器的scrapy中,如果用各自的排程器,那麼就是各自做相同的事情,不是同一個事情,各自使用自己
公用排程器:
1.每台機器都可以進行連接配接——需要網絡服務
2.能夠進行資料存儲,要爬取的url——資料庫
3.隊列模型:應該是隊列的結構,棧結構且去重唯一 ——Redis清單、集合
可以在Redis中定義一個清單進行存儲要爬取的request對象,相當于[start_urls]
環境:
1.scrapy
2.scrapy-redis
Linux隻需-pip install scrapy
對公用排程器的要求:1.每台機器都可以進行連接配接:需要是一個網絡服務
2.能夠進行存儲,要爬取url:資料庫
3.隊列模型{ mysql:二維表
redis:文檔接口{
字元串
清單{LPUSH:
RPUSH:}
哈希
集合:唯一,可實作去重
有序集合
}
mongoDB:json文檔
4.去重 }
redis還可以存儲item
二、實作流程:準備配置
1.建立項目scrapy startproject distributed
2.建立一個基于CrawlSpider爬蟲-可以基于正則比對url的爬蟲
cd distributed
scrapy genspider -t crawl taoche taoche.com
3.settings:(暫不設定日志等級,預設INFO)
基礎設定:UA和ROBOTS
4.明确爬取目标——定義item
<以上為scrapy架構的基本步驟,以下為分布式配置>
5.繼續配置settings
##############################指定管道####################################
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline':300, #scrapy-redis元件寫好了,自動封裝Redis資料。多線程的管道
#'distributed.pipelines.DistributedPipeline': 300,
}
###############################指定Redis################################
REDIS_HOST = '127.0.0.1' #本應該是Redis伺服器的位址,但現在用的是虛拟機,在本地,寫回環位址
REDIS_PORT = 6379 #如果用的VirtualBox,應該是其轉發的端口
#去重容器類,作用:用Redis的set集合,來存儲請求的指紋資料,進而實作去重和持久化
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
################################使用scrapy-redis的排程器###############################
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
##############配置排程器是否需要持久化,爬蟲結束的時候要不要請客Redis中請求隊列和指紋的set集合,要持久化為TRUE
SCHEDULER_PRESIST=True
6.設定Redis(于Linux操作Redis庫)
:wq#儲存退出
redis-server#重新開機Redis服務
在redis清單中存儲urls:
(py3env) [email protected]:~$ redis-cli
127.0.0.1:6379> LPUSH taoche https://nanjing.taoche.com/bmw/
127.0.0.1:6379> LPUSH taoche https://nanjing.taoche.com/bugatti/
127.0.0.1:6379> LPUSH taoche https://nanjing.taoche.com/mercedesbenz/
127.0.0.1:6379> TYPE taoche
list
127.0.0.1:6379> LLEN taoche
(integer) 4
127.0.0.1:6379> LRANGE taoche 0 -1
1) "https://nanjing.taoche.com/bugatti/"
2) "https://nanjing.taoche.com/porsche/"
3) "https://nanjing.taoche.com/mercedesbenz/"
4) "https://nanjing.taoche.com/bmw/"
三、實作流程:編寫爬蟲(spiders)
from scrapy_redis.spiders import RedisCrawlSpider
class TaocheSpider(RedisCrawlSpider):#編寫的爬蟲繼承于RedisCrawlSpider
#allowed_domains = ['taoche.com']#注釋起來,不做域名限制
#start_urls = ['http://taoche.com/']#起始的urls應該從公共排程器取用(Redis)
redis_key = 'taoche' #會去redis(公共排程器裡面擷取key為taoche的資料 taoche:[]),相當于strat_urls清單
… …
用兩個terminal視窗運作,再打開redis:
127.0.0.1:6379>
(py3env) [email protected]:~$ redis-cli
127.0.0.1:6379> keys *
1) "taoche:items"
2) "taoche:dupefilter"
127.0.0.1:6379> TYPE taoche:dupefilter
set
發現‘taoche’隊列沒有了,多出來兩個新字段
增量式爬蟲:檢測網站資料的更新情況,隻爬取更新的沒有爬取過的資料(利用了set集合)。scrapy-redis有這個特性
##############配置排程器是否需要持久化,爬蟲結束的時候要不要請客Redis中請求隊列和指紋的set集合,要持久化為TRUE
SCHEDULER_PRESIST=True