本文地址:http://www.reibang.com/p/4cccd00072f8
簡介
Scrapy
是一個開源的爬蟲框架,目前在Python爬蟲領域基本處于一家獨大的地位危虱,只要說起Python的開源爬蟲框架,那基本指的都是Scrapy
譬胎。
在Scrapy
的官網(wǎng)上,則宣稱的是Scrapy
是一個快速、簡單锋八、容易擴展的爬蟲框架挂捅。Scrapy
確實是容易擴展的芹助,通過各種管道(Pipeline)和中間件(Middleware),能夠非常方便的擴展Scrapy
的功能。但其實相對來說状土,做一些簡單的无蜂、抓取量小的任務時,Scrapy
是比較笨重的蒙谓,這種任務更適合使用Requests
去做斥季。
而如果你抓取的數(shù)據(jù)量較大的話,使用Scrapy
是非常合適的累驮,因為底層是基于Twisted
泻肯,所以Scrapy
是天生異步的,就基本不用再去額外的考慮并發(fā)的問題了慰照。同時它提供了對于爬蟲來說非常全面的功能灶挟,而且擴展功能跟二次定制也很方便。配合類似于Scrapy-redis
之類的庫也可以很簡單的實現(xiàn)分布式的爬蟲毒租。
安裝
在Linux以及Mac系統(tǒng)上稚铣,安裝Scrapy
非常方便,使用pip安裝即可:
pip install Scrapy
但是如果在windows系統(tǒng)上安裝的話墅垮,會遇到一個非常麻煩的問題惕医,Scrapy
的依賴庫Twisted
安裝不上,會導致安裝失敗算色。這個問題可以用以下辦法解決抬伺。
-
到下面這個網(wǎng)址去下載
Twisted
已經(jīng)編譯好的wheel文件安裝,安裝好后再使用pip安裝Scrapy
灾梦。https://www.lfd.uci.edu/~gohlke/pythonlibs/
wheel文件的安裝方法請自行百度峡钓。
架構
Scrapy
的整體運行流程如下圖所示:
組件
Scrapy
的很大一個優(yōu)點就是其組織架構清晰,整體結構由一個個組件構成若河,每個組件負責各自的功能能岩。
其主要的運行流程中有如下幾個最主要的組件:
-
Engine
引擎,整個爬蟲系統(tǒng)的數(shù)據(jù)流程處理萧福,都由
Engine
來進行觸發(fā) 拉鹃,是Scrapy
的核心。 -
Scheduler
調度器鲫忍,負責維護Request的隊列膏燕,將
Engine
傳遞過來的Request放入隊列之中,并在Engine
請求時將一個Request交給Engine
悟民。 -
Downloader
下載器坝辫,根據(jù)接收到的Request,去下載相應的網(wǎng)頁內(nèi)容逾雄,并生成Response返回給
Spider
阀溶。 -
Spider
爬蟲,這個部分常常由我們自己編寫鸦泳,在
Spider
中需要定義網(wǎng)頁抓取和解析的所有流程和規(guī)則银锻。 -
Item
數(shù)據(jù),也就是在
Spider
中抓取網(wǎng)頁并解析后做鹰,我們最終要獲得的數(shù)據(jù)結果击纬,在Scrapy
中專門定義了這樣一個數(shù)據(jù)結構用于保存抓取到的數(shù)據(jù)。格式和使用方式與字典類似钾麸。 -
Item Pipeline
數(shù)據(jù)管道更振,負責處理在
Spider
中得到的Item
。這個Pipeline
主要用處就是清洗數(shù)據(jù)饭尝,處理數(shù)據(jù)肯腕,存儲數(shù)據(jù)。 -
Downloader Middleware
下載器中間件钥平,處于
Downloader
與Engine
之間实撒。 -
Spider Middleware
爬蟲中間件,處于
Spider
和Engine
之間涉瘾。
數(shù)據(jù)流
在Scrapy
中知态,數(shù)據(jù)流基本由Engine
控制,Engine
就好像一顆心臟立叛,不斷地推動整個數(shù)據(jù)流的流動负敏。以下是數(shù)據(jù)流的基本流程:
Engine
首先會打開一個起始url,并找到相對應的Spider
來處理這個url訪問返回的響應結果秘蛇。在
Spider
的處理過程中其做,會將接下來要訪問的url包裝成Request,Engine
會將Request從Spider
取出赁还,交給Scheduler
進行調度庶柿。Engine
從Scheduler
獲取一個Request。Engine
將獲取到的Request經(jīng)由下載器中間件(Downloader Middleware)發(fā)送給Downloader
進行下載并生成相應的Response秽浇。Engine
從Downloader
獲取一個Response浮庐。-
Engine
將獲取的Response經(jīng)由爬蟲中間件(Spider Middleware)發(fā)送給相對應的Spider
,由Spider
來對Response進行解析柬焕。在解析過程中审残,可能會產(chǎn)生兩種產(chǎn)物,一種是
Item
斑举,一種是Request搅轿。產(chǎn)生的Request會再次沿著步驟1的流程運行下去,而產(chǎn)生的Item
則會進入下一步富玷。 Engine
從Spider
獲取一個Item
璧坟。-
Engine
將獲取的Item
發(fā)送給Item Pipeline
進行相對應的存儲既穆、清洗等處理。Item Pipeline
處理的過程中雀鹃,同樣可能會生成新的Request幻工,這時候生成的Request會直接放入Scheduler
中,從步驟3再次執(zhí)行下去黎茎。
使用方式
Scrapy
的主要使用方式是命令行囊颅,例如,開始一個Scrapy
爬蟲的第一步是創(chuàng)建一個Scrapy
項目傅瞻,而這一步需要使用命令行來完成踢代,在命令行中輸入以下命令:
scrapy startproject projectname
projectname
則是你創(chuàng)建的項目的名稱,命令執(zhí)行之后會在當前目錄下生成一個如下結構的目錄:
projectname/
scrapy.cfg # 部署的配置文件
projectname/ # 項目的Python模塊嗅骄,導入自己代碼的話需要從這里導入
spiders/ # 一個將會存放你的爬蟲的目錄
__init__.py
__init__.py
items.py # 配置Item的文件
middlewares.py # 配置中間件的文件
pipelines.py # 配置管道的文件
settings.py # 項目的配置文件
這個目錄相當于是一個Scrapy
給你定制好的模板胳挎,節(jié)省了我們許多的時間,我們只需要按照Scrapy
的規(guī)則在相應的文件中編寫代碼溺森,就可以很快速的完成一個爬蟲項目串远。
在創(chuàng)建好了項目后,就要開始編寫爬蟲了儿惫,同樣的澡罚,Scrapy
提供了一個命令,能讓我們快速的生成一個Spider
模板放到spiders
目錄中肾请,cd到項目目錄中留搔,輸入以下命令:
scrapy genspider spidername mydomain.com
spidername
指的是你創(chuàng)建的Spider
名稱,mydomain.com
則是你這個爬蟲抓取目標的域名铛铁。
命令執(zhí)行后會在spiders
目錄下生成一個如下的spidername.py
文件:
# -*- coding: utf-8 -*-
import scrapy
class SpidernameSpider(scrapy.Spider):
name = 'spidername'
allowed_domains = ['mydomain.com']
start_urls = ['http://mydomain.com/']
def parse(self, response):
pass
這就是一個標準的Spider
模板了隔显,具體如何在這個模版中編寫Spider
,在之后的文章中會詳細講到饵逐。
在寫好Spider
之后括眠,就可以使用命令來運行這個Spider
了:
scrapy crawl spidername
從這里開始,你的爬蟲就可以歡快的開始運行了倍权。
系列文章: