Scrapy 1.4 文檔 01 初窺 Scrapy

初窺 Scrapy

Scrapy 是用於抓取網站並提取結構化數據的應用程序框架,其應用很是普遍,如數據挖掘,信息處理或歷史存檔。css

儘管 Scrapy 最初設計用於網絡數據採集(web scraping),但它也可用於使用 API(如 Amazon Associates Web Services)提取數據或用做通用的網絡爬蟲。html

爬蟲(spider)示例

爲了向您展現 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 提供了許多強大的功能使爬取更容易高效,如:

  • 內置支持使用擴展的 CSS 選擇器和 XPath 表達式從 HTML/XML 源代碼中選擇和提取數據,支持正則表達式。
  • 交互式 shell 控制檯(IPython aware)用於嘗試 CSS 和 XPath 表達式來抓取數據,在編寫或調試您的爬蟲時很是有用。
  • 內置支持以多種格式(JSON,CSV,XML)生成 feed exports,並將其存儲在多種後端(FTP,S3,本地文件系統)
  • 強大的編碼支持和自動檢測功能,用於處理多種語言的,非標準的和錯誤的編碼聲明。
  • 強大的可擴展性,容許您使用信號(signals)和良好定義的API(中間件,擴展和管道)插入本身的功能。
  • 普遍的內置擴展和中間件處理:
    • Cookie 和會話處理
    • HTTP 功能,如壓縮,身份驗證,緩存
    • 用戶代理欺騙
    • robots.txt
    • 爬取深度限制
    • 和更多
  • 一個 Telnet 控制檯,用於掛接到 Scrapy 所在的的 Python 控制檯,以便檢查並調試您的爬蟲
  • 還有其餘好處諸如:可複用的從網站地圖和 XML/CSV 文件中抓取網站的爬蟲,自動下載與被抓取項目相關的圖像(或任何其餘多媒體)的媒體管道,可緩存的DNS解析器等等!

下一步是什麼?

接下來的步驟是安裝 Scrapy,根據教程建立一個完整的 Scrapy 項目並加入社區。 感謝您的關注!

相關文章
相關標籤/搜索