寫在前面
這是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類,要有至少以下幾個子產品:
-
: 必須,沒有他scrapy crawl 找不到入口name
-
:可選,如果你怕從知乎爬到果殼,請可以定義一個字元串的list,并且 OffsiteMiddleware 處于開啟狀态allowed_domains
-
:一個URLs list,爬蟲的起點網頁start_urls
-
:僅在爬蟲運作時覆寫來自settings的設定,低手不知道怎麼玩custom_settings
-
: 一個日志記錄者,以後再debug的時候再說吧logger
-
:這是Scrapy 用于建立自定義爬蟲的類方法(class method),目前你不需要對他動手,這個方法會設定(set)from_crawler
和crawler
settings
-
:運作爬蟲時的配置,是Settings的執行個體,低手不會玩settings
-
:在類初始化後由crawler
設定,連結到綁定的spider的Crawler類,涉及到 Crawler API ,低手用不來。from_crawler
-
:當start_requests()
有URLS即不為空時,會調用start_urls
,接着它會繼續調用start_requests()
去Request每一個url。是以我們可以不用定義make_requests_from_url
,而在這裡自定義一個start_requests,使用其他Request,如FormRequest然後callbck(回報)給自定義的parse。注:start_requests在爬蟲運作隻會執行一次。start_urls
-
:前面說過,這個方法接收urls,傳回reponse, 傳回的response會預設(callback)傳遞給make_requests_from_url(url)
。parse
-
:如果沒有自定義parse(response)
,那麼必須定義這個函數,并且在裡面定義網頁資料提取方法,十分重要哦。start_requests()
-
:和上面的logger差不多,debug時候再仔細研究吧log(message[, level, component])
-
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)