在Scrapy中,要抓取網站的連接配置、抓取邏輯、解析邏輯裏其實都是在Spider中配置的。在前一節實例中,咱們發現抓取邏輯也是在Spider中完成的。本節咱們就來專門瞭解一下Spider的基本用法。
web
在實現Scrapy爬蟲項目時,最核心的類即是Spider
類了,它定義瞭如何爬取某個網站的流程和解析方式。簡單來說,Spider
要作的事就是以下兩件:
app
定義爬取網站的動做;dom
分析爬取下來的網頁。scrapy
對於Spider
類來講,整個爬取循環過程以下所述:ide
以初始的URL初始化Request,並設置回調函數。當該Request成功請求並返回時,Response生成並做爲參數傳給該回調函數。函數
在回調函數內分析返回的網頁內容。返回結果有兩種形式。一種是解析到的有效結果返回字典或Item對象,它們能夠通過處理後(或直接)保存。另外一種是解析獲得下一個(以下一頁)連接,能夠利用此連接構造Request並設置新的回調函數,返回Request等待後續調度。網站
若是返回的是字典或Item對象,咱們可經過Feed Exports等組件將返回結果存入到文件。若是設置了Pipeline的話,咱們可使用Pipeline處理(如過濾、修正等)並保存。url
若是返回的是Reqeust,那麼Request執行成功獲得Response以後,Response會被傳遞給Request中定義的回調函數,在回調函數中咱們能夠再次使用選擇器來分析新獲得的網頁內容,並根據分析的數據生成Item。spa
經過以上幾步循環往復進行,咱們完成了站點的爬取。code
在上一節的例子中,咱們定義的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關閉時,該方法會被調用,在這裏通常會定義釋放資源的一些操做或其餘收尾操做。
以上內容可能不太好理解。不過不用擔憂,後面會有不少使用這些屬性和方法的實例。經過這些實例,咱們慢慢熟練掌握它們。