1. 程式人生 > >從0-1打造最強效能Scrapy爬蟲叢集

從0-1打造最強效能Scrapy爬蟲叢集

1 專案介紹

本專案的主要內容是分散式網路新聞抓取系統設計與實現。主要有以下幾個部分來介紹:

(1)深入分析網路新聞爬蟲的特點,設計了分散式網路新聞抓取系統爬取策略、抓取欄位、動態網頁抓取方法、分散式結構、系統監測和資料儲存六個關鍵功能。

(2)結合程式程式碼分解說明分散式網路新聞抓取系統的實現過程。包括爬蟲編寫、爬蟲避禁、動態網頁資料抓取、部署分散式爬蟲、系統監測共六個內容,結合實際定向抓取騰訊新聞資料,通過測試檢驗系統性能。

(3)規劃設計了包括資料清洗、編碼轉換、資料分類、物件新增等功能組成的資料處理模組。

  1. 分散式網路新聞抓取系統的設計
    2.1 系統總體架構設計

系統採用分散式主從結構,設定 1 個 Master 伺服器和多個Slave 伺服器,Master管理 Redis 資料庫和分發下載任務,Slave 部署 Scrapy 抓取網頁和解析提取專案資料。伺服器的基本環境是 Ubuntu 作業系統,Master 伺服器安裝 Redis 資料庫伺服器和 Graphite,

Slave 安裝 Scrapy 和 Redis 客戶端。系統按功能可劃分為兩個主要模組,一是資料抓取模組,二是資料處理模組。資料抓取模組包含瀏覽器呼叫、網頁下載、欄位提取、爬蟲避禁、資料儲存和系統監測六個功能;資料處理模組包含資料清洗、物件新增、編碼轉換和資料分類四個功能。

2.2 爬取策略的設計

本專案網路爬蟲採用深度優先的爬取策略,根據設定下載網頁資料。網頁連結處理流程如下:

1. 手動設定初始下載地址,一般為網站導航地址。

2. 爬蟲開始執行並從初始地址抓取第一批網頁連結。

3. 爬蟲根據正則表示式識別新連結中的目錄頁地址和新聞內容頁地址,識別的新地址加入待下載佇列,等待抓取,未被識別的網頁地址被定義為無用連結丟掉。

4. 爬蟲從待下載佇列中依次取出網頁連結下載和提取資料。

5. 下載佇列為空,爬蟲停止抓取。

新聞站點的導航頁面數量是有限的,這一規律決定了在一定的人工參與下可以輕鬆獲取新聞導航頁面的 url,並將其作為爬蟲系統的初始 url。
2.3 爬取欄位的設計

本專案以網路新聞資料抓取為抓取目標,因此抓取內容必須能夠客觀準確地反應網路新聞特徵。

以抓取騰訊網路新聞資料為例,通過分析網頁結構,本文確定了兩步抓取步驟。第一步,抓取新聞內容頁,獲得新聞標題、新聞來源、新聞內容、發表時間、評論數量、評論地址、相關搜尋、使用者還喜歡的新聞和喜歡人數共 9 個內容;第二步,在獲得評論地址後,抓取評論頁,獲得評論人 ID、評論人暱稱,評論人性別、評論人所在地區、評論時間、評論內容、單條評論支援人數和單條評論回覆數量等內容。

2.4 動態網頁抓取方法設計

騰訊新聞網頁使用 Java Script 生成動態網頁內容。一些 JS 事件觸發的頁面內容在開啟時發生變化,一些網頁在沒有 JS 支援的情況下根本不工作。一般的爬蟲根本無法從這些網頁獲取資料。 解決 JavaScript 動態網頁的抓取問題有四種方法:

1.寫程式碼模擬相關 JS 邏輯。

2.呼叫有介面的瀏覽器,類似各種廣泛用於測試的,如 Selenium 等。

3.使用無介面的瀏覽器,各種基於Webkit的,如 Casperjs、Phantomjs 等。

4.結合 JS 執行引擎,實現一個輕量級的瀏覽器。

本專案由於是基於Python作為主要語言來編寫,因此採用使用 Selenium 來處理 JS

動態新聞頁面。它的優點是簡單、易於實現。用Python 程式碼模擬使用者對瀏覽器的操作,將網頁先載入到瀏覽器中開啟,再從瀏覽器快取中獲取網頁資料,傳遞到 spider 解析提取,最後傳遞目標資料到專案通道。

2.5爬蟲分散式設計

應用 Redis 資料庫實現分散式抓取。基本思想是 Scrapy 爬蟲獲取到的urls(request)

都放到一個 Redis Queue中,所有爬蟲也都從指定 Redis Queue中獲取request(urls)。

Scrapy-Redis 中預設使用Spider Priority Queue 來確定 url 的先後次序,這是由 sorted set

實現的一種非 FIFO、LIFO方式。

Redis 中儲存了 Scrapy 工程的request 和 stats 資訊,根據這些資訊可以掌握任務

情況和爬蟲狀態,分配任務時便於均衡系統負載,有助於克服爬蟲的效能瓶頸。同時

利用 Redis 的高效能和易於擴充套件的特點能夠輕鬆實現高效率下載。當 Redis 儲存或者

訪問速度遇到問題時,可以通過增大 Redis 叢集數和爬蟲叢集數量改善。Scrapy-Redis

分散式方案很好解決了中斷續抓取以及資料去重問題,爬蟲重新啟動後,會對照 Redis

佇列中的url 進行抓取,已經抓取的url 將自動過濾掉。

2.6 基於Graphite系統監測元件設計

運用 Graphite 監測系統執行狀態,實現了一個針對分散式系統的 statscollector,

將系統的 stats 資訊以圖表形式動態實時顯示,即實時監測。Graphite 監測的資訊有:系統的下載資訊、日誌資訊、檔案計數、排程資訊、爬蟲執行資訊、爬蟲異常資訊、檔案數量、獲得 Item 數量、最大請求深度和收到的迴應數量等。

2.7 資料儲存模組的設計

Scrapy 支援資料儲存為 json、csv 和 xml 等文字格式,使用者可以在執行爬蟲時設定,例如:scrapy crawlspider –o items.json –t json,也可以在 Scrapy 工程檔案的Item Pipeline

檔案中定義。除此之外,Scrapy 提供了多種資料庫 API支援資料庫儲存。如 Mongo DB、

Redis 等。資料儲存分兩個部分,一是網頁連結的儲存,二是專案資料的儲存。網頁連結存

儲於 Redis 資料庫,用於實現分散式爬蟲的下載管理;專案資料包括新聞資料和評論資料,為方便處理,均儲存為 JSON 格式的文字檔案。評論資料儲存時以評論 url 中包含的評論ID 命名,通過這種方法可以將新聞資料與評論資料關聯起來。

3 專案總結

以上就是分散式網路新聞抓取系統的系統設計部分,採用分散式的設計是因為單機爬蟲的爬取量和爬取速度的侷限性,總體設計部分如上所示。