引子
最近工作上需要對Scrapy進行二次開發(fā),為此我又好好的復習了一下Scrapy相關的知識,并整理了如下內(nèi)容
快速了解Scrapy
Scrapy 是當下爬蟲與數(shù)據(jù)領域耳熟能詳?shù)臄?shù)據(jù)采集與提取的框架,廣泛應用于數(shù)據(jù)采集、數(shù)據(jù)挖掘、信息處理等方向。
小試牛刀Scrapy示例
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').get(),
'author': quote.xpath('span/small/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)
將上述代碼存儲于Py文件中,命名為類似于test_spider.py的文件,再使用runspider命令運行爬蟲
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"
},
...]
剛剛發(fā)生了什么?
當您運行該命令時,Scrapy在其中查找Spider定義并通過其爬蟲引擎運行它。
scrapy runspider quotes_spider.py
通過向start_urls 屬性中定義的URL發(fā)出請求(在這種情況下,只是start_urlsl中引號的URL )開始爬行,并調(diào)用默認回調(diào)方法parse,將響應對象作為參數(shù)傳遞。在parse回調(diào)中,我們使用CSS Selector循環(huán)遍歷quote元素,使用提取的引用文本和作者生成Python dict,查找指向下一頁的鏈接,并使用與parse回調(diào)相同的方法發(fā)送下一個請求 。
在這里,您會注意到Scrapy的一個主要優(yōu)點:請求是 異步調(diào)度和處理的。這意味著Scrapy不需要等待請求完成和處理,它可以在此期間發(fā)送另一個請求或執(zhí)行其他操作。這也意味著即使某些請求失敗或在處理錯誤時發(fā)生錯誤,其他請求也可以繼續(xù)運行。
雖然這使您能夠進行非常快速的爬網(wǎng)(以容錯的方式同時發(fā)送多個并發(fā)請求),但Scrapy還可以通過一些設置控制爬網(wǎng)的禮貌。您可以執(zhí)行以下操作:在每個請求之間設置下載延遲,限制每個域或每個IP的并發(fā)請求數(shù)量,甚至使用自動限制擴展,以嘗試自動解決這些問題。
還有什么?
您已經(jīng)了解了如何使用Scrapy從網(wǎng)站中提取和存儲項目,但這只是表面。Scrapy提供了許多強大的功能,可以輕松高效地進行抓取,例如:
- 內(nèi)置支持使用擴展的CSS選擇器和XPath表達式從HTML / XML源中選擇和提取數(shù)據(jù),并使用正則表達式提取輔助方法。
- 一個交互式shell控制臺(支持IPython),用于嘗試使用CSS和XPath表達式來抓取數(shù)據(jù),在編寫或調(diào)試爬蟲時非常有用。
- 內(nèi)置支持以多種格式(JSON,CSV,XML)生成Feed導出并將其存儲在多個后端(FTP,S3,本地文件系統(tǒng))中
- 強大的編碼支持和自動檢測,用于處理外部,非標準和損壞的編碼聲明。
- 強大的可擴展性支持,允許您使用信號和定義良好的API(中間件,擴展和 管道)插入您自己的功能。
- 廣泛的內(nèi)置擴展和中間件用于處理:
- cookie和會話處理
- HTTP功能,如壓縮,身份驗證,緩存
- 用戶代理欺騙
- 的robots.txt
- 爬行深度限制
- 和更多
- 一個Telnet控制臺,用于連接到Scrapy進程內(nèi)運行的Python控制臺,以內(nèi)省和調(diào)試您的爬蟲
- 還有其他好東西,比如可重復使用的爬蟲,可以從Sitemaps和XML / CSV Feed中抓取網(wǎng)站,自動下載與抓取項目相關聯(lián)的圖像(或任何其他媒體)的媒體管道,緩存DNS解析器等等!