第十一章 Scrapy入門程序點評

1,引言

在Scrapy的架構初探一文,我基於爬蟲開發的經驗對Scrapy官網文章作了點評和解讀,事件驅動的非同步處理架構、極強的模塊化等是個絕好的框架,接著我細讀了官網的《Scrapy at a glance》,更加強了我的感受:就是他了——開源Python即時網路爬蟲需要一個爬蟲框架,我不想重複發明輪子,只想專註於爬蟲裡面的提取器的生成和使用,也就是Scrapy中的Spider部分。

本文大部分內容摘抄自Scrapy官網的《Scrapy at a glance》,看到Scrapy巧妙之處則加了點評。

2,Scrapy的Spider例子

在Scrapy的框架中,Spider與Python開源爬蟲的提取器類似,核心特徵是:

  • Spider通常針對一個特定網站
  • Spider裡面存了爬行入口URLs集合
  • Scrapy的引擎順序拿Spider中的入口URL,構造Request對象,啟動消息循環
  • Spider提供介面方法,把抓取下來的內容進行輸出

對由筆者開發的集搜客MS謀數台和DS打數機比較了解的讀者,可以把Spider想像成:MS謀數台上定義的一組抓取規則 + 會員中心的爬蟲羅盤。

下面我們從官網拷貝一個例子:

class StackOverflowSpider(scrapy.Spider):

name = stackoverflow

start_urls = [stackoverflow.com/quest]

def parse(self, response):

for href in response.css(.question-summary h3 a::attr(href)):

full_url = response.urljoin(href.extract())

yield scrapy.Request(full_url, callback=self.parse_question)

def parse_question(self, response):

yield {

title: response.css(h1 a::text).extract()[0],

votes: response.css(.question .vote-count-post::text).extract()[0],

body: response.css(.question .post-text).extract()[0],

tags: response.css(.question .post-tag::text).extract(),

link: response.url,

}

看這個例子需要注意以下幾點

  • start_urls存儲入口網址列表,本例只有一個網址
  • parse()函數是爬到了網頁後執行的,是由引擎回調的
  • 本來到parse()就完成了,但是這個例子展示了一個兩級抓取的案例,在parse()裡面構造了下一級抓取的任務,生成Request對象,並登記一個回調函數
  • parse_question()是第二級的解析網頁的函數,返回了一個JSON對象
  • 事件驅動模式顯而易見,可以構造好多Request,丟給引擎即可,不用阻塞式等待

官網文章還總結了其他很多功能特性,總之,Scrapy是一個十分完善和強大的框架。

3,接下來的工作

至此,Scrapy框架已經明確選定了,接下來,我們將進一步研讀Scrapy的文檔,研究怎樣把gsExtractor封裝成Scrapy需要的Spider。

4,文檔修改歷史

2016-06-08:V1.0,首次發布

上一章 Scrapy架構初探 <<<<<首頁>>>>> 下一章 Python3下運行Scrapy測試


推薦閱讀:

你懂Scrapy嗎?Scrapy大型爬蟲框架講解【一】
【記錄】Scrapy模擬登錄cookie失效問題
如何用scrapy爬取搜房網上小區的坐標值?
基於Scrapy如何寫一個爬蟲抓取藝龍、攜程等網站的機票價格進行分析並做機票價格預測?

TAG:Python | scrapy | 爬虫计算机网络 |