Spider類定義了如何爬取某個網站, 包括爬取的動作以及如何從網頁内容中提取結構化的資料, 總的來說spider就是定義爬取的動作以及分析某個網頁.
工作流程分析 :
1. 以初始的URLRequest, 并設定回調函數, 當該requeset下載下傳完畢并傳回時, 将生成response, 并作為參數傳遞給回調函數. spider中初始的request是通過start_requests()來擷取的. start_requests()擷取start_urls中的URL, 并以parse以回調函數生成Request
2. 在回調函數内分析傳回的網頁内容, 可以傳回item對象, 或者Dict,或者Request, 以及是一個包含三者的可疊代的容器, 傳回的Request對象之後會經過Scrapy處理, 下載下傳相應的内容, 并調用設定的callback函數.
3. 在回調函數, 可以通過lxml, bs4, xpath, css等方法擷取我們想要的内容生成item
4. 最後将item傳送給pipeline處理
源碼分析 :
在spiders下寫爬蟲的時候, 并沒有寫start_request來處理start_urls處理start_urls中的url, 這是因為在繼承的scrapy.Spider中已經寫過了
在上述源碼中可以看出在父類裡實作了start_requests方法, 通過make_requests_from_url做了Request請求
上圖中, parse回調函數中的response就是父類中start_requests方法調用make_requests_from_url傳回的結果, 并且在parse回調函數中可以繼續傳回Request, 就像代碼中yield request()并設定回調函數.
spider内的一些常用屬性 :
所有自己寫的爬蟲都是繼承于spider.Spider這個類
name:
定義爬蟲名字, 通過指令啟動的額時候用的就是這個名字, 這個名字必須唯一
allowed_domains:
包含了spider允許爬取的域名清單. 當offsiteMiddleware啟用時, 域名不在清單中URL不會被通路, 是以在爬蟲檔案中, 每次生成Request請求時都會進行和這裡的域名進行判斷.
start_urls:
其實的URL清單
這裡會通過spider.Spider方法調用start_request循環請求這個清單中的每個位址
custom_settings:
自定義配置, 可以覆寫settings的配置, 主要用于當我們隊怕重有特定需求設定的時候
設定的以字典的方式設定: custom_settings = {}
from_crawler:
一個類方法, 可以通過crawler.settings.get()這種方式擷取settings配置檔案中的資訊. 同時這個也可以在pipeline中使用
start_requests():
此方法必須傳回一個可疊代對象, 該對象包含了spider用于爬取的第一個Request請求
此方法是在被繼承的父類中spider.Spider中寫的, 預設是通過get請求, 如果需要修改最開始的這個請求, 可以重寫這個方法, 如想通過post請求
make_requests_from_url(url):
此房也是在父類中start_requests調用的, 可以重寫
parse(response):
預設的回調函數
負責處理response并傳回處理的資料以及跟進的url
該方法以及其他的Request回調函數必須傳回一個而包含Request或者item的可疊代對象.
轉載于:https://www.cnblogs.com/dong-/p/10306046.html