Scrapy 是用於抓取網站並提取結構化數據的應用程序框架,其應用很是普遍,如數據挖掘,信息處理或歷史存檔。css
儘管 Scrapy 最初設計用於網絡數據採集(web scraping),但它也可用於使用 API(如 Amazon Associates Web Services)提取數據或用做通用的網絡爬蟲。html
爲了向您展現 Scrapy 帶給您的是什麼,咱們將使用最簡單的方式運行一個爬蟲,向您展現一個 Scrape Spider 的例子。web
這是一個爬蟲的代碼,用於從網站 http://quotes.toscrape.com 中抓取名人名言(famous quotes):正則表達式
import scrapy class 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 { 'text': quote.css('span.text::text').extract_first(), 'author': quote.xpath('span/small/text()').extract_first(), } next_page = response.css('li.next a::attr("href")').extract_first() if next_page is not None: yield response.follow(next_page, self.parse)
將其放在一個文本文件中,並將其命名爲 quotes_spider.py,使用 runspider 命令啓動爬蟲:shell
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" }, ...]
當您運行命令 scrapy runspider quotes_spider.py 時,Scrapy 查找其中的 Spider 定義,並經過抓取引擎運行它。json
經過對 start_urls 屬性中定義的 URL(在裏,只有一個URL,爲標籤(tag)爲幽默(humor)的名言)發起請求(making requests)啓動爬蟲,並調用默認的回調方法 parse,參數爲響應對象(response)。在 parse 回調方法中,咱們使用 CSS 選擇器循環遍歷名言(quote)所在的元素,產生(yield)一個包含名人名言的 Python 字典,而後查找下一頁的連接,並使用一樣的回調方法 parse 發起另外一個請求。後端
在這裏,您或許注意到了 Scrapy 的主要優勢之一:請求和處理是異步的。 這意味着 Scrapy 不須要等待一個請求返回的結果被處理完畢,就能夠在此期間發起另外一個請求或執行其餘操做。 這也意味着即便某些請求失敗了或在處理它時發生錯誤,其餘請求仍然能夠繼續進行。api
雖然這樣可使您進行很是快速的抓取(以容錯方式同時發起多個請求),Scrapy 也可讓您經過一些設置來控制爬網的速度。 您能夠在每一個請求之間設置下載延遲,限制每一個域或每一個 IP 的併發請求數量,甚至使用自動調節擴展來自動計算這些延遲。緩存
注意
這裏使用了 feed exports 來生成 JSON 文件,您能夠輕鬆地更改導出格式(例如,XML 或 CSV)和存儲後臺(例如,FTP 或 Amazon S3)。您還能夠編寫一個項目管道(item pipeline)以將項目存儲在數據庫中。
您已經看到如何使用 Scrapy 從網站中提取和存儲數據,但這只是表面的。Scrapy 提供了許多強大的功能使爬取更容易高效,如:
接下來的步驟是安裝 Scrapy,根據教程建立一個完整的 Scrapy 項目並加入社區。 感謝您的關注!