謝鋼
摘? 要:針對攜號轉(zhuǎn)網(wǎng)服務(wù)背景下電信企業(yè)的客戶維系和客戶精細(xì)化服務(wù)需求,以及電信運(yùn)營商對網(wǎng)上不良信息監(jiān)測和清理的需要,以國內(nèi)主流社交媒體為主要研究對象,進(jìn)行網(wǎng)絡(luò)爬蟲策略的研究與實(shí)現(xiàn)。文章對基于Python的Scrapy爬蟲框架技術(shù)進(jìn)行了分析,設(shè)計(jì)和實(shí)現(xiàn)了基于Scrapy的微博信息采集與分析爬蟲,其能按照關(guān)鍵詞進(jìn)行爬取和分析;爬蟲使用非關(guān)系型數(shù)據(jù)庫MongoDB存儲數(shù)據(jù)、利用Selenium實(shí)現(xiàn)模擬登陸、結(jié)合Redis數(shù)據(jù)庫存儲爬取隊(duì)列。
關(guān)鍵詞:Scrapy;爬蟲;微博;MongoDB
Abstract:In view of the demand of telecommunication enterprise customer maintenance and refined customer service under the background of carrying signal to network service,and telecom operators need to monitor and clean up bad information on the internet,taking domestic mainstream social media as the main research object,this paper studies and implements the strategy of web crawler. This paper analyzes the framework technology of Scrapy crawler based on Python,designs and implements a crawler for microblog information collection and analysis based on Scrapy. The system crawls and analyzes according to keywords,uses non-relational database MongoDB to store data,uses Selenium to realize simulated login,and stores crawling queue with Redis database.
Keywords:Scrapy;crawler;microblog;MongoDB
0? 引? 言
在全業(yè)務(wù)大環(huán)境下,個人客戶市場是國內(nèi)電信整體市場的核心根據(jù)地,同時也是中國電信的薄弱領(lǐng)域和努力方向。2019年11月27日,工信部召開攜號轉(zhuǎn)網(wǎng)啟動儀式,即日起,攜號轉(zhuǎn)網(wǎng)正式在全國提供服務(wù),電信業(yè)務(wù)經(jīng)營者不得干涉用戶的自主選擇。號碼可攜制度促進(jìn)了運(yùn)營商間的競爭,提高了用戶使用的方便性,同時客戶的維系挽留成為電信企業(yè)的重中之重。研究網(wǎng)絡(luò)爬蟲技術(shù),采集和分析國內(nèi)主流社交媒體的大量數(shù)據(jù),弄清個人和企業(yè)客戶需求,聚焦影響客戶感知的主要矛盾,是開展科學(xué)化精細(xì)化客戶服務(wù)、提升公司服務(wù)能力、完善客戶維系關(guān)懷機(jī)制的核心實(shí)現(xiàn)技術(shù)。
隨著互聯(lián)網(wǎng)技術(shù)的高速發(fā)展,社交類應(yīng)用,尤其是微博這一新興媒體的快速發(fā)展,也出現(xiàn)了一些新的問題。一是容易造成隱私和個人信息泄露等網(wǎng)絡(luò)安全問題;二是一些不良有害信息的傳播,主要是以微博、即時通信等為載體,微博作為即時交互平臺,傳播性廣、即時性強(qiáng),整合了博客、即時通信、社交網(wǎng)絡(luò)等技術(shù)優(yōu)點(diǎn),在帶來便利溝通的同時,也容易被非法利用。2014年,全國“掃黃打非”工作小組辦公室等多部門聯(lián)合下發(fā)《關(guān)于開展打擊網(wǎng)上淫穢色情信息專項(xiàng)行動的公告》,要求“基礎(chǔ)電信運(yùn)營企業(yè)、網(wǎng)絡(luò)接入服務(wù)企業(yè)立即開展自查自糾,主動清理網(wǎng)上淫穢色情信息或鏈接”[1],通過網(wǎng)絡(luò)爬蟲技術(shù)獲取微博源數(shù)據(jù),是解決快速定位信息源、監(jiān)測網(wǎng)絡(luò)不良信息的主要技術(shù)途徑,利用自媒體主體的微博信息,研究者還可以完成數(shù)據(jù)分析、輿情監(jiān)測、熱點(diǎn)預(yù)測、情感分析等工作[2]。網(wǎng)絡(luò)爬蟲技術(shù)可以實(shí)現(xiàn)自動化地獲取大批量數(shù)據(jù)。
本人就職于中國電信股份有限公司婁底分公司網(wǎng)絡(luò)運(yùn)營部,因?yàn)閷?shí)際工作中對網(wǎng)絡(luò)數(shù)據(jù)的分析需要,一直關(guān)注和研究爬蟲技術(shù),并使用Python語言實(shí)現(xiàn)了基于Scrapy框架技術(shù)的爬蟲系統(tǒng)功能。
1? Scrapy框架
網(wǎng)絡(luò)爬蟲,是一種按照一定規(guī)則自動抓取Web信息的程序或者腳本。粗略來看,爬蟲的功能和實(shí)現(xiàn)過程包括構(gòu)造目標(biāo)URL、模擬瀏覽器偽造請求頭部、發(fā)起請求、解析數(shù)據(jù)、清洗并存儲數(shù)據(jù)、繞過反爬機(jī)制(使用IP代理、破解驗(yàn)證碼、模擬登錄等)等。Scrapy框架為爬蟲功能的實(shí)現(xiàn)提供了一套解決方案,它將爬蟲按照工作流程分為五個部分:Scrapy引擎、爬蟲、下載器、調(diào)度器和數(shù)據(jù)隊(duì)列[3]。在正式發(fā)起請求前,添加下載中間件處理:可以在向服務(wù)器請求數(shù)據(jù)之前,加上User-Agent偽裝瀏覽器,或者加上Cookie信息模擬登陸、維持訪問狀態(tài)。在服務(wù)器返回數(shù)據(jù)到下載器后,下載中間件也可以判斷返回的狀態(tài),然后對Response對象做進(jìn)一步的處理。服務(wù)器返回的數(shù)據(jù)最終到達(dá)爬蟲模塊。在對返回的數(shù)據(jù)進(jìn)行簡單處理后可以用Yield的方式將其提交到Item Pipeline模塊,進(jìn)行完整的數(shù)據(jù)清洗和數(shù)據(jù)存儲。
模塊化的設(shè)計(jì)使得Scrapy框架能夠滿足大規(guī)模的網(wǎng)絡(luò)爬蟲需求,開發(fā)者按照Scrapy的處理流程和工作邏輯,完成相應(yīng)的代碼書寫即可。此外,Scrapy框架也可以方便地實(shí)現(xiàn)具備分布式爬蟲能力的系統(tǒng),結(jié)合Redis服務(wù)器,將調(diào)度器的URL隊(duì)列存儲到公網(wǎng)上的Redis服務(wù)器即可。所有運(yùn)行同一爬蟲的分布式機(jī)器都將從Redis服務(wù)器中提取URL下載,爬取效率將大大提升。Redis中存儲的URL信息可以持久化保存,如果爬蟲碰到異常情況關(guān)閉,待爬蟲程序重新啟動后,不需要再從0開始爬取,直接從Redis數(shù)據(jù)庫的隊(duì)列中繼續(xù)提取URL,即可恢復(fù)之前的爬取進(jìn)度[4]。
2? 爬蟲系統(tǒng)總體設(shè)計(jì)
經(jīng)過調(diào)查和需求分析,爬蟲系統(tǒng)設(shè)計(jì)為六大功能模塊:模擬登陸獲取Cookie、爬取指定話題下的實(shí)時微博、爬取基于高級搜索功能下的話題微博、爬取指定用戶的所有微博、爬取用戶信息、數(shù)據(jù)分析與可視化。該系統(tǒng)主要實(shí)現(xiàn)爬取制定話題下的實(shí)時微博及其個人信息并進(jìn)行可視化分析的功能。
3? 瀏覽器自動登錄功能設(shè)計(jì)與實(shí)現(xiàn)
微博是一個動態(tài)網(wǎng)頁程序,登錄后才能搜索或者查看微博用戶的信息,Selenium是一個基于瀏覽器的測試工具,用于測試Web程序。與直接發(fā)送表單數(shù)據(jù)進(jìn)行交互的爬蟲不同,Selenium直接使用瀏覽器進(jìn)行操作,模擬人工點(diǎn)擊、拖動和填寫等瀏覽網(wǎng)頁的操作。目前很多網(wǎng)站程序使用JS對用戶提交的表單數(shù)據(jù)進(jìn)行加密處理,在加密過程中還使用了時間戳混淆、公鑰加密等方式,使用傳統(tǒng)表單交互需要花大量時間去分析程序的加密邏輯,自動登錄代碼需要模擬這個加密邏輯;當(dāng)網(wǎng)站更改加密方式后,開發(fā)者需要再次分析新的加密邏輯,并編寫新的代碼去加以適配和破解。使用Selenium可以簡單高效地解決瀏覽器模擬自動登錄問題。該功能模塊的實(shí)現(xiàn)過程為:通過Selenium打開瀏覽器,訪問對應(yīng)的登錄URL,定位到輸入表單,輸入用戶名和密碼,最后使用Click模擬點(diǎn)擊登錄按鈕。登錄成功后直接將Cookie信息保存到數(shù)據(jù)庫中,待下次訪問需要登錄的頁面直接將Cookie信息添加進(jìn)請求頭即可。如果登錄過程中需要驗(yàn)證碼,可以人工進(jìn)行識別干預(yù),也可以使用OCR文字識別,或者調(diào)用百度、騰訊的識別API輸入驗(yàn)證碼。
4? 數(shù)據(jù)解析
4.1? 正則表達(dá)式的使用
正則表達(dá)式(Regular Expression),可以用于檢索、替換匹配搜索規(guī)則的文本。設(shè)置正則表達(dá)式的方法與Windows中資源管理器的通配符搜索類似。使用正則表達(dá)式可以快速、高效地將網(wǎng)頁中的內(nèi)容提取出來。Python中的正則表達(dá)式有search、match、findall、sub四個常用的方法。其中search方法會掃描整個文本,并將第一個匹配的結(jié)果返回,沒匹配到信息則返回None值。match方法從第一個字符開始查找,如果文本中包含表達(dá)式的子串,則返回Match對象,沒有則返回None。findall方法會在全文中查找符合表達(dá)式的字符串,然后返回結(jié)果列表,非常適合提取HTML頁面。sub方法用于刪除指定格式的字符串,可以用在數(shù)據(jù)清洗階段。
4.2? XPath數(shù)據(jù)抓取
XPath(XML Path Language)是一種可以在XML文檔里查找信息的工具,最初只用于檢索XML文檔,現(xiàn)在同樣適用于查找HTML文檔。XPath的功能非常強(qiáng)大,可以將HTML的元素作為節(jié)點(diǎn),通過簡潔的路徑選擇表達(dá)式完成信息的抽取。此外,其還提供100多個內(nèi)建函數(shù),可以檢索字符串、數(shù)字、時間以及節(jié)點(diǎn)和序列。一個HTML文檔有許多的標(biāo)簽節(jié)點(diǎn),節(jié)點(diǎn)中有id、class等屬性信息。各個節(jié)點(diǎn)之間還有層級關(guān)系,根據(jù)這個特點(diǎn),可以通過XPath來定位節(jié)點(diǎn)并抓取目標(biāo)數(shù)據(jù)。
5? 數(shù)據(jù)存儲使用MongoDB數(shù)據(jù)庫
MongoDB數(shù)據(jù)庫類似于JSON的格式存儲數(shù)據(jù),組織數(shù)據(jù)的結(jié)構(gòu)為“數(shù)據(jù)庫”—“集合”—“文檔”—“字段”,其中集合類似于關(guān)系型數(shù)據(jù)庫中的表,文檔相當(dāng)于關(guān)系型數(shù)據(jù)庫中的一條記錄,字段則是關(guān)系型數(shù)據(jù)庫中的列。與關(guān)系型數(shù)據(jù)庫不同,MongoDB的集合里面,每個文檔的數(shù)據(jù)類型不用事先定義,數(shù)據(jù)中的字段可以隨意變動,因此并發(fā)寫入速度比傳統(tǒng)的關(guān)系型數(shù)據(jù)庫高很多。MongoDB數(shù)據(jù)庫中文檔的字段以鍵值對的形式組織[5],有利于爬蟲數(shù)據(jù)的保存和讀取。Python操作MongoDB的語法和原生的語法相似,可以將其內(nèi)容快速地遷移到Python當(dāng)中來。
爬蟲將數(shù)據(jù)爬取出來后需要保存到本地,系統(tǒng)選擇MongoDB作為存儲數(shù)據(jù)庫。根據(jù)爬取數(shù)據(jù)類型不同,共定義三種數(shù)據(jù)結(jié)構(gòu),分別為存儲微博信息、存儲用戶信息和存儲指定話題每天微博數(shù)量的數(shù)據(jù)類型。
6? 可視化分析功能實(shí)現(xiàn)
繪圖在數(shù)據(jù)可視化分析工作中非常重要,通過數(shù)據(jù)可視化,可以直觀地看出數(shù)據(jù)的關(guān)聯(lián)性和變化趨勢,還可以幫助研究者找出樣本中的異常值、得出有關(guān)模型的思路等。Matplotlib是基于Python的一個開源項(xiàng)目,旨在為Python提供數(shù)據(jù)繪圖包,是Python中非常底層的數(shù)據(jù)可視化庫,可以和圖形工具包如PyQt、WxPython一起使用[6]。Matplotlib具有高度可定制化的特點(diǎn),支持的圖表資源種類豐富、簡單易用、出圖質(zhì)量可達(dá)到出版質(zhì)量級別;其支持散點(diǎn)圖、餅圖、條形圖、折線圖、極坐標(biāo)圖等2D圖形,同時也支持繪制3D立體圖形。繪制的圖像可以保存成多種文件格式,如PNG、PDF、PS、EPS和SVG等格式。
爬蟲系統(tǒng)數(shù)據(jù)分析模塊一共分為四個部分,統(tǒng)計(jì)發(fā)布微博的終端、統(tǒng)計(jì)某話題下發(fā)布微博的地區(qū)、按時間統(tǒng)計(jì)某話題下微博發(fā)布的趨勢、根據(jù)微博的文本內(nèi)容生成詞云圖。實(shí)現(xiàn)流程為:首先定義基于Matplotlib的繪圖函數(shù),傳入字典元素,繪制折線圖和條形圖;再定義基于WordCloud第三方庫的詞云函數(shù),輸入詞頻的字典元素,輸出詞云圖;然后定義利用Jieba分詞技術(shù)統(tǒng)計(jì)詞頻的函數(shù),統(tǒng)計(jì)出詞頻信息,以字典的形式輸出;最后分別定義實(shí)現(xiàn)數(shù)據(jù)分析四個模塊的函數(shù),查詢出所需要的數(shù)據(jù)。篇幅所限,此處略去功能實(shí)現(xiàn)代碼。
7? 結(jié)? 論
針對電信公司業(yè)務(wù)和服務(wù)需求,研究基于Python的Scrapy爬蟲框架理論及實(shí)現(xiàn)技術(shù),研究內(nèi)容涉及爬蟲的原理、自動化測試、非關(guān)系型數(shù)據(jù)庫、數(shù)據(jù)分析、加解密、Python程序設(shè)計(jì)等相關(guān)知識,設(shè)計(jì)和實(shí)現(xiàn)的爬蟲系統(tǒng)通過爬取微博的關(guān)鍵詞搜索頁面、用戶主頁面實(shí)現(xiàn)話題下微博的爬取,按要求提取用戶需要的內(nèi)容,這些數(shù)據(jù)可以幫助電信公司研究人員分析客戶需求和監(jiān)測不良信息。
參考文獻(xiàn):
[1] 時鎮(zhèn)軍.互聯(lián)網(wǎng)不良信息監(jiān)控在電信運(yùn)營商的研究與應(yīng)用 [J].江蘇通信,2020,36(2):49-52.
[2] 陳興蜀,常天祐,王海舟,等.基于微博數(shù)據(jù)的“新冠肺炎疫情”輿情演化時空分析 [J].四川大學(xué)學(xué)報(自然科學(xué)版),2020,57(2):409-416.
[3] 林紅靜,黃夢醒.基于微博信息的關(guān)鍵詞庫爬蟲策略 [J].海南大學(xué)學(xué)報(自然科學(xué)版),2016,34(2):112-120.
[4] 崔慶才.Python3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn) [M].北京:人民郵電出版社,2018.
[5] 謝乾坤.左手MongoDB,右手Redis——從入門到商業(yè)實(shí)戰(zhàn) [M].北京:電子工業(yè)出版社,2019.
[6] 楊迎.基于Python語言的Web數(shù)據(jù)挖掘與分析研究 [J].現(xiàn)代信息科技,2019,3(23):63-65.
作者簡介:謝鋼(1975—),男,漢族,湖南婁底人,中級工程師,本科,研究方向:信息系統(tǒng)管理、網(wǎng)絡(luò)及接入網(wǎng)技術(shù)。