Scrapy框架的使用之Spider的用法

崔慶才丨靜覓發表於2018-05-07

在Scrapy中,要抓取網站的連結配置、抓取邏輯、解析邏輯裡其實都是在Spider中配置的。在前一節例項中,我們發現抓取邏輯也是在Spider中完成的。本節我們就來專門瞭解一下Spider的基本用法。

1. Spider執行流程

在實現Scrapy爬蟲專案時,最核心的類便是Spider類了,它定義瞭如何爬取某個網站的流程和解析方式。簡單來講,Spider要做的事就是如下兩件:

  • 定義爬取網站的動作;

  • 分析爬取下來的網頁。

對於Spider類來說,整個爬取迴圈過程如下所述:

  • 以初始的URL初始化Request,並設定回撥函式。當該Request成功請求並返回時,Response生成並作為引數傳給該回撥函式。

  • 在回撥函式內分析返回的網頁內容。返回結果有兩種形式。一種是解析到的有效結果返回字典或Item物件,它們可以經過處理後(或直接)儲存。另一種是解析得到下一個(如下一頁)連結,可以利用此連結構造Request並設定新的回撥函式,返回Request等待後續排程。

  • 如果返回的是字典或Item物件,我們可通過Feed Exports等元件將返回結果存入到檔案。如果設定了Pipeline的話,我們可以使用Pipeline處理(如過濾、修正等)並儲存。

  • 如果返回的是Reqeust,那麼Request執行成功得到Response之後,Response會被傳遞給Request中定義的回撥函式,在回撥函式中我們可以再次使用選擇器來分析新得到的網頁內容,並根據分析的資料生成Item。

通過以上幾步迴圈往復進行,我們完成了站點的爬取。

2. Spider類分析

在上一節的例子中,我們定義的Spider是繼承自scrapy.spiders.Spiderscrapy.spiders.Spider這個類是最簡單最基本的Spider類,其他Spider必須繼承這個類。還有後面一些特殊Spider類也都是繼承自它。

scrapy.spiders.Spider這個類提供了start_requests()方法的預設實現,讀取並請求start_urls屬性,並根據返回的結果呼叫parse()方法解析結果。它還有如下一些基礎屬性:

  • name。爬蟲名稱,是定義Spider名字的字串。Spider的名字定義了Scrapy如何定位並初始化Spider,它必須是唯一的。不過我們可以生成多個相同的Spider例項,數量沒有限制。name是Spider最重要的屬性。如果Spider爬取單個網站,一個常見的做法是以該網站的域名名稱來命名Spider。例如,Spider爬取mywebsite.com,該Spider通常會被命名為mywebsite。

  • allowed_domains。允許爬取的域名,是可選配置,不在此範圍的連結不會被跟進爬取。

  • start_urls。它是起始URL列表,當我們沒有實現start_requests()方法時,預設會從這個列表開始抓取。

  • custom_settings。它是一個字典,是專屬於本Spider的配置,此設定會覆蓋專案全域性的設定。此設定必須在初始化前被更新,必須定義成類變數。

  • crawler。它是由from_crawler()方法設定的,代表的是本Spider類對應的Crawler物件。Crawler物件包含了很多專案元件,利用它我們可以獲取專案的一些配置資訊,如最常見的獲取專案的設定資訊,即Settings。

  • settings。它是一個Settings物件,利用它我們可以直接獲取專案的全域性設定變數。

除了基礎屬性,Spider還有一些常用的方法:

  • start_requests()。此方法用於生成初始請求,它必須返回一個可迭代物件。此方法會預設使用start_urls裡面的URL來構造Request,而且Request是GET請求方式。如果我們想在啟動時以POST方式訪問某個站點,可以直接重寫這個方法,傳送POST請求時使用FormRequest即可。

  • parse()。當Response沒有指定回撥函式時,該方法會預設被呼叫。它負責處理Response,處理返回結果,並從中提取出想要的資料和下一步的請求,然後返回。該方法需要返回一個包含Request或Item的可迭代物件。

  • closed()。當Spider關閉時,該方法會被呼叫,在這裡一般會定義釋放資源的一些操作或其他收尾操作。

3. 結語

以上內容可能不太好理解。不過不用擔心,後面會有很多使用這些屬性和方法的例項。通過這些例項,我們慢慢熟練掌握它們。



本資源首發於崔慶才的個人部落格靜覓: Python3網路爬蟲開發實戰教程 | 靜覓

如想了解更多爬蟲資訊,請關注我的個人微信公眾號:進擊的Coder

weixin.qq.com/r/5zsjOyvEZ… (二維碼自動識別)


相關文章