1. 程式人生 > >scrapy-redis介紹(一)

scrapy-redis介紹(一)

scrapy是python裡面一個非常完善的爬蟲框架,實現了非常多的功能,比如記憶體檢測,物件引用檢視,命令列,shell終端,還有各種中介軟體和擴充套件等,相信開發過scrapy的朋友都會覺得這個框架非常的強大。但是它有一個致命的缺點,不支援分散式。所以本文介紹的是scrapy_redis,繼承了scrapy的所有優點,還支援分散式。

1.安裝scrapy

安裝scrapy非常簡單:

sudo pip install scrapy
sudo pip install scrapy_redis

#如果下載的不順利,可以試試這樣,換一個國內的源,下載速度會飆升
sudo pip install --index https://pypi.mirrors
.ustc.edu.cn/simple/ scrapy

在這裡建議開發scrapy_redis使用python 2.7版本,雖然也支援3.x,但總覺得會出bug.

安裝完成,選擇一個恰當的目錄,並進入那個目錄,執行構建專案的命令列即可自動為我們建立一個spider目錄:

scrapy startproject myspider

簡單的一行即可完成。scrapy有非常多的命令列,大家自行去查詢官方文件。

2.scrapy_redis原理

scrapy-redis原理:
1.spider解析下載器下載下來的response,返回item或者是links
2.item或者links經過spidermiddleware的process_spider_out()方法,交給engine。
3.engine將item交給itempipeline,將links交給排程器
4.在排程器中,先將request物件利用scrapy內建的指紋函式,生成一個指紋物件
5.如果request物件中的dont_filter引數設定為False,並且該request物件的指紋不在資訊指紋的佇列中,那麼就把該request物件放到優先順序的佇列中
6.從優先順序佇列中獲取request物件,交給engine
7.engine將request物件交給下載器下載,期間會通過downloadmiddleware的process_request()方法
8.下載器完成下載,獲得response物件,將該物件交給engine,期間會通過downloadmiddleware的process_response()方法
9.engine將獲得的response物件交給spider進行解析,期間會經過spidermiddleware的process_spider_input()方法
10.從第一步開始迴圈

上面的十個步驟就是scrapy-redis的整體框架,與scrapy相差無幾。本質的區別就是,將scrapy的內建的去重的佇列和待抓取的request佇列換成了redis的集合。就這一個小小的改動,就使得了scrapy-redis支援了分散式抓取。

在redis的伺服器中,會至少存在三個佇列:
a.用於請求物件去重的集合,佇列的名稱為spider.name:dupefilter,其中spider.name就是我們自定義的spider的名字,下同。
b.待抓取的request物件的有序集合,佇列的名稱為spider.name:requests
c.儲存提取到item的列表,佇列的名稱為spider.name:items
d.可能存在存放初始url的集合或者是列表,佇列的名稱可能是spider.name:start_urls

如下圖所示
這裡寫圖片描述
我自定義了一個spider,name屬性為myspider。當開始執行這個spider的時候,就可以看到在redis的伺服器中出現了三個佇列的名字,分別用來去重request物件,儲存提取到的item,存放待抓取的request物件。

那至於spider.name:start_urls這個佇列,裡面存放的是我們第一次啟動爬蟲存放的url,注意是url,而不是scrapy.http.Request物件。如果我們只向這個佇列中存放一條初始的url,那麼這個佇列只會短暫的存在。因為redis中,如果一個key中沒有資料了,那麼這個key也就消失了。

當然,如果你本身就很瞭解redis的話,這對於你來說,根本就沒有任何難度。

3.編寫scrapy_redis爬蟲

在編寫基於scrapy-redis的爬蟲的時候,我們既可以繼承自scrapy.spiders.Spider這個類,又或者是scrapy.spiders.CrawlSpider,也可以繼承自scrapy-redis的類,比如scrapy_redis.spiders.RedisSpider。

子類化scrapy自身的類時,還是按照scrapy給出的列子一樣,非常的簡單:

from scrapy.spiders import Spider

class MySpider(Spider):
    name = 'myspider'
    allowed_domains = ['www.example.com']
    start_urls = ['http://www.example.com']

    def parse(self, response):
        #do_something_with_response

這裡有一點需要明確一點,當我們沒有為request物件顯示的指定一個回撥函式時,會使用預設的parse()作為回撥函式。

執行上面的程式碼,我們就可以在redis伺服器看到前面所說的隊列了。

如果我們是子類化scrapy-redis的spider時,情況有些許的不同:

from scrapy_redis,spiders import RedisSpider

class MySpider(RedisSpider):
    name = 'myspider'
    redis_key = 'myspider:start_urls'
    allowed_domains = ['www.example.com']

    def parse(self, response):
        #do_something_with_response     

這裡我們並沒有指定初始url,所以這就需要我們手動的往redis的初始url佇列中新增url,佇列的名稱為myspider:start_urls.預設情況下我們採用集合的命令進行新增,要不然會報錯的。

sadd myspider:start_urls http://www.example.com

通過往這個佇列中新增初始url,爬蟲就會開始運行了。直到沒有任何request物件,或者待抓取的url。

相關推薦

scrapy-redis介紹

scrapy是python裡面一個非常完善的爬蟲框架,實現了非常多的功能,比如記憶體檢測,物件引用檢視,命令列,shell終端,還有各種中介軟體和擴充套件等,相信開發過scrapy的朋友都會覺得這個框架非常的強大。但是它有一個致命的缺點,不支援分散式。所以本文介

redis介紹

