胡海潮
(昆明理工大學,云南 昆明 650000)
隨著網絡技術的快速發展,信息社會進入大數據時代。其中,在線社交網絡(Online Social Network,OLSN)所產生的數據特征尤其明顯,其規模巨大,內容豐富,影響范圍廣[1-2]。因此,對此類社交網絡數據的采集研究,分析人物特點,獲得統計規律具有十分重要的研究意義。
但如何有效地提取出這些信息成為研發人員一個巨大的挑戰。其中,新浪微博作為中國最具影響力的社交網絡工具之一,所產生的數據有別于傳統的線下數據,其數據規模非常大,其信息可以在網絡中無限擴展,熱點信息存在爆炸性增長特性,這些特點使得通過人工自己來尋求答案不僅費時,而且特別費力[3]。此外,雖然新浪提供了供開發者獲取數據的訪問編程接口(OpenAPI),但其對普通用戶具有權限,抓取頻率等都有嚴格的限制,且無法對微博內容進行搜索[4]。為此,本文提出了一款基于新浪微博的爬蟲程序設計方法。
本文以移動端微博用戶為例,設計并提出了一款以人與人關系為連接的網絡爬蟲,可以模擬登錄并獲取相關人物名稱等信息,并將這些數據保存到本地,方便做進一步的數據挖掘與分析。同時,本文爬蟲還通過解析關鍵路徑以匹配,利用該匹配功能可以實現網頁指定路徑的數據提取,最后,通過廣度遍歷,逐層獲得人物之間的關系[5]。使用本文爬蟲程序,不僅穩定性強、易操作,而且還能夠縮短數據分析人員的開發程序所需時間,使得他們可以將更多的精力放在數據分析上面。
網絡爬蟲,也被稱為網頁蜘蛛[6]。簡單地說,便是一個計算機程序,按照定義好的規則從互聯網上抓取網頁信息。網絡爬蟲這種技術不僅可以用來檢查站點中所有鏈接是否有效,還可被搜索引擎使用,將抓取到的網頁的關鍵數據保存到本地。其最基本的思路為:將一批鏈接設為種子,然后從這些鏈接中獲取更多的鏈接進行下一輪抓取[7]。然而實際應用中,由于互聯網數據繁多,不可能將網上全部數據抓取下來,我們往往抓取到一定數量后,會自動終止程序。據了解,現今最好的搜索引擎,也無法爬取整個互聯網一半的網頁。
Python語言是在計算生態的大背景下誕生、發展和再生,是一種功能強大、語法簡潔清晰的開源編程語言,且幾乎能夠在目前所有的操作系統上運行[8-9]。其中,Python3系列語言在Python2的基礎上,又做了進一步優化,能夠將其他編程語言最優秀的成果封裝起來,簡化功能實現的復雜度,使我們爬取數據更加簡便。Python語言非常強大,是高效率的完全面向對象的語言,能有效而簡單地實現面向對象編程,其第三方功能庫很多,使用也很方便。因此,本文利用Python3作為編程語言進行相關數據內容的爬取。
廣度遍歷是連通圖的一種遍歷策略。其基本思想是:從圖中某一頂點V0出發,首先訪問該頂點;隨后從V0出發,訪問與V0直接相連接但未曾訪問的頂點W1,W2,…Wk;然后,依次從W1,W2,…Wk出發,訪問與其直接連接但未曾訪問的頂點;重復上述步驟直至所有頂點全被訪問。由于社區網絡用戶信息量大、耗時長等原因,實際運行時,我們很難將全部用戶信息獲取完,所以我們首先會定義運行到多少層用戶自動結束。與其相類似的還有深度遍歷,此處不再贅述。
模擬瀏覽器登錄有兩種實現方法:(1)直接運用網站中的cookie登錄。(2)通過模擬提交表單登錄。
方法1直接使用cookie登錄,避免了因用戶頻繁輸入賬號和密碼造成的不便,可以安全地登錄進微博中,又不泄露用戶的隱私,利于系統的分布式實現,可以支持導入第三方的賬戶,但是由于cookie本身的限制,一般只有3~5天的使用期限。
而方法2較為繁瑣,需要提供用戶名和密碼,網頁對其限制性比較大,但可靠性高,且沒有時間限制[3]。具體操作步驟如下:(1)通過網址,得到Http頭部的Set—cookie值。(2)設置cookie值,post用戶名和密碼到登錄頁面。(3)保存返回的set—cookie值,以供方法1使用。(4)設置新的cookie值,再次訪問主頁,并處理 Location 跳轉。
方法1和2各有利弊,本項目由于抓取時間不長。所以直接使用方法1來模擬登錄,不僅方便快捷,而且更快實現獲取我們想要得到的數據。
模擬登錄成功后,首先根據用戶提供給我們的新浪微博賬號(無需密碼)進入初始頁,由于我們需要爬取該賬號關注的人名稱,所以得先獲取該賬戶關注人的頁數。
步驟如下:(1)進入使用者關注人的第一頁。(2)獲取該網頁的所有文本信息。(3)從文本信息中抽取出頁數信息。
關鍵代碼如下:

