Spider類定義瞭如何爬取某個網站, 包括爬取的動做以及如何從網頁內容中提取結構化的數據, 總的來講spider就是定義爬取的動做以及分析某個網頁.css
工做流程分析 :dom
1. 以初始的URLRequest, 並設置回調函數, 當該requeset下載完畢並返回時, 將生成response, 並做爲參數傳遞給回調函數. spider中初始的request是經過start_requests()來獲取的. start_requests()獲取start_urls中的URL, 並以parse以回調函數生成Requestscrapy
2. 在回調函數內分析返回的網頁內容, 能夠返回item對象, 或者Dict,或者Request, 以及是一個包含三者的可迭代的容器, 返回的Request對象以後會通過Scrapy處理, 下載相應的內容, 並調用設置的callback函數.ide
3. 在回調函數, 能夠經過lxml, bs4, xpath, css等方法獲取咱們想要的內容生成item函數
4. 最後將item傳送給pipeline處理源碼分析
源碼分析 :post
在spiders下寫爬蟲的時候, 並無寫start_request來處理start_urls處理start_urls中的url, 這是由於在繼承的scrapy.Spider中已經寫過了網站
在上述源碼中能夠看出在父類裏實現了start_requests方法, 經過make_requests_from_url作了Request請求url
上圖中, parse回調函數中的response就是父類中start_requests方法調用make_requests_from_url返回的結果, 而且在parse回調函數中能夠繼續返回Request, 就像代碼中yield request()並設置回調函數.xml
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的可迭代對象.