對於用戶來講,Spider是最核心的組件,Scrapy爬蟲開發是圍繞實現Spider展開的。css
Request和Response是HTTP協議中的術語,即HTTP請求和HTTP響應,Scrapy框架中定義了相應的Request和Response類,這裏的Item表明Spider從頁面中爬取的一項數據。html
Request對象用來描述一個HTTP請求,下面是其構造器方法的參數列表。算法
Request(url, callback=None, method='GET', headers=None, body=None, cookies=None, meta=None, encoding='utf-8', priority=0, dont_filter=False, errback=None, flags=None) # url(必選):請求頁面的url地址,bytes或str類型,如'http://www.baidu.com'。 # callback:頁面解析函數, Callable類型,Request對象請求的頁面下載完成後,由該參數指定的頁面解析函數被調用。若是未傳遞該參數,默認調用Spider的parse方法。 # method:HTTP請求的方法,默認爲'GET'。 # headers:HTTP請求的頭部字典,dict類型,例如{'Accept':'text/html', 'User-Agent':Mozilla/5.0'}。若是其中某項的值爲None,就表示不發送該項HTTP頭部,例如{'Cookie':None},禁止發送Cookie。 # body:HTTP請求的正文,bytes或str類型。 # cookies:Cookie信息字典,dict類型,例如{'currency': 'USD','country': 'UY'}。 # meta:Request的元數據字典,dict類型,用於給框架中其餘組件傳遞信息,好比中間件Item Pipeline。其餘組件可使用Request對象的meta屬性訪問該元數據字典(request.meta),也用於給響應處理函數傳遞信息,
# 詳見Response的meta屬性。 # encoding:url和body參數的編碼默認爲'utf-8'。若是傳入的url或body參數是str類型,就使用該參數進行編碼。 # priority:請求的優先級默認值爲0,優先級高的請求優先下載。 # dont_filter:默認狀況下(dont_filter=False),對同一個url地址屢次提交下載請求,後面的請求會被去重過濾器過濾(避免重複下載)。若是將該參數置爲True,可使請求避免被過濾,強制下載。例如,在屢次爬取
# 一個內容隨時間而變化的頁面時(每次使用相同的url),能夠將該參數置爲True。 # errback:請求出現異常或者出現HTTP錯誤時(如404頁面不存在)的回調函數。
雖然參數不少,但除了url參數外,其餘都帶有默認值。在構造Request對象時,一般咱們只需傳遞一個url參數或再加一個callback參數,其餘使用默認值便可。數據庫
Response對象用來描述一個HTTP響應,Response只是一個基類,根據響應內容的不一樣有以下子類:json
當一個頁面下載完成時,下載器依據HTTP響應頭部中的Content-Type信息建立某個Response的子類對象。咱們一般爬取的網頁,其內容是HTML文本,建立的即是HtmlResponse對象,其中HtmlResponse和XmlResponse是TextResponse的子類。實際上,這3個子類只有細微的差異,這裏以HtmlResponse爲例進行講解。服務器
下面是HtmlResponse對象的屬性及方法。cookie
url:HTTP響應的url地址,str類型。 status:HTTP響應的狀態碼,int類型,例如200,404。 headers:HTTP響應的頭頭部,類字典類型,能夠調用get或getlist方法對其進行訪問,例如:response.headers.get('Content-Type') response.headers.getlist('Set-Cookie') body:HTTP響應正文,bytes類型。 text:文本形式的HTTP響應正文,str類型,它是由response.body使用response.encoding解碼獲得的,即reponse.text = response.body.decode(response.encoding) encoding:HTTP響應正文的編碼,它的值多是從HTTP響應頭部或正文中解析出來的。 request:產生該HTTP響應的Request對象。 meta:即response.request.meta,在構造Request對象時,可將要傳遞給響應處理函數的信息經過meta參數傳入;響應處理函數處理響應時,經過response.meta將信息取出。 selector:Selector對象用於在Response中提取數據。 xpath(query):使用XPath選擇器在Response中提取數據,實際上它是response.selector.xpath方法的快捷方式。 css(query):使用CSS選擇器在Response中提取數據,實際上它是response.selector.css方法的快捷方式。 urljoin(url):用於構造絕對url。當傳入的url參數是一個相對地址時,根據response.url計算出相應的絕對url。例如: response.url爲http://www.example.com/a,url爲b/index.html,調用response.urljoin(url)的結果爲http://www.example.com/a/b/index.html。
雖然HtmlResponse對象有不少屬性,但最經常使用的是如下的3個方法:框架
前兩個方法用於提取數據,後一個方法用於構造絕對url。scrapy
實現一個Spider子類的過程很像是完成一系列填空題,Scrapy框架提出如下問題讓用戶在Spider子類中做答:ide
實現一個Spider只須要完成下面4個步驟:
scrapy.Spider基類實現瞭如下內容:
關於起始URL start_urls:
start_urls一般被實現成一個列表,其中放入全部起始爬取點的url(例子中只有一個起始點)。看到這裏,你們可能會想,請求頁面下載不是必定要提交Request對象麼?而咱們僅定義了url列表,是誰
暗中構造並提交了相應的Request對象呢?
由此咱們知道Request對象是調用基類start_requests方法產生的,所以咱們也能夠本身定義start_requests方法(覆蓋基類Spider的start_requests方法),直接構造並提交起始爬取點的Request對象。在某些場景下使用這種方式更加靈活,例若有時想爲Request添加特定的HTTP請求頭部,或想爲Request指定特定的頁面解析函數。
頁面解析函數也就是構造Request對象時經過callback參數指定的回調函數(或默認的parse方法)。頁面解析函數是實現Spider中最核心的部分,它須要完成如下兩項工做:
一個頁面中可能包含多項數據以及多個連接,所以頁面解析函數被要求返回一個可迭代對象(一般被實現成一個生成器函數),每次迭代返回一項數據(Item或字典)或一個Request對象。