首頁>技術>

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

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。我們一起學習吧。

9
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 新工具開源!一款iOS自動化利器