1. 程式人生 > >scrapy-redis scrapy-redis使用以及剖析

scrapy-redis scrapy-redis使用以及剖析

scrapy-redis使用以及剖析

scrapy-redis是一個基於redis的scrapy元件,通過它可以快速實現簡單分散式爬蟲程式,該元件本質上提供了三大功能:

  • scheduler - 排程器
  • dupefilter - URL去重規則(被排程器使用)
  • pipeline   - 資料持久化

scrapy-redis元件

1. URL去重

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 定義去重規則(被排程器呼叫並應用)        a. 內部會使用以下配置進行連線Redis           
# REDIS_HOST = 'localhost'                            # 主機名          # REDIS_PORT = 6379                                   # 埠
         # REDIS_URL = 'redis://user:[email protected]:9001'       # 連線URL(優先於以上配置)          # REDIS_PARAMS  = {}                                  # Redis連線引數             預設:REDIS_PARAMS = {'socket_timeout': 30,'socket_connect_timeout': 30,'retry_on_timeout': True,'encoding': REDIS_ENCODING,})          # REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient' # 指定連線Redis的Python模組  預設:redis.StrictRedis          # REDIS_ENCODING = "utf-8"                            # redis編碼型別             預設:'utf-8'            b. 去重規則通過redis的集合完成,集合的Key為:                key = defaults.DUPEFILTER_KEY % { 'timestamp' : int (time.time())}          預設配置:              DUPEFILTER_KEY = 'dupefilter:%(timestamp)s'                     c. 去重規則中將url轉換成唯一標示,然後在redis中檢查是否已經在集合中存在                from scrapy.utils import request          from scrapy.http import Request                    req = Request(url = 'http://www.cnblogs.com/wupeiqi.html' )          result = request.request_fingerprint(req)          print (result) # 8ea4fd67887449313ccc12e5b6b92510cc53675c                              PS:              - URL引數位置不同時,計算結果一致;              - 預設請求頭不在計算範圍,include_headers可以設定指定請求頭              示例:                  from scrapy.utils import request                  from scrapy.http import Request                                    req = Request(url = 'http://www.baidu.com?name=8&id=1' ,callback = lambda x: print (x),cookies = { 'k1' : 'vvvvv' })                  result = request.request_fingerprint(req,include_headers = [ 'cookies' ,])                                    print (result)                                    req = Request(url = 'http://www.baidu.com?id=1&name=8' ,callback = lambda x: print (x),cookies = { 'k1' : 666 })                                    result = request.request_fingerprint(req,include_headers = [ 'cookies' ,])                                    print (result)           """ # Ensure all spiders share same duplicates filter through redis. # DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

2. 排程器

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 """ 排程器,排程器使用PriorityQueue(有序集合)、FifoQueue(列表)、LifoQueue(列表)進行儲存請求,並且使用RFPDupeFilter對URL去重            a. 排程器          SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'          # 預設使用優先順序佇列(預設),其他:PriorityQueue(有序集合),FifoQueue(列表)、LifoQueue(列表)          SCHEDULER_QUEUE_KEY = '%(spider)s:requests'                         # 排程器中請求存放在redis中的key          SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"                  # 對儲存到redis中的資料進行序列化,預設使用pickle          SCHEDULER_PERSIST = True                                            # 是否在關閉時候保留原來的排程器和去重記錄,True=保留,False=清空          SCHEDULER_FLUSH_ON_START = True                                     # 是否在開始之前清空 排程器和去重記錄,True=清空,False=不清空          SCHEDULER_IDLE_BEFORE_CLOSE = 10                                    # 去排程器中獲取資料時,如果為空,最多等待時間(最後沒資料,未獲取到)。          SCHEDULER_DUPEFILTER_KEY = '%(spider)s:dupefilter'                  # 去重規則,在redis中儲存時對應的key          SCHEDULER_DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'# 去重規則對應處理的類     """ # Enables scheduling storing requests queue in redis. SCHEDULER = "scrapy_redis.scheduler.Scheduler"   # Default requests serializer is pickle, but it can be changed to any module # with loads and dumps functions. Note that pickle is not compatible between # python versions. # Caveat: In python 3.x, the serializer must return strings keys and support # bytes as values. Because of this reason the json or msgpack module will not # work by default. In python 2.x there is no such issue and you can use # 'json' or 'msgpack' as serializers. # SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"   # Don't cleanup redis queues, allows to pause/resume crawls. # SCHEDULER_PERSIST = True   # Schedule requests using a priority queue. (default) # SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'   # Alternative queues. # SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue' # SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'   # Max idle time to prevent the spider from being closed when distributed crawling. # This only works if queue class is SpiderQueue or SpiderStack, # and may also block the same time when your spider start at the first time (because the queue is empty). # SCHEDULER_IDLE_BEFORE_CLOSE = 10  

