Scrapy-1.強大與全面的Python爬蟲開源框架

本文地址:http://www.reibang.com/p/4cccd00072f8

圖標.png

簡介

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安裝不上,會導致安裝失敗算色。這個問題可以用以下辦法解決抬伺。

  1. 到下面這個網(wǎng)址去下載Twisted已經(jīng)編譯好的wheel文件安裝,安裝好后再使用pip安裝Scrapy灾梦。

    https://www.lfd.uci.edu/~gohlke/pythonlibs/

    wheel文件的安裝方法請自行百度峡钓。


架構

Scrapy的整體運行流程如下圖所示:

架構圖.png

組件

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

    下載器中間件钥平,處于DownloaderEngine之間实撒。

  • Spider Middleware

    爬蟲中間件,處于SpiderEngine之間涉瘾。

數(shù)據(jù)流

Scrapy中知态,數(shù)據(jù)流基本由Engine控制,Engine就好像一顆心臟立叛,不斷地推動整個數(shù)據(jù)流的流動负敏。以下是數(shù)據(jù)流的基本流程:

  1. Engine首先會打開一個起始url,并找到相對應的Spider來處理這個url訪問返回的響應結果秘蛇。

  2. Spider的處理過程中其做,會將接下來要訪問的url包裝成Request,Engine會將Request從Spider取出赁还,交給Scheduler進行調度庶柿。

  3. EngineScheduler獲取一個Request。

  4. Engine將獲取到的Request經(jīng)由下載器中間件(Downloader Middleware)發(fā)送給Downloader進行下載并生成相應的Response秽浇。

  5. EngineDownloader獲取一個Response浮庐。

  6. Engine將獲取的Response經(jīng)由爬蟲中間件(Spider Middleware)發(fā)送給相對應的Spider,由Spider來對Response進行解析柬焕。

    在解析過程中审残,可能會產(chǎn)生兩種產(chǎn)物,一種是Item斑举,一種是Request搅轿。產(chǎn)生的Request會再次沿著步驟1的流程運行下去,而產(chǎn)生的Item則會進入下一步富玷。

  7. EngineSpider獲取一個Item璧坟。

  8. 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

從這里開始,你的爬蟲就可以歡快的開始運行了倍权。


系列文章:

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掷豺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子薄声,更是在濱河造成了極大的恐慌当船,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件默辨,死亡現(xiàn)場離奇詭異德频,居然都是意外死亡,警方通過查閱死者的電腦和手機缩幸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門壹置,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竞思,“玉大人,你說我怎么就攤上這事钞护「桥纾” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵患亿,是天一觀的道長。 經(jīng)常有香客問我押逼,道長步藕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任挑格,我火速辦了婚禮咙冗,結果婚禮上,老公的妹妹穿的比我還像新娘漂彤。我一直安慰自己雾消,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布挫望。 她就那樣靜靜地躺著立润,像睡著了一般。 火紅的嫁衣襯著肌膚如雪媳板。 梳的紋絲不亂的頭發(fā)上桑腮,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音蛉幸,去河邊找鬼破讨。 笑死,一個胖子當著我的面吹牛奕纫,可吹牛的內(nèi)容都是我干的提陶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匹层,長吁一口氣:“原來是場噩夢啊……” “哼隙笆!你這毒婦竟也來了?” 一聲冷哼從身側響起升筏,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仲器,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后仰冠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乏冀,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年洋只,在試婚紗的時候發(fā)現(xiàn)自己被綠了辆沦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昼捍。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肢扯,靈堂內(nèi)的尸體忽然破棺而出妒茬,到底是詐尸還是另有隱情,我是刑警寧澤蔚晨,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布乍钻,位于F島的核電站,受9級特大地震影響铭腕,放射性物質發(fā)生泄漏银择。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一累舷、第九天 我趴在偏房一處隱蔽的房頂上張望浩考。 院中可真熱鬧,春花似錦被盈、人聲如沸析孽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袜瞬。三九已至,卻和暖如春身堡,著一層夾襖步出監(jiān)牢的瞬間吞滞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工盾沫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留裁赠,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓赴精,卻偏偏與公主長得像佩捞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蕾哟,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354