天天看點

使用Scrapy抓取資料1. 安裝2. 使用 Scrapy3. 學習資料4. 總結

scrapy是python開發的一個快速,高層次的螢幕抓取和web抓取架構,用于抓取web站點并從頁面中提取結構化的資料。scrapy用途廣泛,可以用于資料挖掘、監測和自動化測試。

scrapy 使用了 twisted 異步網絡庫來處理網絡通訊。整體架構大緻如下(注:圖檔來自網際網路):

使用Scrapy抓取資料1. 安裝2. 使用 Scrapy3. 學習資料4. 總結

scrapy主要包括了以下元件:

引擎,用來處理整個系統的資料流處理,觸發事務。

排程器,用來接受引擎發過來的請求,壓入隊列中,并在引擎再次請求的時候傳回。

下載下傳器,用于下載下傳網頁内容,并将網頁内容傳回給蜘蛛。

蜘蛛,蜘蛛是主要幹活的,用它來制訂特定域名或網頁的解析規則。

項目管道,負責處理有蜘蛛從網頁中抽取的項目,他的主要任務是清晰、驗證和存儲資料。當頁面被蜘蛛解析後,将被發送到項目管道,并經過幾個特定的次序處理資料。

下載下傳器中間件,位于scrapy引擎和下載下傳器之間的鈎子架構,主要是處理scrapy引擎與下載下傳器之間的請求及響應。

蜘蛛中間件,介于scrapy引擎和蜘蛛之間的鈎子架構,主要工作是處理蜘蛛的響應輸入和請求輸出。

排程中間件,介于scrapy引擎和排程之間的中間件,從scrapy引擎發送到排程的請求和響應。

使用scrapy可以很友善的完成網上資料的采集工作,它為我們完成了大量的工作,而不需要自己費大力氣去開發。

scrapy 目前最新版本為0.22.2,該版本需要 python 2.7,故需要先安裝 python 2.7。這裡我使用 centos 伺服器來做測試,因為系統自帶了 python ,需要先檢查 python 版本。

檢視python版本:

更新版本到2.7:

建立軟連接配接,使系統預設的 python指向 python2.7

再次檢視python版本:

scrapy 使用了 twisted 異步網絡庫來處理網絡通訊,故需要安裝 twisted。

安裝 twisted 前,需要先安裝 gcc:

然後,再通過 easy_install 安裝 twisted:

如果出現下面錯誤:

請安裝 python-devel 然後再次運作:

如果出現下面異常:

先安裝一些依賴:

然後,再通過 easy_install 安裝 pyopenssl:

最後再來安裝 scrapy :

在安裝成功之後,你可以了解一些 scrapy 的基本概念和使用方法,并學習 scrapy 項目的例子 dirbot 。

下面以該例子來描述如何使用 scrapy 建立一個爬蟲項目。

在抓取之前,你需要建立一個 scrapy 工程。進入一個你想用來儲存代碼的目錄,然後執行:

這個指令會在目前目錄下建立一個新目錄 tutorial,它的結構如下:

這些檔案主要是:

scrapy.cfg: 項目配置檔案

tutorial/: 項目python子產品, 呆會代碼将從這裡導入

tutorial/items.py: 項目items檔案

tutorial/pipelines.py: 項目管道檔案

tutorial/settings.py: 項目配置檔案

tutorial/spiders: 放置spider的目錄

items是将要裝載抓取的資料的容器,它工作方式像 python 裡面的字典,但它提供更多的保護,比如對未定義的字段填充以防止拼寫錯誤。

它通過建立一個 <code>scrapy.item.item</code> 類來聲明,定義它的屬性為 <code>scrpy.item.field</code> 對象,就像是一個對象關系映射(orm). 我們通過将需要的item模型化,來控制從 dmoz.org 獲得的站點資料,比如我們要獲得站點的名字,url 和網站描述,我們定義這三種屬性的域。要做到這點,我們編輯在 tutorial 目錄下的 items.py 檔案,我們的 item 類将會是這樣

剛開始看起來可能會有些困惑,但是定義這些 item 能讓你用其他 scrapy 元件的時候知道你的 items 到底是什麼。

spider 是使用者編寫的類,用于從一個域(或域組)中抓取資訊。們定義了用于下載下傳的url的初步清單,如何跟蹤連結,以及如何來解析這些網頁的内容用于提取items。

要建立一個 spider,你可以為 <code>scrapy.spider.basespider</code> 建立一個子類,并确定三個主要的、強制的屬性:

<code>name</code>:爬蟲的識别名,它必須是唯一的,在不同的爬蟲中你必須定義不同的名字.

<code>start_urls</code>:爬蟲開始爬的一個 url 清單。爬蟲從這裡開始抓取資料,是以,第一次下載下傳的資料将會從這些 urls 開始。其他子 url 将會從這些起始 url 中繼承性生成。

<code>parse()</code>:爬蟲的方法,調用時候傳入從每一個 url 傳回的 response 對象作為參數,response 将會是 parse 方法的唯一的一個參數,

這個方法負責解析傳回的資料、比對抓取的資料(解析為 item )并跟蹤更多的 url。

在 tutorial/spiders 目錄下建立 dmozspider.py

該指令從 dmoz.org 域啟動爬蟲,第三個參數為 dmozspider.py 中的 name 屬性值。

這是一些xpath表達式的例子和他們的含義:

<code>/html/head/title</code>: 選擇html文檔 <code>&lt;head&gt;</code> 元素下面的 <code>&lt;title&gt;</code> 标簽。

