從0-1打造最強性能Scrapy爬蟲集羣

1 項目介紹正則表達式

本項目的主要內容是分佈式網絡新聞抓取系統設計與實現。主要有如下幾個部分來介紹:數據庫

(1)深刻分析網絡新聞爬蟲的特色,設計了分佈式網絡新聞抓取系統爬取策略、抓取字段、動態網頁抓取方法、分佈式結構、系統監測和數據存儲六個關鍵功能。json

(2)結合程序代碼分解說明分佈式網絡新聞抓取系統的實現過程。包括爬蟲編寫、爬蟲避禁、動態網頁數據抓取、部署分佈式爬蟲、系統監測共六個內容,結合實際定向抓取騰訊新聞數據,經過測試檢驗系統性能。瀏覽器

(3)規劃設計了包括數據清洗、編碼轉換、數據分類、對象添加等功能組成的數據處理模塊。緩存

  1. 分佈式網絡新聞抓取系統的設計
    2.1 系統整體架構設計

系統採用分佈式主從結構,設置 1 個 Master 服務器和多個Slave 服務器,Master管理 Redis 數據庫和分發下載任務,Slave 部署 Scrapy 抓取網頁和解析提取項目數據。服務器的基本環境是 Ubuntu 操做系統,Master 服務器安裝 Redis 數據庫服務器和 Graphite,服務器

Slave 安裝 Scrapy 和 Redis 客戶端。系統按功能可劃分爲兩個主要模塊,一是數據抓取模塊,二是數據處理模塊。數據抓取模塊包含瀏覽器調用、網頁下載、字段提取、爬蟲避禁、數據存儲和系統監測六個功能;數據處理模塊包含數據清洗、對象添加、編碼轉換和數據分類四個功能。網絡

2.2 爬取策略的設計架構

本項目網絡爬蟲採用深度優先的爬取策略,根據設定下載網頁數據。網頁連接處理流程以下:scrapy

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 項目總結

以上就是分佈式網絡新聞抓取系統的系統設計部分,採用分佈式的設計是由於單機爬蟲的爬取量和爬取速度的侷限性,整體設計部分如上所示。

相關文章
相關標籤/搜索