Scrapy框架的使用之Spider的用法

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

1. Spider運行流程

在實現Scrapy爬蟲項目時,最核心的類即是Spider類了,它定義瞭如何爬取某個網站的流程和解析方式。簡單來說,Spider要作的事就是以下兩件:
web

  • 定義爬取網站的動做;微信

  • 分析爬取下來的網頁。網絡

對於Spider類來講,整個爬取循環過程以下所述:dom

  • 以初始的URL初始化Request,並設置回調函數。當該Request成功請求並返回時,Response生成並做爲參數傳給該回調函數。scrapy

  • 在回調函數內分析返回的網頁內容。返回結果有兩種形式。一種是解析到的有效結果返回字典或Item對象,它們能夠通過處理後(或直接)保存。另外一種是解析獲得下一個(以下一頁)連接,能夠利用此連接構造Request並設置新的回調函數,返回Request等待後續調度。ide

  • 若是返回的是字典或Item對象,咱們可經過Feed Exports等組件將返回結果存入到文件。若是設置了Pipeline的話,咱們可使用Pipeline處理(如過濾、修正等)並保存。函數

  • 若是返回的是Reqeust,那麼Request執行成功獲得Response以後,Response會被傳遞給Request中定義的回調函數,在回調函數中咱們能夠再次使用選擇器來分析新獲得的網頁內容,並根據分析的數據生成Item。網站

經過以上幾步循環往復進行,咱們完成了站點的爬取。ui

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… (二維碼自動識別)

相關文章
相關標籤/搜索