3. 資料持久化

?
1 2 3 4 5 6 7 8 2. 定義持久化,爬蟲 yield Item物件時執行RedisPipeline            a. 將item持久化到redis時,指定key和序列化函式                REDIS_ITEMS_KEY = '%(spider)s:items'          REDIS_ITEMS_SERIALIZER = 'json.dumps'            b. 使用列表儲存item資料

4. 起始URL相關

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 """ 起始URL相關        a. 獲取起始URL時,去集合中獲取還是去列表中獲取?True,集合;False,列表          REDIS_START_URLS_AS_SET = False    # 獲取起始URL時,如果為True,則使用self.server.spop;如果為False,則使用self.server.lpop      b. 編寫爬蟲時,起始URL從redis的Key中獲取          REDIS_START_URLS_KEY = '%(name)s:start_urls'           """ # If True, it uses redis' ``spop`` operation. This could be useful if you # want to avoid duplicates in your start urls list. In this cases, urls must # be added via ``sadd`` command or you will get a type error from redis. # REDIS_START_URLS_AS_SET = False   # Default start urls key for RedisSpider and RedisCrawlSpider. # REDIS_START_URLS_KEY = '%(name)s:start_urls'

scrapy-redis示例

複製程式碼
# DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
#
#
# from scrapy_redis.scheduler import Scheduler
# from scrapy_redis.queue import PriorityQueue
# SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'          # 預設使用優先順序佇列(預設),其他:PriorityQueue(有序集合),FifoQueue(列表)、LifoQueue(列表)
# SCHEDULER_QUEUE_KEY = '%(spider)s:requests'                         # 排程器中請求存放在redis中的key
# SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"                  # 對儲存到redis中的資料進行序列化,預設使用pickle
# SCHEDULER_PERSIST = True                                            # 是否在關閉時候保留原來的排程器和去重記錄,True=保留,False=清空
# SCHEDULER_FLUSH_ON_START = False                                    # 是否在開始之前清空 排程器和去重記錄,True=清空,False=不清空
# SCHEDULER_IDLE_BEFORE_CLOSE = 10                                    # 去排程器中獲取資料時,如果為空,最多等待時間(最後沒資料,未獲取到)。
# SCHEDULER_DUPEFILTER_KEY = '%(spider)s:dupefilter'                  # 去重規則,在redis中儲存時對應的key
# SCHEDULER_DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'# 去重規則對應處理的類
#
#
#
# REDIS_HOST = '10.211.55.13'                           # 主機名
# REDIS_PORT = 6379                                     # 埠
# # REDIS_URL = 'redis://user:[email protected]:9001'       # 連線URL(優先於以上配置)
# # REDIS_PARAMS  = {}                                  # Redis連線引數             預設:REDIS_PARAMS = {'socket_timeout': 30,'socket_connect_timeout': 30,'retry_on_timeout': True,'encoding': REDIS_ENCODING,})
# # REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient' # 指定連線Redis的Python模組  預設:redis.StrictRedis
# REDIS_ENCODING = "utf-8"                              # redis編碼型別             預設:'utf-8'
複製程式碼 複製程式碼
import scrapy


class ChoutiSpider(scrapy.Spider):
    name = "chouti"
    allowed_domains = ["chouti.com"]
    start_urls = (
        'http://www.chouti.com/',
    )

    def parse(self, response):
        for i in range(0,10):
            yield
複製程式碼

 

