在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.Spider
。scrapy.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… (二維碼自動識別)