其中,第三步直接使用XPath表達式,逐級檢索,獲得最終關鍵數據:關注人頁數。
獲取用戶名稱與獲取總頁數步驟類似,只是將第三步中提取關鍵路徑改為:user_name1 = selector1.xpath(‘/html/body/div[4]/div[1]/text()’) 即可。
此步為整個過程中較為關鍵一步,首先得通過鏈接,從第一頁開始獲取用戶關注人的姓名與URL。這類似2.2,依舊分為3步:進入網址;下載HTML;抽取所需信息。
然而,由于我們需要將其寫為一個子函數,且保存兩類數據,所以,首先得初始化一個對象items,用以保存從非結構性的數據源提取結構性數據;緊接著,我們按照抽取所需信息的“三步曲”,實現獲得當前頁面用戶關注人的名稱與URL鏈接,隨后,我們將獲取到的數據保存到items中。由于用戶關注人不止一頁,而我們之前得到了關注人用戶的總頁數,此時可以外加一個for循環,逐頁訪問,獲取數據;最后,我們只需要返回items即可。
在獲取到我們想要得到的數據后,由于本項目是分析人際關系,且由于新浪微博不存在“重名現象”,所以,我們只需將用戶名稱與其關注對象名稱保存即可,而Excel是較為方便存儲的工具,以此作為我們存儲信息的文件。
定義一個子函數:excel_write(),傳入items與user_name數據;隨后,創建Excel表格,定義其名稱;Excel表格首行寫入關鍵詞:UserName及其HisFollow;最終,定義一個指針index,逐行寫入數據。
由于第一層的特殊性,隨后爬取的第二,三,四……層與其存在部分差異,緊接著,以獲取第二至三層數據為例,通過廣度遍歷獲得數據。
思路如下:(1)通過items,獲取第二層用戶ID。(2)獲取第二層用戶關注人的總頁面。(3)獲取用戶本身名稱。(4)獲取用戶關注對象所有名稱及其URL。(5)寫入Excel中。
可以看出來,大體上與2.1~2.4過程類似,只是將2.1的模擬登錄改為從items中提取用戶ID來;另外,第3步,由于items中其實已經存在第二層用戶名稱,所以第3步可以直接刪除,第一步中直接提取用戶名稱即可。
其獲得部分數據如圖1所示。
第2節已經完成了程序所需爬取下來的信息,但在運行過程當中,會出現各種各樣的問題,本節是在第2節的基礎上,對程序進行了改進,提升程序的穩定性、實用性,以及優化程序,使其更為簡單合理。
對一個網站訪問過于頻繁,往往就會被反爬蟲措施所識別和攔截[10],所以,當我們訪問網站以及下載網站信息時,往往會設置延時,其中,最簡單的是引入sleep庫,在需要延時訪問或下載信息前加上sleep()即可;其中,括號內填入需要延時的時間。
另外,Scrapy也提供了一種比較智能的方法來解決限速問題,即通過自動限速擴展,該擴展能根據Scrapy服務器及爬取的網站的負載自動限制爬取速度。
由于本程序運行時間較長,當我們需要了解程序運行到哪一步時,不可能中斷程序,了解進程。所以,在編寫程序時,在相應步驟結束后,加上 print(“… ”) 即可,此優化較為簡單,不再敘述。
另外,由于網頁的特殊性,程序可能會出現未知錯誤,而造成中途不再下載數據,浪費時間。所以為了提升程序的健壯性,我們在程序中可能會出現錯誤的地方加上try…catch…語句,如在獲取用戶名稱時:



圖1 部分爬取數據展示
可以方便地了解在爬取過程中,在哪一步出現了差錯,并自動跳過,而不會造成浪費接下來爬取信息的時間。
當我們想要獲取關注人信息時,在搜索每名用戶時,均要首先獲取其關注人頁數信息,不僅費時,而且也容易出現錯誤,此處,我們提出一種新的翻頁功能實現的方法,其本質就是通過構造Request并提交Scrapy引擎的過程。
關鍵步驟是當我們在獲取完第n頁信息完畢之后,首先抽取下一頁的鏈接,如果存在,便訪問下一頁,爬取信息,否則跳過。
運用Python3豐富的庫資源以及快速開發的特點,本文設計并實現了基于新浪微博數據上的社區網絡爬蟲程序,為研究社會中人物關系者們提供了較為簡單方便的新浪微博數據獲取程序。該程序使用者僅需提供新浪微博賬號即可利用爬蟲抓取新浪微博中的人物關聯信息,解決了傳統爬蟲登錄、翻頁等問題;實驗結果表明:該爬蟲具有良好的性能,穩定性強,可以投入到日常使用當中,并且有利于對微博的后續挖掘研究。
[參考文獻]
[1]楊文剛,韓海濤.大數據背景下基于主題網絡爬蟲的檔案信息采集[J].蘭臺世界,2015(20):20-21.
[2]鄭楷堅,沙瀛.面向主題的社交網絡采集技術[J].計算機系統應用,2016(10):173-179.
[3]郭濤,黃銘鈞.社區網絡爬蟲的設計與實現[J].智能計算機與應用,2012(4):65-67.
[4]劉艷平,俞海英,戎沁.Python模擬登錄網站并抓取網頁的方法[J].微型計算機應用,2015(1):58-60.
[5]魏春蓉,張宇霖.基于新浪微博的社交網絡用戶關系分析[J].中華文化論壇,2016(9):156-161.
[6]陳琳,任芳.基于Python的新浪微博數據爬蟲程序設計[J].技術應用,2016(9):97-99.
[7]羅剛.自己動手寫網絡爬蟲[M].北京:清華大學出版社,2016.
[8]馬俊哲.面向微博用戶行為數據挖掘的爬蟲系統設計與實現[D].武漢:華中科技大學,2016.
[9]范傳輝.Python爬蟲開發與項目實戰[M].北京:機械工業出版社,2017.
[10]陳利婷.大數據時代的反爬蟲技術[J].電腦與信息技術,2016(6):60-61.