作者: 武沛齊
出處: http://www.cnblogs.com/wupeiqi/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線。
好文要頂 關注我 收藏該文 武沛齊
關注 - 44
粉絲 - 6109 +加關注 0 0 « 上一篇: 白話Scrapy【第一篇】:目錄
» 下一篇: celery
posted @ 2017-05-27 14:36 武沛齊 閱讀( 1923) 評論( 0)   編輯 收藏

scrapy-redis是一個基於redis的scrapy元件,通過它可以快速實現簡單分散式爬蟲程式,該元件本質上提供了三大功能:

  • scheduler - 排程器
  • dupefilter - URL去重規則(被排程器使用)
  • pipeline   - 資料持久化

scrapy-redis元件

1. URL去重

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 定義去重規則(被排程器呼叫並應用)        a. 內部會使用以下配置進行連線Redis            # REDIS_HOST = 'localhost'                            # 主機名          # REDIS_PORT = 6379                                   # 埠          # REDIS_URL = 'redis://user:[email protected]:9001'       # 連線URL(優先於以上配置)          # REDIS_PARAMS  = {}                                  # Redis連線引數             預設:REDIS_PARAMS = {'socket_timeout': 30,'socket_connect_timeout': 30,'retry_on_timeout': True,'encoding': REDIS_ENCODING,})          # REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient' # 指定連線Redis的Python模組  預設:redis.StrictRedis          # REDIS_ENCODING = "utf-8"                            # redis編碼型別             預設:'utf-8'            b. 去重規則通過redis的集合完成,集合的Key為:                key = defaults.DUPEFILTER_KEY % { 'timestamp' : int (time.time())}          預設配置:              DUPEFILTER_KEY = 'dupefilter:%(timestamp)s'                     c. 去重規則中將url轉換成唯一標示,然後在redis中檢查是否已經在集合中存在                from scrapy.utils import request          from scrapy.http import Request                    req = Request(url = 'http://www.cnblogs.com/wupeiqi.html' )          result = request.request_fingerprint(req)          print (result) # 8ea4fd67887449313ccc12e5b6b92510cc53675c                              PS:              - URL引數位置不同時,計算結果一致;              - 預設請求頭不在計算範圍,include_headers可以設定指定請求頭              示例:                  from scrapy.utils

相關推薦

scrapy-redis使用以及剖析

dex localhost 取數據 param wls 默認 pid list isp scrapy-redis是一個基於redis的scrapy組件,通過它可以快速實現簡單分布式爬蟲程序,該組件本質上提供了三大功能: scheduler - 調度器 dupefilter

scrapy-redis scrapy-redis使用以及剖析

