1. 程式人生 > >scrapy-redis基礎和介紹

scrapy-redis基礎和介紹

我是基於最新版本(0.6版)的 scrapy-redis 來胡說八道的

一、scrapy-redis(0.6)依賴的環境

Scrapy >= 1.0.0                #終於過了1版本,這個太重要了,總算坑小了點,感謝那些為了解決各種scrapy與scrapy-redis不相容做出了貢獻的開發者和博主。
redis-py >= 2.10.0
redis server >= 2.8.0

0.6版本的主要更新內容是更新程式碼以支援Scrapy 1.0; 增加了-a domain=... option for example spiders.

官方原始碼

二、scrapy-redis的作用和特點

作用:scrapy-redis為Scrapy提供Redis-backed元件

特點: 可以啟動多個爬蟲例項共享一個單一的 redis佇列。最適合廣泛的多域爬蟲。

分散式的post處理。scrapy到的items放入一個redis佇列意味著可以分享這個items佇列,並在其中啟用足夠多的post處理程序。

三、scrapy和scrapy-redis的區別與元件的意義

scrapy 是一個通用的爬蟲框架 scrapy-redis是為了更方便地實現scrapy分散式爬取,而提供了一些以redis為基礎的元件(僅有元件) scrapy-redis提供了下面四種元件(components):(四種元件意味著這四個模組都要做相應的修改
) Scheduler Duplication FilterItem PipelineBase Spider

scrapy改造了python本來的collection.deque形成了自己的scrqueue(得意自己取得名字) 傳送門:queuelib/queuelib/queue.py原始碼
scrapy多個spider不能共享待爬取佇列scrqueue, 即scrapy本身不支援爬蟲分散式,解決是把這個scrqueue換成redis資料庫也是指redis佇列),從同一個redis-server存放要爬取的request,便能讓多個spider去同一個資料庫裡讀取。 scrapy中跟“待爬佇列”直接相關的就是排程器“
Scheduler
”,它負責對新的request進行入列操作(加入scrqueue),取出下一個要爬取的request(從scrqueue中取出)等操作。它把待爬佇列按照優先順序建立了一個字典結構,比如:
{
priority0:佇列0
priority1:佇列2
priority2:佇列2
}
然後根據request中的priority屬性,來決定該入哪個佇列。而出列時,則按priority較小的優先出列。為了管理這個比較高階的佇列字典,Scheduler需要提供一系列的方法。原來的Scheduler已經無法使用(被替換掉了,注意上一個紅色欄位),所以使用scrapy-redis的scheduler元件。 scrapy中用集合實現這個request去重功能,scrapy中把已經發送的request指紋放入到一個集合中,把下一個request的指紋拿到集合中比對,如果該指紋存在於集合中,說明這個request傳送過了,如果沒有則繼續操作。(原始碼傳送)這個核心的判重功能是這樣實現的:
</pre></div></blockquote><pre name="code" class="plain">def request_seen(self, request):
    #self.figerprints就是一個指紋集合
    fp = self.request_fingerprint(request)
    if fp in self.fingerprints:#這就是判重的核心操作。
        return True
    self.fingerprints.add(fp)
    ......

在scrapy-redis中去重是由Duplication Filter元件來實現的。

四、最快的安裝和啟用

安裝:

$ pip install scrapy-redis 
或者 
$ git clone https://github.com/darkrho/scrapy-redis.git
$ cd scrapy-redis
$ python setup.py install
  在 settings.py 中啟用元件們:
