寫在前面
這是Scrapy學習的基礎部分升酣,大部分內(nèi)容來自于官方文檔的個人解讀山卦,不太適合那些想在30分鐘以內(nèi)學會Scrapy的人學習哮独,但是如果你在看那些xx分鐘入門Scrapy的時候存在疑問烟央,可以翻看這篇查查相關(guān)內(nèi)容夺荒。如果感覺我寫的有任何不對的地方瞒渠,歡迎提出疑問,我會及時回復的技扼。
scrapy.spiders.Spider
scrapy.spiders.Spider是Scrapy框架最核心部分之一伍玖,定義了如何爬取網(wǎng)站和獲取結(jié)構(gòu)化信息等。
查看源碼發(fā)現(xiàn)Spider定義了from_crawler, sest_crawler, start_requests, make_requests_from_url, parse, update_settings, handles_request, close
等function剿吻,而在官方文檔規(guī)定了自定義的爬蟲必須繼承Spider類窍箍,要有至少以下幾個模塊:
-
name
: 必須,沒有他scrapy crawl 找不到入口 -
allowed_domains
:可選丽旅,如果你怕從知乎爬到果殼椰棘,請可以定義一個字符串的list,并且OffsiteMiddleware
處于開啟狀態(tài) -
start_urls
:一個URLs list榄笙,爬蟲的起點網(wǎng)頁 -
custom_settings
:僅在爬蟲運行時覆蓋來自settings的設置邪狞,低手不知道怎么玩 -
logger
: 一個日志記錄者,以后再debug的時候再說吧 -
from_crawler
:這是Scrapy 用于創(chuàng)建自定義爬蟲的類方法(class method)茅撞,目前你不需要對他動手帆卓,這個方法會設置(set)crawler
和settings
-
settings
:運行爬蟲時的配置巨朦,是Settings的實例,低手不會玩 -
crawler
:在類初始化后由from_crawler
設置鳞疲,鏈接到綁定的spider的Crawler類罪郊,涉及到Crawler API ,低手用不來尚洽。 -
start_requests()
:當start_urls
有URLS即不為空時悔橄,會調(diào)用start_requests()
,接著它會繼續(xù)調(diào)用make_requests_from_url
去Request每一個url腺毫。所以我們可以不用定義start_urls
癣疟,而在這里自定義一個start_requests,使用其他Request潮酒,如FormRequest然后callbck(反饋)給自定義的parse睛挚。注:start_requests在爬蟲運行只會執(zhí)行一次。 -
make_requests_from_url(url)
:前面說過急黎,這個方法接收urls扎狱,返回reponse, 返回的response會默認(callback)傳遞給parse
。 -
parse(response)
:如果沒有自定義start_requests()
勃教,那么必須定義這個函數(shù)淤击,并且在里面定義網(wǎng)頁數(shù)據(jù)提取方法,十分重要哦故源。 -
log(message[, level, component])
:和上面的logger差不多污抬,debug時候再仔細研究吧 -
closed(reason)
:在爬蟲關(guān)閉的時候調(diào)用,不太懂也不會用绳军,這里先占位
Link Extractors(鏈接提取器)是一類用來從返回網(wǎng)頁中提取符合要求的鏈接
Rule有以下幾個參數(shù)
- link_extractor為LinkExtractor印机,用于定義需要提取的鏈接。
- callback參數(shù):當link_extractor獲取到鏈接時參數(shù)所指定的值作為回調(diào)函數(shù)门驾。注:不能使用parse作為回調(diào)函數(shù)射赛。
- follow:指定了根據(jù)該規(guī)則從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)