摘要:包括爬蟲編寫爬蟲避禁動態(tài)網(wǎng)頁數(shù)據(jù)抓取部署分布式爬蟲系統(tǒng)監(jiān)測共六個內(nèi)容,結(jié)合實際定向抓取騰訊新聞數(shù)據(jù),通過測試檢驗系統(tǒng)性能。
1 項目介紹
本項目的主要內(nèi)容是分布式網(wǎng)絡(luò)新聞抓取系統(tǒng)設(shè)計與實現(xiàn)。主要有以下幾個部分來介紹:
(1)深入分析網(wǎng)絡(luò)新聞爬蟲的特點,設(shè)計了分布式網(wǎng)絡(luò)新聞抓取系統(tǒng)爬取策略、抓取字段、動態(tài)網(wǎng)頁抓取方法、分布式結(jié)構(gòu)、系統(tǒng)監(jiān)測和數(shù)據(jù)存儲六個關(guān)鍵功能。
(2)結(jié)合程序代碼分解說明分布式網(wǎng)絡(luò)新聞抓取系統(tǒng)的實現(xiàn)過程。包括爬蟲編寫、爬蟲避禁、動態(tài)網(wǎng)頁數(shù)據(jù)抓取、部署分布式爬蟲、系統(tǒng)監(jiān)測共六個內(nèi)容,結(jié)合實際定向抓取騰訊新聞數(shù)據(jù),通過測試檢驗系統(tǒng)性能。
(3)規(guī)劃設(shè)計了包括數(shù)據(jù)清洗、編碼轉(zhuǎn)換、數(shù)據(jù)分類、對象添加等功能組成的數(shù)據(jù)處理模塊。
分布式網(wǎng)絡(luò)新聞抓取系統(tǒng)的設(shè)計
2.1 系統(tǒng)總體架構(gòu)設(shè)計
系統(tǒng)采用分布式主從結(jié)構(gòu),設(shè)置 1 個 Master 服務(wù)器和多個Slave 服務(wù)器,Master管理 Redis 數(shù)據(jù)庫和分發(fā)下載任務(wù),Slave 部署 Scrapy 抓取網(wǎng)頁和解析提取項目數(shù)據(jù)。服務(wù)器的基本環(huán)境是 Ubuntu 操作系統(tǒng),Master 服務(wù)器安裝 Redis 數(shù)據(jù)庫服務(wù)器和 Graphite,
Slave 安裝 Scrapy 和 Redis 客戶端。系統(tǒng)按功能可劃分為兩個主要模塊,一是數(shù)據(jù)抓取模塊,二是數(shù)據(jù)處理模塊。數(shù)據(jù)抓取模塊包含瀏覽器調(diào)用、網(wǎng)頁下載、字段提取、爬蟲避禁、數(shù)據(jù)存儲和系統(tǒng)監(jiān)測六個功能;數(shù)據(jù)處理模塊包含數(shù)據(jù)清洗、對象添加、編碼轉(zhuǎn)換和數(shù)據(jù)分類四個功能。
2.2 爬取策略的設(shè)計
本項目網(wǎng)絡(luò)爬蟲采用深度優(yōu)先的爬取策略,根據(jù)設(shè)定下載網(wǎng)頁數(shù)據(jù)。網(wǎng)頁鏈接處理流程如下:
1. 手動設(shè)置初始下載地址,一般為網(wǎng)站導(dǎo)航地址。
2. 爬蟲開始運行并從初始地址抓取第一批網(wǎng)頁鏈接。
3. 爬蟲根據(jù)正則表達式識別新鏈接中的目錄頁地址和新聞內(nèi)容頁地址,識別的新地址加入待下載隊列,等待抓取,未被識別的網(wǎng)頁地址被定義為無用鏈接丟掉。
4. 爬蟲從待下載隊列中依次取出網(wǎng)頁鏈接下載和提取數(shù)據(jù)。
5. 下載隊列為空,爬蟲停止抓取。
新聞?wù)军c的導(dǎo)航頁面數(shù)量是有限的,這一規(guī)律決定了在一定的人工參與下可以輕松獲取新聞導(dǎo)航頁面的 url,并將其作為爬蟲系統(tǒng)的初始 url。
2.3 爬取字段的設(shè)計
本項目以網(wǎng)絡(luò)新聞數(shù)據(jù)抓取為抓取目標(biāo),因此抓取內(nèi)容必須能夠客觀準(zhǔn)確地反應(yīng)網(wǎng)絡(luò)新聞特征。
以抓取騰訊網(wǎng)絡(luò)新聞數(shù)據(jù)為例,通過分析網(wǎng)頁結(jié)構(gòu),本文確定了兩步抓取步驟。第一步,抓取新聞內(nèi)容頁,獲得新聞標(biāo)題、新聞來源、新聞內(nèi)容、發(fā)表時間、評論數(shù)量、評論地址、相關(guān)搜索、用戶還喜歡的新聞和喜歡人數(shù)共 9 個內(nèi)容;第二步,在獲得評論地址后,抓取評論頁,獲得評論人 ID、評論人昵稱,評論人性別、評論人所在地區(qū)、評論時間、評論內(nèi)容、單條評論支持人數(shù)和單條評論回復(fù)數(shù)量等內(nèi)容。
2.4 動態(tài)網(wǎng)頁抓取方法設(shè)計
騰訊新聞網(wǎng)頁使用 Java Script 生成動態(tài)網(wǎng)頁內(nèi)容。一些 JS 事件觸發(fā)的頁面內(nèi)容在打開時發(fā)生變化,一些網(wǎng)頁在沒有 JS 支持的情況下根本不工作。一般的爬蟲根本無法從這些網(wǎng)頁獲取數(shù)據(jù)。 解決 JavaScript 動態(tài)網(wǎng)頁的抓取問題有四種方法:
1.寫代碼模擬相關(guān) JS 邏輯。
2.調(diào)用有界面的瀏覽器,類似各種廣泛用于測試的,如 Selenium 等。
3.使用無界面的瀏覽器,各種基于Webkit的,如 Casperjs、Phantomjs 等。
4.結(jié)合 JS 執(zhí)行引擎,實現(xiàn)一個輕量級的瀏覽器。
本項目由于是基于Python作為主要語言來編寫,因此采用使用 Selenium 來處理 JS
動態(tài)新聞頁面。它的優(yōu)點是簡單、易于實現(xiàn)。用Python 代碼模擬用戶對瀏覽器的操作,將網(wǎng)頁先加載到瀏覽器中打開,再從瀏覽器緩存中獲取網(wǎng)頁數(shù)據(jù),傳遞到 spider 解析提取,最后傳遞目標(biāo)數(shù)據(jù)到項目通道。
2.5爬蟲分布式設(shè)計
應(yīng)用 Redis 數(shù)據(jù)庫實現(xiàn)分布式抓取。基本思想是 Scrapy 爬蟲獲取到的urls(request)
都放到一個 Redis Queue中,所有爬蟲也都從指定 Redis Queue中獲取request(urls)。
Scrapy-Redis 中默認(rèn)使用Spider Priority Queue 來確定 url 的先后次序,這是由 sorted set
實現(xiàn)的一種非 FIFO、LIFO方式。
Redis 中存儲了 Scrapy 工程的request 和 stats 信息,根據(jù)這些信息可以掌握任務(wù)
情況和爬蟲狀態(tài),分配任務(wù)時便于均衡系統(tǒng)負(fù)載,有助于克服爬蟲的性能瓶頸。同時
利用 Redis 的高性能和易于擴展的特點能夠輕松實現(xiàn)高效率下載。當(dāng) Redis 存儲或者
訪問速度遇到問題時,可以通過增大 Redis 集群數(shù)和爬蟲集群數(shù)量改善。Scrapy-Redis
分布式方案很好解決了中斷續(xù)抓取以及數(shù)據(jù)去重問題,爬蟲重新啟動后,會對照 Redis
隊列中的url 進行抓取,已經(jīng)抓取的url 將自動過濾掉。
2.6 基于Graphite系統(tǒng)監(jiān)測組件設(shè)計
運用 Graphite 監(jiān)測系統(tǒng)運行狀態(tài),實現(xiàn)了一個針對分布式系統(tǒng)的 statscollector,
將系統(tǒng)的 stats 信息以圖表形式動態(tài)實時顯示,即實時監(jiān)測。Graphite 監(jiān)測的信息有:系統(tǒng)的下載信息、日志信息、文件計數(shù)、調(diào)度信息、爬蟲運行信息、爬蟲異常信息、文件數(shù)量、獲得 Item 數(shù)量、最大請求深度和收到的回應(yīng)數(shù)量等。
2.7 數(shù)據(jù)存儲模塊的設(shè)計
Scrapy 支持?jǐn)?shù)據(jù)存儲為 json、csv 和 xml 等文本格式,用戶可以在運行爬蟲時設(shè)置,例如:scrapy crawlspider –o items.json –t json,也可以在 Scrapy 工程文件的Item Pipeline
文件中定義。除此之外,Scrapy 提供了多種數(shù)據(jù)庫 API支持?jǐn)?shù)據(jù)庫存儲。如 Mongo DB、
Redis 等。數(shù)據(jù)存儲分兩個部分,一是網(wǎng)頁鏈接的存儲,二是項目數(shù)據(jù)的存儲。網(wǎng)頁鏈接存
儲于 Redis 數(shù)據(jù)庫,用于實現(xiàn)分布式爬蟲的下載管理;項目數(shù)據(jù)包括新聞數(shù)據(jù)和評論數(shù)據(jù),為方便處理,均保存為 JSON 格式的文本文件。評論數(shù)據(jù)存儲時以評論 url 中包含的評論ID 命名,通過這種方法可以將新聞數(shù)據(jù)與評論數(shù)據(jù)關(guān)聯(lián)起來。
3 項目總結(jié)
以上就是分布式網(wǎng)絡(luò)新聞抓取系統(tǒng)的系統(tǒng)設(shè)計部分,采用分布式的設(shè)計是因為單機爬蟲的爬取量和爬取速度的局限性,總體設(shè)計部分如上所示。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/40913.html
摘要:分布式爬蟲,分發(fā)網(wǎng)址是基于地址。注意要使用管理同一個集群,爬蟲項目名稱須一致,同時集群中配置相同任務(wù)瀏覽器訪問啟動爬蟲時即可看見兩個集群配置,啟動同名爬蟲開始分布式爬蟲啟動分布式爬蟲后狀態(tài) Scrapy-cluster 建設(shè) 基于Scrapy-cluster庫的kafka-monitor可以實現(xiàn)分布式爬蟲 Scrapyd+Spiderkeeper實現(xiàn)爬蟲的可視化管理 環(huán)境 IP...
摘要:想辦法區(qū)分爬蟲程序和正常的用戶。爬蟲是工具性程序,對速度和效率要求較高。生態(tài)圈完善,是最大對手。最要命的是爬蟲需要經(jīng)常修改部分代碼。爬蟲分類通用爬蟲也就是百度搜狐等搜索引擎。原本是為測試來測試網(wǎng)站的,后來成了爬蟲工程師最喜愛的工具。 一、爬蟲的基本知識: 1. 什么是爬蟲 爬蟲的英文翻譯為spider或者crawder,意為蜘蛛或者爬行者,從字面意思我們可以體會到:爬蟲就是把自己當(dāng)做蜘...
摘要:以上示例代表當(dāng)發(fā)現(xiàn)條或條以上的級別的時,自動停止當(dāng)前任務(wù),如果當(dāng)前時間在郵件工作時間內(nèi),則同時發(fā)送通知郵件。 showImg(https://segmentfault.com/img/remote/1460000018052810); 一、需求分析 初級用戶: 只有一臺開發(fā)主機 能夠通過 Scrapyd-client 打包和部署 Scrapy 爬蟲項目,以及通過 Scrapyd JS...
摘要:支持一鍵部署項目到集群。添加郵箱帳號設(shè)置郵件工作時間和基本觸發(fā)器,以下示例代表每隔小時或當(dāng)某一任務(wù)完成時,并且當(dāng)前時間是工作日的點,點和點,將會發(fā)送通知郵件。除了基本觸發(fā)器,還提供了多種觸發(fā)器用于處理不同類型的,包括和等。 showImg(https://segmentfault.com/img/remote/1460000018772067?w=1680&h=869); 安裝和配置 ...
閱讀 1529·2021-11-22 09:34
閱讀 3329·2021-09-29 09:35
閱讀 575·2021-09-04 16:40
閱讀 2919·2019-08-30 15:53
閱讀 2594·2019-08-30 15:44
閱讀 2590·2019-08-30 14:10
閱讀 1335·2019-08-29 18:43
閱讀 2214·2019-08-29 13:26