</pre></blockquote><pre name="code" class="plain"># Enables scheduling storing requests queue in redis.
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
</pre></div></blockquote><blockquote style="margin:0 0 0 40px; border:none; padding:0px"><div><span style="white-space:pre"></span><pre code_snippet_id="1682225" snippet_file_name="blog_20160513_16_2220405" name="code" class="python"># Don't cleanup redis queues, allows to pause/resume crawls.
SCHEDULER_PERSIST = True
</pre></div></blockquote><blockquote style="margin:0 0 0 40px; border:none; padding:0px"><div><span style="white-space:pre"></span><pre code_snippet_id="1682225" snippet_file_name="blog_20160513_19_5349541" name="code" class="python"># Schedule requests using a priority queue. (default)
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'
</pre></div></blockquote><blockquote style="margin:0 0 0 40px; border:none; padding:0px"><div><span style="white-space:pre"></span><pre code_snippet_id="1682225" snippet_file_name="blog_20160513_22_4193298" name="code" class="python"># Schedule requests using a queue (FIFO).
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderQueue'
</pre></div></blockquote><blockquote style="margin:0 0 0 40px; border:none; padding:0px"><div><span style="white-space:pre"></span><pre code_snippet_id="1682225" snippet_file_name="blog_20160513_25_5337568" name="code" class="python"># Schedule requests using a stack (LIFO).
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderStack'
</pre></div></blockquote><blockquote style="margin:0 0 0 40px; border:none; padding:0px"><div><span style="white-space:pre"></span><pre code_snippet_id="1682225" snippet_file_name="blog_20160513_28_6547876" name="code" class="python"># 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
</pre></div></blockquote><blockquote style="margin:0 0 0 40px; border:none; padding:0px"><div><span style="white-space:pre"></span><pre code_snippet_id="1682225" snippet_file_name="blog_20160513_33_5980278" name="code" class="python"># Store scraped item in redis for post-processing.
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 300
}
</pre></div></blockquote><blockquote style="margin:0 0 0 40px; border:none; padding:0px"><div><span style="white-space:pre"></span><pre code_snippet_id="1682225" snippet_file_name="blog_20160513_38_8651283" name="code" class="python"># Specify the host and port to use when connecting to Redis (optional).
REDIS_HOST = 'localhost'
REDIS_PORT = 6379
</pre></div></blockquote><blockquote style="margin:0 0 0 40px; border:none; padding:0px"><div><span style="white-space:pre"></span><pre code_snippet_id="1682225" snippet_file_name="blog_20160513_42_1638716" name="code" class="python"># Specify the full Redis URL for connecting (optional).
# If set, this takes precedence over the REDIS_HOST and REDIS_PORT settings.
REDIS_URL = 'redis://user:[email protected]:9001'

五、通過redis來餵飽爬蟲們~

scrapy_redis.spiders.RedisSpider類啟用了爬蟲通過redis得到urls,這些在redis佇列中的爬蟲將會一個接一個的被處理,!!如果第一個request產生了更多的request,爬蟲會先處理這些請求,再從redis佇列中抓取其他url。

上面偷懶,這裡舉個栗子:建立 couxiaoxiao.py

from scrapy_redis.spiders import RedisSpider
</pre></div><div><pre code_snippet_id="1682225" snippet_file_name="blog_20160513_47_2390110" name="code" class="python">class MySpider(RedisSpider):
    name = 'myspider'
</pre></div><div><pre code_snippet_id="1682225" snippet_file_name="blog_20160513_50_2662327" name="code" class="python">    def parse(self, response):
        # do stuff
        pass
執行爬蟲
scrapy runspider myspider.py
向redis中裝入url們
redis-cli lpush myspider:start_urls http://xiaowangzhi.com

六、內容待續。。。有關注的技術方向請評論

相關推薦

scrapy-redis基礎介紹

我是基於最新版本(0.6版)的 scrapy-redis 來胡說八道的 一、scrapy-redis(0.6)依賴的環境 Scrapy >= 1.0.0                #終於過了1版本,這個太重要了,總算坑小了點,感謝那些為了解決各種scrapy

python之scrapy(一)基礎入門

