實現一個 Spider 子的過程就像是完成一系列的填空題,Scrapy 框架提出如下問題讓用戶在Spider 子類中做答:框架
一、爬蟲從哪一個或者那些頁面開始爬取?scrapy
二、對於一個已下載的頁面,提取其中的那些數據?ide
三、爬取完當前頁面後,接下來爬取哪一個或那些頁面?函數
上面問題的答案包含了一個爬蟲最重要的邏輯,回答了這些問題,一個爬蟲也就開發出來了。url
步驟 01: 繼承 scrapy.Spiderspa
import scrapy class BooksSpider(scrapy.Spider): ...
步驟 02:爲 Spider 取名;code
import scrapy class BooksSpider(scrapy.Spider): name = "book" ...
步驟 03:設定起始爬取點;對象
class BooksSpider(scrapy.Spider): ... start_url = ['http://books.toscrape.com/'] ...
start_url 同常被實現成一個列表,其中放入全部的其實爬去點的 url (例子中只有一個其實點)。看到這裏,你們可能會想,請求頁面下載不是必定要提交 Request 對象麼? 而咱們僅定義了 url 列表,是誰暗中構造並提交了 Request 對象呢? 經過閱讀 Spider 基類源碼能夠找到答案,相關代碼以下:blog
步驟 04:實現頁面解析函數;繼承
頁面解析函數也就是構造 Request 對象是經過 callback 參數指定的回調函數(或默認的 parse 方法)。頁面解析函數是實現 Spider 中最核心的部分,它須要完成如下兩項工做:
一、使用選擇器提取頁面中的數據,將數據封裝後 (Item 或字典)提交給 Scrapy 引擎。
二、使用選擇器或 LinkExtractor 提取頁面中的鏈接,用其構造新的Request 對象並提交給 Scrapy 引擎(下載鏈接頁面)。
一個頁面中可能包含多項數據以及多個鏈接,所以頁面解析函數被要求返回一個可迭代對象(一般被實現成一個生成器函數),每次迭代返回一項數據(Item或字典)或一個 Request 對象。