天天看點

Scrapy基礎——Spider

寫在前面

這是Scrapy學習的基礎部分,大部分内容來自于官方文檔的個人解讀,不太适合那些想在30分鐘以内學會Scrapy的人學習,但是如果你在看那些xx分鐘入門Scrapy的時候存在疑問,可以翻看這篇查查相關内容。如果感覺我寫的有任何不對的地方,歡迎提出疑問,我會及時回複的。

scrapy.spiders.Spider

scrapy.spiders.Spider是Scrapy架構最核心部分之一,定義了如何爬取網站和擷取結構化資訊等。

檢視源碼發現Spider定義了

from_crawler, sest_crawler, start_requests, make_requests_from_url, parse, update_settings, handles_request, close

等function,而在官方文檔規定了自定義的爬蟲必須繼承Spider類,要有至少以下幾個子產品:

  1. name

    : 必須,沒有他scrapy crawl 找不到入口
  2. allowed_domains

    :可選,如果你怕從知乎爬到果殼,請可以定義一個字元串的list,并且 OffsiteMiddleware 處于開啟狀态
  3. start_urls

    :一個URLs list,爬蟲的起點網頁
  4. custom_settings

    :僅在爬蟲運作時覆寫來自settings的設定,低手不知道怎麼玩
  5. logger

    : 一個日志記錄者,以後再debug的時候再說吧
  6. from_crawler

    :這是Scrapy 用于建立自定義爬蟲的類方法(class method),目前你不需要對他動手,這個方法會設定(set)

    crawler

    settings

  7. settings

    :運作爬蟲時的配置,是Settings的執行個體,低手不會玩
  8. crawler

    :在類初始化後由

    from_crawler

    設定,連結到綁定的spider的Crawler類,涉及到 Crawler API ,低手用不來。
  9. start_requests()

    :當

    start_urls

    有URLS即不為空時,會調用

    start_requests()

    ,接着它會繼續調用

    make_requests_from_url

    去Request每一個url。是以我們可以不用定義

    start_urls

    ,而在這裡自定義一個start_requests,使用其他Request,如FormRequest然後callbck(回報)給自定義的parse。注:start_requests在爬蟲運作隻會執行一次。
  10. make_requests_from_url(url)

    :前面說過,這個方法接收urls,傳回reponse, 傳回的response會預設(callback)傳遞給

    parse

  11. parse(response)

    :如果沒有自定義

    start_requests()

    ,那麼必須定義這個函數,并且在裡面定義網頁資料提取方法,十分重要哦。
  12. log(message[, level, component])

    :和上面的logger差不多,debug時候再仔細研究吧
  13. closed(reason)

    :在爬蟲關閉的時候調用,不太懂也不會用,這裡先占位

    Link Extractors(連結提取器)是一類用來從傳回網頁中提取符合要求的連結

    Rule有以下幾個參數

  • link_extractor為LinkExtractor,用于定義需要提取的連結。
  • callback參數:當link_extractor擷取到連結時參數所指定的值作為回調函數。注:不能使用parse作為回調函數。
  • follow:指定了根據該規則從response提取的連結是否需要跟進。callback為None,預設值為true。
  • process_links:主要用來過濾由link_extractor擷取到的連結。
  • process_request:主要用來過濾在rule中提取到的request。

官方提供的例子:

import scrapy
from myproject.items import MyItem

class MySpider(scrapy.Spider):
    name = 'example.com'
    allowed_domains = ['example.com']

    def start_requests(self):
        yield scrapy.Request('http://www.example.com/1.html', self.parse)
        yield scrapy.Request('http://www.example.com/2.html', self.parse)
        yield scrapy.Request('http://www.example.com/3.html', self.parse)

    def parse(self, response):
        for h3 in response.xpath('//h3').extract():
            yield MyItem(title=h3)

        for url in response.xpath('//a/@href').extract():
            yield scrapy.Request(url, callback=self.parse)