scrapy-redis使用以及剖析 scrapy-redis是一個基於redis的scrapy元件,通過它可以快速實現簡單分散式爬蟲程式,該元件本質上提供了三大功能: scheduler - 排程器 dupefilter - URL去重規則(

基於Scrapy-Redis的分散式以及cookies池

基於Scrapy-Redis的分散式以及cookies池   轉載自:靜覓 » 小白進階之Scrapy第三篇(基於Scrapy-Redis的分散式以及cookies池) ==================================================

redis-scrapy分布式系統搭建

list 主從 設置 -s .cn ack ive lines ide 下載 Reids:https://github.com/MicrosoftArchive/redis scrapy-redis:https://github.com/rmax/scrapy-redis

scrapyscrapy-redis 全國建築市場基本信息采集

redis callback ids super call connect info turn 一個 簡介 環境: python3.6    scrapy 1.5 使用scrapy-redis 開發的分布式采集demo。一次簡單的例子,供初學者參考(覺得有更好的方式

scrapyscrapy-redis有什麼區別?為什麼選擇redis資料庫?

1) scrapy是一個Python爬蟲框架,爬取效率極高,具有高度定製性,但是不支援分散式。而scrapy-redis一套基於redis資料庫、執行在scrapy框架之上的元件,可以讓scrapy支援分散式策略,Slaver端共享Master端redis資料庫裡的item佇列、請求佇列和請求指紋集

搭建redis-scrapy分散式爬蟲環境

ubuntu上作主機 A . 主機---管理指紋佇列,資料佇列,request隊:redis, 建議不要爬資料。 1臺主機,用ubutnu系統 上課演示的是這臺電腦也爬取,不光要安裝redis, 還要安裝scrapy(先)和scrapy-r

從零搭建Redis-Scrapy分散式爬蟲

Scrapy-Redis分散式策略: 假設有四臺電腦:Windows 10、Mac OS X、Ubuntu 16.04、CentOS 7.2,任意一臺電腦都可以作為 Master端 或 Slaver端,比如: Master端(核心伺服器) :使用 Windows 1

Scrapyscrapy-redis的區別

Scrapy 是一個通用的爬蟲框架,但是不支援分散式,Scrapy-redis是為了更方便地實現Scrapy分散式爬取,而提供了一些以redis為基礎的元件(僅有元件)。pip install scrapy-redisScrapy-redis提供了下面四種元件(compone

python - scrapy 爬蟲框架 ( redis去重 )

use 去重 class conn elf sin cls col returns 1. 使用內置,並加以修改 ( 自定義 redis 存儲的 keys ) settings 配置 # ############### scrapy redis連接 ########

scrapyscrapy-redis的區別

scrapy是一個python爬蟲框架,爬取的效率極高,具有高度的定製性,但是不支援分散式。而scrapy-redis是一套基於redis庫,執行在scrapy框架之上的元件,可以讓scapy支援分散式策略 Slaver端共享Master端redis資料庫裡的item 佇列、請求佇列和請求指紋集合。 選擇

python爬蟲利器 scrapyscrapy-redis 詳解一 入門demo及內容解析

## 架構及簡介 Scrapy是用純Python實現一個為了爬取網站資料、提取結構性資料而編寫的應用框架,用途非常廣泛。 Scrapy 使用了 Twisted(其主要對手是Tornado)非同步網路框架來處理網路通訊,可以加快我們的下載速度,不用自己去實現非同步框架,並且包含了各種中介軟體介面,可以靈活的

Redis簡單介紹以及數據類型存儲

博客 個數 取值 rom 特點 而且 ring oid wan 因為我們在大型互聯網項目其中。用戶訪問量比較大,比較多。會產生並發問題,對於此。我們該怎樣解決呢。Redis橫空出世,首先,我們來簡單的認識一下Redis。具體介紹例如以下所看到的:

Redis源代碼剖析】 - Redis內置數據結構之壓縮字典zipmap

ordering struct 包裝 字符串長度 哈希 append 解決 註意 指針 原創作品,轉載請標明:http://blog.csdn.net/Xiejingfa/article/details/51111230 今天為大家帶來Redis中zi

Redisredis介紹,安裝,以及叢集搭建

  1.Redis介紹 百科定義:Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value 資料庫,並提供多種語言的API。 個人理解:高效能的快取資料庫,資料存放在記憶體中,存取效能極高,有很多種應用場景,比如可以

windows下scrapy安裝問題,以及Twisted安裝報錯(error: Microsoft Visual C++ 14.0 is required.)完美解決辦法

方法1(通常是失敗的) 1. 命令列執行: pip3 install scrapy 不管是網路問題也好,缺少相關的包也好,用這條命令安裝scrapy我就沒成功過。。。難受 方法2(成功) 手動安裝相關的包。 1. lxml安裝命令(沒問題): pip3 install lxml

今天的工作任務是redis的配置以及工具類的完善

1. 什麼是Redis的AOF? AOF是AppendOnly File的縮寫,是Redis系統提供了一種記錄Redis操作的持久化方案,在AOF生成的檔案中,將忠實記錄發生在Redis的操作,從而達到在Redis伺服器重啟或者當機之後,繼續恢復之前資料狀態的機制。   以

單機版的redis的安裝以及redis生產環境啟動方案

▌大綱 1、安裝單機版的redis 2、redis的生產環境啟動方案 3、redis cli的使用   ▌1、安裝單機版redis wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz tar -zx

redis主從複製以及哨兵機制

環境準備 搭建單臺redis以及使用: https://blog.csdn.net/qq_38270106/article/details/83049130 再clone兩臺虛擬機器 我這裡三臺虛擬機器IP如下 192.168.33.130(主) 192.168

Redis資料結構以及Strings型操作

Redis資料結構圖: Strings型   <String key,String value>: keys *   檢視所有key get    獲取key的value值 append   向key對應的value追加內容