字串:string 列表:list 雜湊:hash 集合:set 有序集合:zset   set、get、del   key  設定、獲取、刪除key incr key 設定自增 例如:get key1  取出1,in

Spring Data Redis整體介紹

目前 擴展 刪除 依據 實例化 -m doc 不同的 SDR 為什麽使用Spring Data Redis 首先Spring Data Redis 是Spring 框架提供的用於操作Redis的客戶端。 Spring框架是一個全棧Java程序框架,通過DI、AOP和便攜的服

Scrapy框架學習Scrapy框架介紹

Scrapy框架的架構圖如上。 Scrapy中的資料流由引擎控制,資料流的過程如下: 1.Engine開啟一個網站,找到處理該網站的Sprider,並向該Sprider請求第一個要爬取得URL。 2.Engine從Sprider中獲取到第一個要爬的URL,並通過Scheduler以Requ

scrapy專利爬蟲——scrapy簡單介紹

scrapy專利爬蟲(一)——scrapy簡單介紹 概述 scrapy是一款方便,快捷的開源爬蟲框架。 An open source and collaborative framework for extracting the data you need from w

Redis系列——介紹及安裝配置

Redis簡介 Redis是分散式記憶體資料儲存系統,可以用做資料庫、快取、訊息中介軟體。Redis支援的資料結構有String、List、Set、SortSet、Hash。Redis可以對這些型別執行原子操作。 原子操作是指不會被執行緒排程機制打斷的操作;這種操作一旦開

FreeSWITCH第三方庫音頻的簡單介紹

優勢 帶寬 blog 網絡 ndt 目標 領域 合成 通道 FreeSWITCH使用了大量的第三方庫,本文檔主要介紹音頻相關庫的信息: 視頻相關庫的信息介紹參考:http://www.cnblogs.com/yoyotl/p/5488890.html 其他相關庫的信

23種設計模式介紹---- 創建型模式

接口 ret static 深復制 return 對象 相互 object c png 由於設計模式篇幅比較大,如果在一篇文章講完所有的設計模式的話不利於閱讀。於是我把它分為三篇文章 23種設計模式介紹(一)---- 創建型模式 23種設計模式介紹(二)---- 結構型模

scrapy基本使用

desc 範圍 esc 取數據 source 使用 解析 target logs scrapy基本使用(一) 參考文檔:Scrapy入門教程 http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html

android application類簡單介紹

cati theme text color raw sdn water bsp public 每次應用程序執行時。應用程序的application類保持實例化的狀態。通過擴展applicaiton類,能夠完畢下面3項工作: 1.對android執行時廣播的應用程序

Redis研究—簡介

創始人 存儲結構 隊列 cached tar 寫入 關系 退出 使用 http://blog.csdn.net/wtyvhreal/article/details/41855327 Redis是一個開源的高性能鍵值對數據庫。它通過提供多種鍵值數據類型來適應不同場景下的

Spring Data 介紹

tin 可能 動態 javac 行高 spec 增加 核心概念 一個 簡介   Spring Data是什麽       Spring Data是一個用於簡化數據庫訪問,並支持雲服務的開源框架。其主要目標是使得對數據的訪問變得方便快捷 Spring Data JPA能幹什麽

Nginx之基本介紹

動靜分離 quit 共享內存 oct bytes err 配置文件 默認頁 日誌格式 這是一篇介紹Nginx基本信息和配置文件詳情的文章,適合入門者,如果你想深入了解Nginx請繞道 什麽是Nginx?   Nginx是輕量級,高性能,跨平臺的web服務器 Nginx的特點

.NET中使用Redis之ServiceStack.Redis學習安裝與簡單的運行

arraylist write client cli ring blog 控制臺 創建 spa 1.下載ServiceStack.Redis PM> Install-Package ServiceStack.Redis 2.vs中創建一個控制臺程序 class Pro

機器學習之numpy庫中常用的函數介紹

做的 string idt 維度 數據 round float 數值 array 1. mat() mat()與array的區別: mat是矩陣,數據必須是2維的,是array的子集,包含array的所有特性,所做的運算都是針對矩陣來進行的。 array是數組,數據可以是多

javascript中的DOM介紹

item 檢測 turn 及其 篩選 層次 proto nbsp log 一、基礎知識點 1、DOM是文檔對象模型,是針對HTML和XML文檔的一個API(應用程序接口) 2、DOM描繪了一個層次化的節點數,允許開發人員進行添加,移除個修改等操作 3、IE瀏覽器中所有的DO

redis安裝

adl mit lin limits edi out pan types serve 註:redis版本redis-4.0.2.tar.gz,操作系統centos7 1:解壓redis [root@docker3 local]# tar -zxvf redis-4.

WebSocket 介紹

ive w3c 使用 src 風格 減少 在線遊戲 知識 正在 WebSocket 發起單個請求,服務端不需要等待客服端,客戶端在任何時候也能發消息到服務端,減少了輪詢時候的延遲.經歷一次連接後,服務器能給客戶端發多次。下圖是輪詢與WebSocket的區別。 基於ht

硬件系列之超聲波模塊介紹

返回 精度 就是 包括 發送 平時 自動 距離 c-s HC-SR04模塊可提供2cm-40cm的非接觸式距離感測功能,測距精度可達3mm: 模塊包括超聲波發生器,接收器與控制器,檢測角度30度。 控制方式: 采用IO口TRIG觸發測距,給最少10us的高電平信號 模塊自動

Quartz學習——Quartz大致介紹

方法 clust mark 開始 包含 text fill map 只有一個 1. 介紹Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,是完全由java開發的一個開源的任務日程管理系統,“任務進度管理器”就是一個在預先確定(被