天天看點

scrapy-redis(分布式爬蟲)

一、概念

概念:多台機器對一個項目進行分部聯合爬取。

作用:增加工作機關,提升爬取效率。

前提:每一台工作機器都需要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庫)

scrapy-redis(分布式爬蟲)
scrapy-redis(分布式爬蟲)
scrapy-redis(分布式爬蟲)
scrapy-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