<code>/html/head/title/text()</code>: 選擇前面提到的<code> &lt;title&gt;</code> 元素下面的文本内容

<code>//td</code>: 選擇所有 <code>&lt;td&gt;</code> 元素

<code>//div[@class="mine"]</code>: 選擇所有包含 <code>class="mine"</code> 屬性的div 标簽元素

為了友善使用 xpaths,scrapy 提供 selector 類, 有三種方法

<code>xpath()</code>:傳回selectors清單, 每一個select表示一個xpath參數表達式選擇的節點.

<code>extract()</code>:傳回一個unicode字元串,該字元串為xpath選擇器傳回的資料

<code>re()</code>: 傳回unicode字元串清單,字元串作為參數由正規表達式提取出來

<code>css()</code>

我們可以通過如下指令選擇每個在網站中的 <code>&lt;li&gt;</code> 元素:

然後是網站描述:

網站标題:

網站連結:

如前所述,每個 <code>xpath()</code> 調用傳回一個 selectors 清單,是以我們可以結合 <code>xpath()</code> 去挖掘更深的節點。我們将會用到這些特性,是以:

<code>scrapy.item.item</code> 的調用接口類似于 python 的 dict ,item 包含多個 <code>scrapy.item.field</code>。這跟 django 的 model 與

item 通常是在 spider 的 parse 方法裡使用,它用來儲存解析到的資料。

最後修改爬蟲類,使用 item 來儲存資料,代碼如下:

現在,可以再次運作該項目檢視運作結果:

在 settings.py 中設定 <code>item_pipelines</code>,其預設為<code>[]</code>,與 django 的 <code>middleware_classes</code> 等相似。 從 spider 的 parse 傳回的 item 資料将依次被<code>item_pipelines</code> 清單中的 pipeline 類處理。

一個 item pipeline 類必須實作以下方法:

<code>process_item(item, spider)</code> 為每個 item pipeline 元件調用,并且需要傳回一個 <code>scrapy.item.item</code> 執行個體對象或者抛出一個 <code>scrapy.exceptions.dropitem</code> 異常。當抛出異常後該 item 将不會被之後的 pipeline 處理。參數:

<code>item (item object)</code> – 由 parse 方法傳回的 item 對象

<code>spider (basespider object)</code> – 抓取到這個 item 對象對應的爬蟲對象

也可額外的實作以下兩個方法:

<code>open_spider(spider)</code> 當爬蟲打開之後被調用。參數: <code>spider (basespider object)</code> – 已經運作的爬蟲

<code>close_spider(spider)</code> 當爬蟲關閉之後被調用。參數: <code>spider (basespider object)</code> – 已經關閉的爬蟲

除了 json 格式之外,還支援 json lines、csv、xml格式,你也可以通過接口擴充一些格式。

對于小項目用這種方法也足夠了。如果是比較複雜的資料的話可能就需要編寫一個 item pipeline 進行處理了。

所有抓取的 items 将以 json 格式被儲存在新生成的 items.json 檔案中

這篇文章中的爬蟲類代碼如下:

需要說明的是:

該爬蟲類繼承的是 <code>crawlspider</code> 類,并且定義規則,rules指定了含有 <code>/articles/.*\.htm</code> 的連結都會被比對。

該類并沒有實作parse方法,并且規則中定義了回調函數 <code>parse_page</code>,你可以參考更多資料了解 crawlspider 的用法

接觸 scrapy,是因為想爬取一些知乎的資料,最開始的時候搜尋了一些相關的資料和别人的實作方式。

github 上已經有人或多或少的實作了對知乎資料的爬取,我搜尋到的有以下幾個倉庫:

<a href="https://github.com/tangerinewhite32/zhihu-stat-py" target="_blank">https://github.com/tangerinewhite32/zhihu-stat-py</a>

其他資料:

<a href="http://zihaolucky.github.io/using-python-to-build-zhihu-cralwer/" target="_blank">用python requests抓取知乎使用者資訊</a>

<a href="http://www.it165.net/pro/html/201405/13112.html" target="_blank">使用scrapy架構爬取自己的博文</a>

<a href="http://github.windwild.net/2013/03/scrapy002/" target="_blank">scrapy 深入一點點</a>

<a href="http://www.kankanews.com/ickengine/archives/94817.shtml" target="_blank">使用python,scrapy寫(定制)爬蟲的經驗,資料,雜。</a>

<a href="http://blog.pluskid.org/?p=366&amp;cpage=1" target="_blank">scrapy 輕松定制網絡爬蟲</a>

<a href="http://my.oschina.net/chengye/blog/124162" target="_blank">在scrapy中怎麼讓spider自動去抓取豆瓣小組頁面</a>

scrapy 和 javascript 互動例子:

<a href="http://www.xuebuyuan.com/2017949.html" target="_blank">用scrapy架構爬取js互動式表格資料</a>

<a href="http://wsky.org/archives/211.html" target="_blank">scrapy + selenium 解析javascript 執行個體</a>

還有一些待整理的知識點:

如何先登陸再爬資料

如何使用規則做過濾

如何遞歸爬取資料

scrapy的參數設定和優化

如何實作分布式爬取

以上就是最近幾天學習 scrapy 的一個筆記和知識整理,參考了一些網上的文章才寫成此文,對此表示感謝,也希望這篇文章能夠對你有所幫助。如果你有什麼想法,歡迎留言;如果喜歡此文,請幫忙分享,謝謝!