[TOC]css
Python2:適合爬取非中文html
Python3:適合爬取中文正則表達式
Scrapy是一種快速的高級Web爬行和Web抓取框架,用於抓取網站並從其頁面中提取結構化數據。它可用於各類用途,從數據挖掘到監控和自動化測試。數據庫
咱們將以最簡單的方式運行蜘蛛,它在將訪問並獲取 quotes.toscrape.com上的名言(文本)、做者 :json
import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quotes'
start_urls = [
'http://quotes.toscrape.com/',
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').get(),
'author': quote.css('small.author::text').get(),
}
next_page = response.css('li.next a::attr("href")').get()
if next_page:
yield response.follow(response.urljoin(next_page), self.parse)
複製代碼
將以上代碼放在一個文本文件中,將其命名爲quotes_spider.py
,並使用 如下命令運行蜘蛛:後端
scrapy runspider quotes_spider.py -o quotes.json
複製代碼
運行上述命令後,代碼將在命令運行的目錄下建立一個名爲quotes.json
的文件,該文件包含JSON格式的列表,其中包含文本和做者,以下所示(爲了更好的可讀性,此處從新格式化):緩存
[
{
"text": "\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d",
"author": "Albert Einstein"
},
{
"text": "\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d",
"author": "J.K. Rowling"
},
{
"text": "\u201cThere are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.\u201d",
"author": "Albert Einstein"
},
...省略97條...
]
複製代碼
當咱們運行「scrapy runspider quotes_spider.py」命令時,Scrapy會查找Spider的定義並經過其爬蟲引擎運行它;bash
經過向start_urls 屬性中定義的URL發出請求(在上述示例中即:start_urls = ['quotes.toscrape.com/'])開始爬行,並調用默認回調方法parse,將響應對象做爲參數進行傳遞;併發
在parse回調方法中,咱們使用CSS Selector循環遍歷quote元素,並將提取的名言文本和做者生成Python dict,除此以外咱們還查找指向下一頁的連接,將得到的下一頁連接再次以一樣的方式進行請求處理;框架
在這裏,咱們能夠看到Scrapy的一個主要優勢:請求是 異步調度與處理的。
這意味着Scrapy不須要等待請求完成和處理,它能夠在此期間發送另外一個請求或執行其餘操做。
這也意味着即便某些請求失敗或在處理錯誤時發生錯誤,其餘請求也能夠繼續運行。
雖然這使得咱們可以進行很是快速的爬網(以容錯的方式同時發送多個併發請求),但Scrapy還能夠經過一些設置讓咱們的蜘蛛以更加紳士的方式去爬網。
咱們能夠執行如下操做:在每一個請求之間設置下載延遲,限制每一個域或每一個IP的併發請求數量,甚至使用自動限制擴展,以嘗試自動解決這些問題。
注意:咱們在這裏使用的是Feed導出生成JSON文件,除此以外咱們還能夠輕鬆更改導出格式(例如XML或CSV),存儲於後端服務(例如FTP或Amazon S3),還能夠編寫 item pipeline 用以將 items 存儲在數據庫中。
運行流程小結:
經過上述實踐,咱們已經瞭解瞭如何使用Scrapy從網站中提取和存儲項目,但這只是表面。
Scrapy提供了許多強大的功能,能夠幫助咱們輕鬆高效地進行抓取,例如:
內置支持使用擴展的CSS選擇器和XPath表達式,讓咱們能夠高效地從HTML / XML源代碼中選擇和提取數據,並使用正則表達式提取輔助方法;
提供交互式Shell控制檯(支持IPython),用於嘗試使用CSS和XPath表達式來抓取數據,在編寫或調試蜘蛛時很是有用;
內置支持以多種格式(JSON,CSV,XML)生成Feed導出並將其存儲在多個後端服務(FTP、S三、數據庫、本地文件系統)中;
強大的編碼支持和自動檢測,用於處理外部,非標準和損壞的編碼聲明;
強大的可擴展性支持,容許使用Signals(信號)和定義良好的API(中間件,擴展和 管道)插入本身的自定義功能;
諸多的內置擴展和中間件用於處理:
一個Telnet控制檯,用於鏈接到Scrapy進程內運行的Python控制檯,用以調試爬蟲;
還有其餘好東西,好比可重複使用的蜘蛛,能夠從Sitemaps(站點地圖:網站管理員向搜索引擎通知可用於爬行的網站頁面的一種簡單方法。)和XML / CSV Feed中抓取網站,自動下載與抓取項目相關聯的圖像(或任何其餘媒體)的媒體管道,緩存DNS解析器等等!
接下來的步驟是安裝Scrapy, 按照教程學習如何建立一個完整的Scrapy項目。感謝加入社區,謝謝你們的關注!
原文連接:
0.Python 爬蟲之Scrapy入門實踐指南(Scrapy基礎知識)
(完)