Scrapy 簡介與上手

Scrapy是一個用於爬取web站點並提取結構化資料的應用框架,通常我們稱之為爬蟲,一款優秀的python爬蟲。

Scrapy 簡介與上手

scrapy爬取的資料可被用在資料探勘、資訊處理、歷史資料歸檔等非常廣泛的資料分析和處理領域。

我們可以透過一個簡單的例子來初步瞭解一下如何透過scrapy蜘蛛(spider)爬取web頁面。

import scrapyclass QuotesSpider(scrapy。Spider): name = ‘quotes’ start_urls = [ ‘http://quotes。toscrape。com/tag/humor/’, ] def parse(self, response): for quote in response。css(‘div。quote’): yield { ‘author’: quote。xpath(‘span/small/text()’)。get(), ‘text’: quote。css(‘span。text::text’)。get(), } next_page = response。css(‘li。next a::attr(“href”)’)。get() if next_page is not None: yield response。follow(next_page, self。parse)

將這段程式碼儲存為quotes_spider。py。然後執行以下命令:

scrapy runspider quotes_spider。py -o quotes。json#或者:python -m scrapy runspider quotes_spider。py -o quotes。json

執行完畢後,我們得到輸出檔案quotes。json。其內容為如下的json字串:

[ { “author”: “Jane Austen”, “text”: “\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid。\u201d” }, { “author”: “Groucho Marx”, “text”: “\u201cOutside of a dog, a book is man‘s best friend。 Inside of a dog it’s too dark to read。\u201d” }, { “author”: “Steve Martin”, “text”: “\u201cA day without sunshine is like, you know, night。\u201d” },#。。。]

可以看到,每個專案包含兩個欄位:author和text。

我們現在來分析一下上邊這段程式碼的執行過程。

當執行scrapy runspider quotes_spider。py這個命令後,scrapy會從quotes_spider。py這個指令碼載入其中定義的一個spider,並在爬蟲引擎中執行這個spider定義的一些方法。

爬蟲引擎首先開啟start_urls中定義的連結(http://quotes。toscrape。com/tag/humor/),成功後會呼叫預設的回撥函式parse,將響應訊息response作為引數傳入parse函式。

parse回撥函式使用css選擇器選取並迴圈遍歷response中的quote物件,從中提取中author和text欄位。並查詢頁面中的next標籤,以確定是否繼續使用同樣的方法爬取和解析“下一頁”。

你應該已經注意到了使用scrapy的好處:頁面請求是由scrapy非同步地進行排程和處理的。

這意味著scrapy不需要等待某個請求的完成和處理,它可以同時傳送其他請求或者執行其他業務。同樣,某個請求失敗或異常也不影響其他請求的執行。

除了可以快速爬取頁面,scrapy還提供了一些配置項,用來調控爬取行為。我們可以設定請求間的間隔,可以控制每個域名或每個ip的併發請求數,這樣使得爬取行為看起來不那麼“粗暴”。scrapy甚至提供了擴充套件程式以自動調整這些引數。

當然,作為一個強大的爬蟲框架,scrapy提供的功能遠不止此。

內建增強的css選擇器和xpath表示式,用來選取和解析html和xml檔案,支援使用正則表示式。

提供一個互動式shell控制檯,方便編寫和除錯spider。

內建多種資料輸出格式(json、csv、xml),並可將資料儲存在多種後端系統(ftp、s3、本地檔案系統)。

支援頁面編碼自動檢測

豐富的外掛,可用於處理cookies/session,支援http壓縮、鑑權和快取等特性,仿造user-agent等。

總的來說,用python做爬蟲,基本繞不開scrapy。我們一起學習吧。