摘要:包括爬蟲編寫爬蟲避禁動態網頁數據抓取部署分布式爬蟲系統監測共六個內容,結合實際定向抓取騰訊新聞數據,通過測試檢驗系統性能。
1 項目介紹
本項目的主要內容是分布式網絡新聞抓取系統設計與實現。主要有以下幾個部分來介紹:
(1)深入分析網絡新聞爬蟲的特點,設計了分布式網絡新聞抓取系統爬取策略、抓取字段、動態網頁抓取方法、分布式結構、系統監測和數據存儲六個關鍵功能。
(2)結合程序代碼分解說明分布式網絡新聞抓取系統的實現過程。包括爬蟲編寫、爬蟲避禁、動態網頁數據抓取、部署分布式爬蟲、系統監測共六個內容,結合實際定向抓取騰訊新聞數據,通過測試檢驗系統性能。
(3)規劃設計了包括數據清洗、編碼轉換、數據分類、對象添加等功能組成的數據處理模塊。
分布式網絡新聞抓取系統的設計
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 項目總結
以上就是分布式網絡新聞抓取系統的系統設計部分,采用分布式的設計是因為單機爬蟲的爬取量和爬取速度的局限性,總體設計部分如上所示。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40913.html
摘要:分布式爬蟲,分發網址是基于地址。注意要使用管理同一個集群,爬蟲項目名稱須一致,同時集群中配置相同任務瀏覽器訪問啟動爬蟲時即可看見兩個集群配置,啟動同名爬蟲開始分布式爬蟲啟動分布式爬蟲后狀態 Scrapy-cluster 建設 基于Scrapy-cluster庫的kafka-monitor可以實現分布式爬蟲 Scrapyd+Spiderkeeper實現爬蟲的可視化管理 環境 IP...
摘要:想辦法區分爬蟲程序和正常的用戶。爬蟲是工具性程序,對速度和效率要求較高。生態圈完善,是最大對手。最要命的是爬蟲需要經常修改部分代碼。爬蟲分類通用爬蟲也就是百度搜狐等搜索引擎。原本是為測試來測試網站的,后來成了爬蟲工程師最喜愛的工具。 一、爬蟲的基本知識: 1. 什么是爬蟲 爬蟲的英文翻譯為spider或者crawder,意為蜘蛛或者爬行者,從字面意思我們可以體會到:爬蟲就是把自己當做蜘...
摘要:以上示例代表當發現條或條以上的級別的時,自動停止當前任務,如果當前時間在郵件工作時間內,則同時發送通知郵件。 showImg(https://segmentfault.com/img/remote/1460000018052810); 一、需求分析 初級用戶: 只有一臺開發主機 能夠通過 Scrapyd-client 打包和部署 Scrapy 爬蟲項目,以及通過 Scrapyd JS...
摘要:支持一鍵部署項目到集群。添加郵箱帳號設置郵件工作時間和基本觸發器,以下示例代表每隔小時或當某一任務完成時,并且當前時間是工作日的點,點和點,將會發送通知郵件。除了基本觸發器,還提供了多種觸發器用于處理不同類型的,包括和等。 showImg(https://segmentfault.com/img/remote/1460000018772067?w=1680&h=869); 安裝和配置 ...
閱讀 1501·2021-11-22 09:34
閱讀 3319·2021-09-29 09:35
閱讀 562·2021-09-04 16:40
閱讀 2911·2019-08-30 15:53
閱讀 2581·2019-08-30 15:44
閱讀 2583·2019-08-30 14:10
閱讀 1327·2019-08-29 18:43
閱讀 2204·2019-08-29 13:26