◆馮 揚
一種基于RabbitMQ的論壇輿情爬取方案及實現(xiàn)
◆馮 揚
(武漢虹旭信息技術(shù)有限責(zé)任公司 湖北 430000)
隨著互聯(lián)技術(shù)的普及和應(yīng)用,網(wǎng)民在互聯(lián)網(wǎng)上進行意見表達的需求日益增多,而各大網(wǎng)絡(luò)論壇也早已成為資訊傳播與意見討論的公共平臺。對于各種社會事件的發(fā)酵與輿情傳播,網(wǎng)絡(luò)論壇早已是不可或缺的媒體工具之一。本系統(tǒng)基于對網(wǎng)絡(luò)論壇輿情監(jiān)控的需求,基于RabbitMQ隊列管理服務(wù),實現(xiàn)了一種高并發(fā),高魯棒性的系統(tǒng)后臺爬蟲方案,有針對性的對輿情信息進行爬取搜集,為后續(xù)分析系統(tǒng)提供可靠的第一手數(shù)據(jù)。
RabbitMQ;網(wǎng)絡(luò)輿情;分布式爬蟲;多線程;爬蟲策略;消息確認;心跳檢測;隊列管理
近年來網(wǎng)絡(luò)輿論傳播的趨勢已經(jīng)逐漸趕超傳統(tǒng)媒體的地位,隨著互聯(lián)網(wǎng)安全法的頒布,對于公共網(wǎng)絡(luò)安全的管理需求日益增加。通過網(wǎng)絡(luò)爬蟲對各大論壇輿情進行爬取與數(shù)據(jù)搜集,是當(dāng)前一個主流的解決方案。
傳統(tǒng)爬蟲一般通過給定的url進行深度爬取、廣度爬取[1]。但是隨著各大網(wǎng)站安全意識的增強和技術(shù)棧的更新,越來越多的網(wǎng)站采用了反爬蟲策略,限制了傳統(tǒng)爬蟲的爬取能力。對于那些采取了反爬蟲手段的論壇網(wǎng)站,傳統(tǒng)爬蟲往往處理能力較差,使得爬取數(shù)據(jù)的精度有限。本系統(tǒng)根據(jù)針對性的爬取需求以及對系統(tǒng)穩(wěn)定性的要求,采用RabbitMQ隊列管理服務(wù),對指定任務(wù)實現(xiàn)分布式高并發(fā)爬取,合理利用了RabbitMQ多隊列、高時效性、高穩(wěn)定性的特征對不同爬取進度的任務(wù)進行有效管理,對于有反爬蟲策略的網(wǎng)站,采用Selenium模擬登錄,Javascript逆向手段等進行規(guī)避,有效的實現(xiàn)了精準爬取,并且保障了系統(tǒng)的穩(wěn)定性。
RabbitMQ是一款開源的消息隊列服務(wù)系統(tǒng),基于AMQP(Adevanced Message Queuing Protocol)開放標準開發(fā)而成,最早是為了解決通信系統(tǒng)中消息隊列的傳遞而誕生。RabbitMQ采用Erlang語言開發(fā),Erlang語言由愛立信設(shè)計,在電信行業(yè)領(lǐng)域使用廣泛。OTP(Open Telecom Platform)屬于Erlang語言的一個分支,其中基于Erlang開發(fā)的中間件/庫/工具,為Erlang的應(yīng)用開發(fā)提供了極大的便利。RabbitMQ的運行需要基于OTP庫。AMQP協(xié)議中的基本概念:
(1)Broker:用于接受和分發(fā)消息的服務(wù)端,RabbitMQ Server就是一個Message Broker。
(2)Virtual host: 在AMQP基本組件的基礎(chǔ)上劃分出來的虛擬分組??梢詾槎嘤脩暨B接提供邏輯上分離的服務(wù),為每個用戶在各自的vhost中建立單獨的交換/隊列服務(wù)。
(3)Publisher:消息的生成和發(fā)送端。
(4)Consumer:消息的接受與處理端。
(5)Connection: publisher/consumer和broker之間的TCP連接。一般情況下,斷鏈操作只會出現(xiàn)在client端,除非網(wǎng)絡(luò)故障或者broker服務(wù)出現(xiàn)問題,否則broke端不會出現(xiàn)斷鏈的現(xiàn)象。
(6)Channel: channel是一個邏輯連接的概念,每個channel之間是完全隔離的,對于多線程程序,通常是一個線程對應(yīng)一個單獨的channel進行通訊。channel減輕了操作系統(tǒng)創(chuàng)建TCP連接的開銷。
(7)Exchange: 相當(dāng)于通訊設(shè)備中交換的作用,根據(jù)分發(fā)規(guī)則,匹配查詢表中的routing key(路由鍵),分發(fā)消息到消息隊列中。常用的類型有:direct (點對點)、topic (分發(fā)) 和fanout (廣播)。
(8)Queue: 消息最終被送到這里等待consumer取走。一個message可以被同時拷貝到多個queue中。
(9)Binding: exchange和queue之間的虛擬連接,binding中可以包含routing key,exchange可以根據(jù)routing key對消息進行投遞。
圖1 AMQP協(xié)議框架
考慮到系統(tǒng)對爬取內(nèi)容的針對性需求與穩(wěn)定性需求,設(shè)計了一款基于RabbitMQ并發(fā)處理任務(wù)的爬蟲系統(tǒng),由Publisher構(gòu)造爬取任務(wù),通過Exchange綁定的routine-Key,下發(fā)到指定的爬取任務(wù)中,并且根據(jù)不同論壇爬取難易度不同,采用不同的爬取策略,針對性的構(gòu)造爬取方法,提高爬取精度與數(shù)據(jù)的準確度。
爬取任務(wù)結(jié)束后,通過RabbitMQ的消息確認機制,告知服務(wù)器結(jié)束任務(wù),清理內(nèi)存,并等待下一次任務(wù)的下發(fā)。
對于不同的論壇,爬取難易度不同,有些可以直接爬取,有些需要登錄以后才能看到頁面展現(xiàn)的數(shù)據(jù),這就需要實現(xiàn)自動化登錄的流程。系統(tǒng)根據(jù)不同任務(wù)的針對性需求,采取不同的爬取策略。主要用到的爬取策略包括:
圖2 爬蟲系統(tǒng)框架
(1)構(gòu)造發(fā)包方式;
(2)Selenium模擬瀏覽器登錄方式;
(3)Javascript逆向分析方式。
由于采用RabbitMQ進行任務(wù)分發(fā)與隊列管理,能夠保證不同任務(wù)間互不干擾,獨立運行。由于需求決定下發(fā)的任務(wù)大小有限,消息分發(fā)過程中不會造成性能瓶頸。
這里主要考慮消息丟失的問題和客戶端斷鏈的問題,這里用到了RabbitMQ的兩個特性:消息確認機制[2]和心跳檢測機制[3]。
(1)消息確認機制
消息確認機制可以解決任務(wù)丟失問題。如果客戶端在執(zhí)行過程中由于異常斷開鏈接,而爬取任務(wù)還未執(zhí)行完,為了避免任務(wù)丟失,這里采用RabbitMQ提供的消息確認機制,當(dāng)客戶端消息處理完成時,給Server端發(fā)送確認消息,來通知服務(wù)端可以刪除消息,如果客戶端中途因為異常掛掉,只要觸發(fā)重啟鏈接機制,仍能夠從隊列中讀取到之前的任務(wù)消息,從而確保任務(wù)安全可靠的傳遞。
(2)心跳檢測機制
心跳檢測機制用于檢測客戶端與RabbitMQ服務(wù)器之間TCP鏈接的情況。心跳timeout值決定了RabbitMQ服務(wù)器與Client相互連接的最大時間。當(dāng)客戶端檢測到與RabbitMQ服務(wù)端的連接不可達時,需要重新發(fā)起TCP連接請求。
網(wǎng)絡(luò)在丟包率很高等其他情況中會出現(xiàn)連接失敗的情況。AMQP0-9-1協(xié)議提供心跳檢測功能來確保應(yīng)用層及時發(fā)現(xiàn)連接中斷的的情況,心跳檢測還能保護TCP連接不會在一段時間內(nèi)沒有響應(yīng)而被終止[3]。
由于客戶端在執(zhí)行爬蟲任務(wù)的時候是線程阻塞模式,如果爬取時間過長,會造成心跳檢測失敗,這就需要評估任務(wù)時間,從而選取一個適當(dāng)?shù)男奶瑫r時間。該值是在建立鏈接的時候協(xié)商生成的,在調(diào)用API創(chuàng)建TCP鏈接的時候,可以修改心跳包的值,如果設(shè)置為0,則關(guān)閉心跳檢測機制。
本文在傳統(tǒng)輿情爬蟲的基礎(chǔ)上,基于需求提出了一種面向任務(wù)爬取的分布式爬蟲系統(tǒng),采用了開源隊列管理服務(wù)系統(tǒng)RabbitMQ,實現(xiàn)了任務(wù)穩(wěn)定下發(fā),多客戶端并行爬取的論壇輿情爬蟲系統(tǒng),為后續(xù)海量數(shù)據(jù)分析提供可靠的依據(jù)。
[1]張旭,張振江,劉云.BBS輿情系統(tǒng)爬蟲模塊的研究[J].鐵路計算機應(yīng)用,2010.
[2]徐震,焦文彬.RabbitMQ小消息確認機制優(yōu)化[J].計算機系統(tǒng)應(yīng)用,2018.
[3]RabbitMQ-Detecting Dead TCP Connections with Heartbeats and TCP Keepalives[EB/OL] https://www.rabbitmq. com/heartbeats.html2018.