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的可迭代對象.