Scrapy入門程序點評

1,引言

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

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

2,Scrapy的Spider例子

在Scrapy的框架中,Spider與GooSeeker開源爬蟲的提取器相似,核心特徵是css

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


對GooSeeker的MS謀數臺和DS打數機比較瞭解的讀者,能夠把Spider想象成:MS謀數臺上定義的一組抓取規則 + 會員中心的爬蟲羅盤

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

class StackOverflowSpider(scrapy.Spider):
    name = 'stackoverflow'
    start_urls = ['http://stackoverflow.com/questions?sort=votes']

    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的文檔,研究怎樣把Python即時網絡爬蟲的gsExtractor封裝成Scrapy須要的Spider

 

4,文檔修改歷史
 
2016-06-17:V1.0,首次發佈
相關文章
相關標籤/搜索