Scrapy框架的使用 一、 Scrapy框架的介紹 Scrapy是一個基於 Twisted 非同步處理的框架,是一個純python的網路爬蟲框架,是一個為了爬取網站資料,提取結構性資料而編寫的應用框架。 其可以應用在資料探勘,資訊處理或儲存歷史資料等一系列的程式中。其最初是為了頁面抓取 (

Redis基礎安裝教程

為什麼使用NoSQL? 今天我們可以通過第三方平臺,可以很容易的訪問和抓取資料。使用者的個人資訊,社交網路,地理位置,使用者生成的資料和使用者操作日誌已經成倍的增加。我們如果要對這些使用者資料進行挖掘,那SQL資料庫已經不適合這些應用了, NoSQL資料庫的發展

redis的使用安裝,redis基礎高階部分

在後端開發中,為了提高效能,對於一些經常查詢但是又不太變化的內容會使用redis,比如前端的列表展示項等,如果資料有變化也可以清空快取,讓前端查一次資料庫,所以使用redis相對高效和靈活.本文主要對於redis在linux上的使用和安裝進行說明。 1.r

Redis-基礎應用篇

> 2020,到新公司這一年多以來,更新文章和總結知識的習慣被丟掉了。我覆盤了下自己,原因不是公司技術氛圍不好,也不是每天業務需求太多,其根本原因還是---惰性。作為我們技術人隨著年齡的增長,精力也會被生活中許多瑣碎的事情分散,但我們不應該忘記當初寫下第一行程式碼時的初衷。我們一定要明白持之以恆、長遠規劃、階

Redis安裝基礎介紹

不同類 src 遠程 inline 不安裝 ora tracking 一個 snippets 一:初識Redis   Redis是一個遠程內存數據庫,它不僅性能強勁,而且還具有復制特性以及為解決問題而生的獨一無二的數據模型。Redis提供了5種不同類型的數據結構,各式各樣的

Scrapy基礎 第三節:Scrapy框架結構元件介紹

前置知識: 掌握Python的基礎知識 對爬蟲基礎有一定了解 說明: 執行環境 Win10,Python3 64位 目錄: 1 Scrapy框架組成結構 2 Scapry資料流程 Scrap

scrapy基礎知識之 Scrapy-Redis分布式策略:

空間 spider head spi 指紋 負責 edi all redis Scrapy-Redis分布式策略: 假設有四臺電腦:Windows 10、Mac OS X、Ubuntu 16.04、CentOS 7.2,任意一臺電腦都可以作為 Master端 或 Slave

Shell基礎介紹、歷史命令、命令不全別名、通配符、輸入輸入重定向、管道發作業控制

基礎 一個 直接 1.5 寫到 否則 shel attr tle Shell的介紹 zsh、ksh(yum list |grep zsh 進行查看,然後可以相應的進行安裝) 命令歷史1. /root/.b

Python基礎語法介紹 - 面向對象(下)異常處理

Python3.6.5 面向對象 概述: 上一節主要介紹了面向對象的一些基本概念:類,類的組成元素“方法和屬性”,類的特性“繼承,多態和封裝”。這一節課分為兩部分:(一)類方法及調用,靜態方法及調用,單例類(二)異常處理 第一部分:類方法、靜態方法和單例類 類方法及調用 (1)使用@classmet

Scrapy-Redis的安裝使用

org adt tps 擴展模塊 pytho 方便 imp scrapy ins Scrapy-Redis是Scrapy的分布式擴展模塊,有了它,我們就可以方便地實現Scrapy分布式爬蟲的搭建。GitHub:https://github.com/rmax/scrapy-r

redis的資料型別List,其原生命令php操作Redis List函式介紹

List型別介紹 List是簡單的字串列表,按照插入順序排序,可以從列表的兩頭新增資料,一個列表最多可以包含2^32-1個元素(超過40億個元素) List原生命令 命令 命令描述 例項 LPUSH key value1 [va

Scrapy基本架構Scrapy基本部件介紹

  Scrapy是一個為了爬取網站資料,提取結構性資料而編寫的應用框架。 其可以應用在資料探勘,資訊處理或儲存歷史資料等一系列的程式中。 其最初是為了頁面抓取 (更確切來說, 網路抓取 )所設計的, 也可以應用在獲取API所返回的資料(例如 Amazon Associates Web

淺談深度優先廣度優先(scrapy-redis)

首先先談談深度優先和廣度優先的定義 深度優先搜尋演算法(英語:Depth-First-Search,DFS)是一種用於遍歷或搜尋樹或圖的演算法。沿著樹的深度遍歷樹的節點,儘可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有

Redis基礎知識補充及持久化、備份介紹(二)--技術流ken

Redis知識補充  在上一篇部落格《Redis基礎認識及常用命令使用(一)--技術流ken》中已經介紹了redis的一些基礎知識,以及常用命令的使用,本篇部落格將補充一些基礎知識以及redis持久化和備份。   一. 啟用redis的認證功能 第一步:登入red

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

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

scrapy框架 - 基礎概念流程

目標 瞭解學習scrapy的目的 能夠說出非同步和非阻塞的區別 掌握scrapy的流程 1 為什麼要學習scrapy 通過前面的學習,我們已經能夠解決90%的爬蟲問題了,那麼scrapy是為了解決剩下的10%的問題麼,不是,scrapy框架能夠讓我們的爬蟲

資料結構演算法基礎概念介紹

一、什麼是演算法 演算法是指一系列解決問題的清晰指令。 二、演算法特徵 有窮性:演算法必須能夠在執行有限個步驟之後終止 確切性:演算法的每一步都必須要有確切的定義 輸入項:演算法必須有0個或多個輸入,描述演算法執行的初始狀態。0個輸入即演算法本身已經擁有了初始條

爬蟲-scrapy框架簡介基礎應用

一.什麼是Scrapy?   Scrapy是一個為了爬取網站資料,提取結構性資料而編寫的應用框架,非常出名,非常強悍。所謂的框架就是一個已經被集成了各種功能(高效能非同步下載,佇列,分散式,解析,持久化等)的具有很強通用性的專案模板。對於框架的學習,重點是要學習其框架的特性、各個功能的用法即可。 二.安裝

視訊編解碼的理論實踐1:基礎知識介紹

近幾年,視訊編解碼技術在理論及應用方面都取得了重大的進展,越來越多的人想要了解編解碼技術。因此,網易雲信研發工程師為大家進行了歸納梳理,從理論及實踐兩個方面簡單介紹視訊編解碼技術。 相關閱讀推薦 1、視訊介紹 視訊的本質是影象序列,根據視覺暫留的原理