0.Python 爬蟲之Scrapy入門實踐指南(Scrapy基礎知識)

0.0、Scrapy基礎

Python2:適合爬取非中文html

Python3:適合爬取中文python

Scrapy是一種快速的高級Web爬行和Web抓取框架,用於抓取網站並從其頁面中提取結構化數據。它可用於各類用途,從數據挖掘到監控和自動化測試。正則表達式

0.一、Scrapy 框架圖

0.二、Scrapy主要包括瞭如下組件:

  • 引擎(Scrapy): 用來處理整個系統的數據流處理, 觸發事務(框架核心)
  • 調度器(Scheduler): 用來接受引擎發過來的請求, 壓入隊列中, 並在引擎再次請求的時候返回. 能夠想像成一個URL(抓取網頁的網址或者說是連接)的優先隊列, 由它來決定下一個要抓取的網址是什麼, 同時去除重複的網址
  • 下載器(Downloader): 用於下載網頁內容, 並將網頁內容返回給蜘蛛(Scrapy下載器是創建在twisted這個高效的異步模型上的)
  • 爬蟲(Spiders): 爬蟲是主要幹活的, 用於從特定的網頁中提取本身須要的信息, 即所謂的實體(Item)。用戶也能夠從中提取出連接,讓Scrapy繼續抓取下一個頁面
  • 項目管道(Pipeline): 負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證明體的有效性、清除不須要的信息。當頁面被爬蟲解析後,將被髮送到項目管道,並通過幾個特定的次序處理數據。
  • 下載器中間件(Downloader Middlewares): 位於Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
  • 爬蟲中間件(Spider Middlewares): 介於Scrapy引擎和爬蟲之間的框架,主要工做是處理蜘蛛的響應輸入和請求輸出。
  • 調度中間件(Scheduler Middewares): 介於Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的請求和響應。

0.三、Scrapy簡單示例以下:

咱們將以最簡單的方式運行蜘蛛,它在將訪問並獲取 http://quotes.toscrape.com上的名言(文本)、做者 :數據庫

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 ,並使用 如下命令運行蜘蛛:json

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條...
 ]

0.四、Scrapy運行流程以下:

當咱們運行「scrapy runspider quotes_spider.py」命令時,Scrapy會查找Spider的定義並經過其爬蟲引擎運行它;緩存

經過向start_urls 屬性中定義的URL發出請求(在上述示例中即:start_urls = ['http://quotes.toscrape.com/'])開始爬行,並調用默認回調方法parse,將響應對象做爲參數進行傳遞;併發

在parse回調方法中,咱們使用CSS Selector循環遍歷quote元素,並將提取的名言文本和做者生成Python dict,除此以外咱們還查找指向下一頁的連接,將得到的下一頁連接再次以一樣的方式進行請求處理;框架

在這裏,咱們能夠看到Scrapy的一個主要優勢:請求是 異步調度與處理的。

這意味着Scrapy不須要等待請求完成和處理,它能夠在此期間發送另外一個請求或執行其餘操做。

這也意味着即便某些請求失敗或在處理錯誤時發生錯誤,其餘請求也能夠繼續運行。

雖然這使得咱們可以進行很是快速的爬網(以容錯的方式同時發送多個併發請求),但Scrapy還能夠經過一些設置讓咱們的蜘蛛以更加紳士的方式去爬網。

咱們能夠執行如下操做:在每一個請求之間設置下載延遲,限制每一個域或每一個IP的併發請求數量,甚至使用自動限制擴展,以嘗試自動解決這些問題。

注意:咱們在這裏使用的是Feed導出生成JSON文件,除此以外咱們還能夠輕鬆更改導出格式(例如XML或CSV),存儲於後端服務(例如FTP或Amazon S3),還能夠編寫 item pipeline 用以將 items 存儲在數據庫中。

運行流程小結:

  1. 首先,引擎從調度器中取出一個連接(URL)用於接下來的抓取;
  2. 引擎把URL封裝成一個請求(Request)傳給下載器,下載器把資源下載下來,並封裝成應答包(Response);
  3. 而後,爬蟲解析Response;
  4. 如果解析出實體(Item),則交給實體管道進行進一步的處理;
  5. 如果解析出的是連接(URL),則把URL交給Scheduler等待抓取。

0.五、還有什麼?

經過上述實踐,咱們已經瞭解瞭如何使用Scrapy從網站中提取和存儲項目,但這只是表面。

Scrapy提供了許多強大的功能,能夠幫助咱們輕鬆高效地進行抓取,例如:

  1. 內置支持使用擴展的CSS選擇器和XPath表達式,讓咱們能夠高效地從HTML / XML源代碼中選擇和提取數據,並使用正則表達式提取輔助方法;

  2. 提供交互式Shell控制檯(支持IPython),用於嘗試使用CSS和XPath表達式來抓取數據,在編寫或調試蜘蛛時很是有用;

  3. 內置支持以多種格式(JSON,CSV,XML)生成Feed導出並將其存儲在多個後端服務(FTP、S三、數據庫、本地文件系統)中;

  4. 強大的編碼支持和自動檢測,用於處理外部,非標準和損壞的編碼聲明;

  5. 強大的可擴展性支持,容許使用Signals(信號)和定義良好的API(中間件,擴展和 管道)插入本身的自定義功能;

  6. 諸多的內置擴展和中間件用於處理:

    1. Cookie和會話處理
    2. HTTP功能,如壓縮,身份驗證,緩存
    3. User-Agent 代理請求
    4. robots.txt
    5. 爬行深度限制...
  7. 一個Telnet控制檯,用於鏈接到Scrapy進程內運行的Python控制檯,用以調試爬蟲;

  8. 還有其餘好東西,好比可重複使用的蜘蛛,能夠從Sitemaps(站點地圖:網站管理員向搜索引擎通知可用於爬行的網站頁面的一種簡單方法。)和XML / CSV Feed中抓取網站,自動下載與抓取項目相關聯的圖像(或任何其餘媒體)的媒體管道,緩存DNS解析器等等!

0.六、下一步是什麼?

接下來的步驟是安裝Scrapy, 按照教程學習如何建立一個完整的Scrapy項目。感謝加入社區,謝謝你們的關注!

原文連接:

0.Python 爬蟲之Scrapy入門實踐指南(Scrapy基礎知識)

OpsRoad(運維之路社區)

(完)

相關文章
相關標籤/搜索