1. 程式人生 > >Scrapy1.5入門(一)——初識Scrapy

Scrapy1.5入門(一)——初識Scrapy

本文為譯文,原文見地址:https://docs.scrapy.org/en/latest/intro/overview.html

初識Scrapy

Scrapy是一個用來爬取web網站和提取結構化資料的應用框架,可用於資料探勘、資訊的處理或者歸檔。

即使Scrapy最初是為web抓取(web scraping)而設計的,但它也可以使用api(如Amazon Associates web Services)提取資料,或者用作通用的web爬行器。

一個簡單的爬蟲(spider)示例

為了明確Scrapy能做什麼,我們將實現一個最簡單的Scrapy爬蟲示例。

下面的程式碼實現了一個爬蟲,用來爬取網站

http://quotes.toscrape.com/上的名人名言:

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命令執行:

scrapy runspider quotes_spider.py -o quotes.json

當執行完畢以後,你會發現在quotes_spider.py檔案所在資料夾下會多了一個JSON格式的檔案quotes.json,內容如下:

[
{"text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d", "author": "Jane Austen"},
{"text": "\u201cA day without sunshine is like, you know, night.\u201d", "author": "Steve Martin"},
{"text": "\u201cAnyone who thinks sitting in church can make you a Christian must also think that sitting in a garage can make you a car.\u201d", "author": "Garrison Keillor"},
{"text": "\u201cBeauty is in the eye of the beholder and it may be necessary from time to time to give a stupid or misinformed beholder a black eye.\u201d", "author": "Jim Henson"},
{"text": "\u201cAll you need is love. But a little chocolate now and then doesn't hurt.\u201d", "author": "Charles M. Schulz"},
{"text": "\u201cRemember, we're madly in love, so it's all right to kiss me anytime you feel like it.\u201d", "author": "Suzanne Collins"},
{"text": "\u201cSome people never go crazy. What truly horrible lives they must lead.\u201d", "author": "Charles Bukowski"},
{"text": "\u201cThe trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.\u201d", "author": "Terry Pratchett"},
{"text": "\u201cThink left and think right and think low and think high. Oh, the thinks you can think up if only you try!\u201d", "author": "Dr. Seuss"},
{"text": "\u201cThe reason I talk to myself is because I\u2019m the only one whose answers I accept.\u201d", "author": "George Carlin"},
{"text": "\u201cI am free of all prejudice. I hate everyone equally. \u201d", "author": "W.C. Fields"},
{"text": "\u201cA lady's imagination is very rapid; it jumps from admiration to love, from love to matrimony in a moment.\u201d", "author": "Jane Austen"}
]

剛剛發生了啥?

當你運行了scrapy runspider quotes_spider.py這條命令後,Scrapy會在quotes_spider.py中去尋找一個定義了的爬蟲(這裡是QuotesSpider),並且使用Scrapy的爬行器引擎(crawler engine)來執行這個定義了的爬蟲。

爬行通過向start_urls屬性中定義的URL發出請求(在本示例中,僅向帶有humor類別的URL傳送請求),並且呼叫預設的回撥函式parse,這個回撥函式接收一個response物件。在parse回撥函式中,通過使用CSS選擇器,我們將對名人名言進行迴圈遍歷,首先生成一個Python的字典,這個字典包含名言的內容和作者,然後尋找下一個的連結,最後排程另一個請求,這個請求同樣包含了回撥函式parse。

你應該注意到了Scrapy的主要優勢:請求被排程,並且被非同步處理。這意味著Scrapy不需要等待一個請求的完成和處理,就可以在同一時間傳送另外一個請求或者做其他的事情。這也意味著其他請求可以保持執行狀態,即使某些請求失敗了或者在處理過程中出現了一個異常。

雖然這能使你非常快速地爬取網站(以一種容錯的方式,在同一時間傳送多個併發請求),但是Scrapy也為你提供了一些方法可以優雅地爬取網站:使用一些設定項。你可以通過這些設定項做一些事情,比如在每個請求之間設定一個下載延遲,限制每個域或者每個IP的併發請求數量,甚至可以使用一個自動限流的擴充套件來嘗試自動地計算這些請求。

還有什麼呢?

你已經知道了,怎樣使用Scrapy來提取和儲存一個網站的資料,但是這確實很膚淺的方式。Scrapy還提供了很多強大的特性,這些特性使爬取更加容易且有效率,比如:

  • 內建支援使用擴充套件的CSS選擇器和XPath表示式從HTML/XML源選擇和提取資料,以及使用正則表示式提取資料的輔助方法。
  • 互動式shell視窗(IPython aware),可以用來嘗試通過CSS和XPath表示式抓取資料,在編寫或除錯爬蟲的時候非常有用。
  • 內建支援以多種格式(JSON、CSV、XML)匯出反饋,並將其儲存在多個後臺(FTP、S3、本地檔案系統等)。
  • 健壯的編碼支援和自動檢測,用於處理外來的、非標準的和損壞的編碼宣告。
  • 強大的可擴充套件性支援,允許你使用訊號和定義良好的API(中介軟體、擴充套件管道)來插入你所需的功能。
  • 處理各種內建擴充套件和中介軟體:
    • cookie和session的處理
    • HTTP特性,比如壓縮、使用者驗證、快取
    • user-agent的偽裝
    • robot.txt
    • 深層爬取的重定向
    • 等等
  • Telnet控制檯,用於連線到執行在Scrapy程序內部的Python控制檯,以便自查和除錯你的爬蟲。
  • 其他好處,比如可重用的爬蟲能夠從站點地圖和XML/CSV提要中爬取網站,用來自動下載圖片(或者其他媒體)的媒體管道,快取DNS解析器,等等。

接下來幹什麼呢?

下一步你需要安裝Scrapy跟著這系列教程學習如何建立一個成熟的Scrapy專案,並且加入社群