杜曉旭 賈小云
摘 ?要: 在大數據時代下,新浪微博的出現為人們獲取和參與信息數據及其傳播提供了全新的途徑。而面對新浪微博不斷增加的信息數據,人們對于提高微博獲取的精確性和時效性也提出了更高的要求。在這一背景下,本文將重點圍繞基于Python的新浪微博爬蟲進行簡要分析研究,在對Python與網絡爬蟲的基本概念進行明確的基礎上,嘗試設計一種Python的新浪微博爬蟲程序,為相關研究人員提供相應理論參考。
關鍵詞: Python;新浪微博;網絡爬蟲;程序設計
中圖分類號: TP311.1 ? ?文獻標識碼: A ? ?DOI:10.3969/j.issn.1003-6970.2019.04.039
本文著錄格式:杜曉旭,賈小云. 基于Python的新浪微博爬蟲分析[J]. 軟件,2019,40(4):182185
【Abstract】: During big data era, emergence of Sina Weibo provides new way for people to access and participate ?in information data and its dissemination. With increasing information and data of Sina Weibo, people put forward higher requirements for improving accuracy and timeliness of microblog acquisition. Under the backgroud, the paper analyzes and researches Python-based Sina Weibo crawler briefly, defines basic concepts of Python and Internet crawler, and attempts to design a Python Weibo crawler program, to provide related theoretical reference for researchers.
【Key words】: Python; Sina Weibo; Web crawler; Programming
0 ?引言
雖然目前以新浪微博為代表的眾多社會媒體均為研發人員提供了部分數據訪問編程接口,使其能夠準確獲取相關信息數據。但實際在使用此類數據訪問編程接口時經常容易受到諸多限制,如抓取頻率等且難以精準搜索微博內容等。而本文通過探究基于Python的新浪微博爬蟲設計,可以有效為精準獲取微博數據提供全新的方法路徑。對提高程序開發人員的工作效率和數據分析成效均具有積極的幫助作用。
1 ?網絡爬蟲與Python的基本概念
1.1 ?網絡爬蟲
網絡爬蟲指的就是一種根據既定規則對Web網頁中應用程序或腳本進行自動提取的技術。在當前的搜索引擎中對數據系統進行抓取時,網絡爬蟲作為其中至關重要的組成部分之一,負責幫助搜索引擎快速從互聯網上完成所需Web頁面的下載操作,從而將互聯網中的Web網頁下載至本地用以有效備份。爬蟲在從某一個或多個初始頁面URL中對頁面源文件進行分析,準確抓取新Web鏈接,并以此為基礎尋找新Web鏈接直至完成全部頁面的準確抓取和分析[1-2]。
1.2 ?Python
Python從本質上來說屬于一種開源編程語言,其具有功能強大、語法簡便、適用性良好等優勢特性。Python語言具有較高的效率且完全面向對象,可以快速完成面向對象編程,加之其語法簡潔并支持動態輸入,因此目前在許多操作系統平臺中均選擇使用Python語言作為腳本語言,用于在短時間內開發相應應用程序。Python語言提供了針對網絡協議標準庫,抽象封裝網絡協議中的每一個層次,使得程序員能夠節省大量的時間與精力進行程序邏輯處理。另外Python語言在對多種模式的字節流處理方面也具有一定的優勢性,開發速度較快,因而也使其被廣泛運用在各種編程、應用程序開發中。
2 ?Python下的新浪微博爬蟲程序設計
2.1 ?設計構想
在對新浪微博進行爬取的過程中,可以選擇使用純爬蟲或是運用新浪提供的部分數據訪問編程接口即Open API接口。值得注意的是,雖然新浪微博提供的數據訪問編程接口本身便是為開發者程序開發所設計,但其存在諸多限制。例如只有得到新浪授權的開發者才能使用這一接口,一旦授權過期開發者便無法繼續使用該接口,此外Open API接口在訪問頻次等方面同樣存在一定的局限性。因此綜合考慮,在設計基于Python的新浪微博爬蟲程序時,本文選擇使用純爬蟲的方式,重點爬取移動端的新浪微博內容。
2.2 ?程序模塊
本文所設計的基于Python新浪微博爬蟲程序采用模塊化的設計理念,該程序總共分為三大模塊。首先需要在完成新浪微博注冊的基礎上,根據注冊中使用的賬戶名與密碼登錄進入移動端的新浪微博,對其網站源碼進行準確分析,獲取這一新浪微博賬戶的Cookie[3-4]。此后需要通過借助Request URL獲取登錄頁面html代碼,并使用Python語言中自帶的lxml庫對該代碼進行相應分析,從而準確爬取新浪微博用戶的user_ID。隨后根據關鍵字對與其條件相符的微博進行自動篩選,篩選出的微博則需要統一保存至本地。最后對爬取的數據展開數據分析實驗,驗證該爬蟲程序的有效性即可。
2.3 ?程序設計
2.3.1 ?獲取賬號Cookie
在該基于Python新浪微博爬蟲程序中,第一步需要獲取新浪微博賬戶的Cookie并獲取對應的登錄頁面代碼。在程序設計中Cookie專門指的是一小段文本信息,服務器在接收到新浪微博用戶客戶端發送的請求之后,將會對這一新浪微博用戶客戶端的實際狀態進行準確記錄,并按照既定規則對微博賬號進行加密處理。隨后將加密后的微博賬號及時存儲在Cookie當中。此時客戶端瀏覽器將會從res?ponse處獲得其頒發的一個Cookie,該Cookie在及時被客戶端瀏覽器存儲后,新浪網站在接收得到瀏覽器發送的請求時,瀏覽器將會連同Cookie與發送的請求網址一并提交至服務器。由服務器負責對Cookie進行檢查,從而對客戶端的實際狀態進行準確辨別。具體來說,首先需要使用chrome瀏覽器將新浪微博移動端打開,同時將開發者工具調出。隨后打開瀏覽器并選中其中的Preserve log選項,依次將賬號與密碼鍵入其中,即可順利登陸移動版新浪微博客戶端。此時需要找到m.weibo.cnHeaders Cookie以及headers,統一資源定位符URL主要是通過一種一種相對比較簡便的方式,對可從互聯網中直接獲取的資源位置以及資源訪問方法進行有效表示,簡單來說URL即為互聯網中的網頁地址。在互聯網上任意一個文件有且只有一個URL與之相對應,URL主要通過按照既定順序排列各種數字與字母從而有效確定某一地址,根據URL中包含的具體信息,瀏覽器將會選擇相應的處理方式。例如當爬取的URL為‘http://weibo.cn/user_id時,與之相對應的爬取用戶即為user_id=“renminwang”[5-6]。
2.3.2 ?網頁分析
Python語言中帶有若干HTTP客戶端庫,其中不僅包含Python語言自帶的Urllib與Urllib2庫之外,還帶有requests這一第三方庫。requests庫具有功能強大、操作簡便等優勢特點,可為URL操作提供眾多所需函數。在使用requests庫的過程中,開發者可以如同對本地文件進行直接讀取一般對互聯網中的數據、ftp中的數據進行直接讀取。通過運用requests庫,開發者能夠在短時間內迅速抓取URL內容,即通過向指定頁面發送一個GET請求。由于requests庫本身帶有解析Json格式的功能,最后將無需進行格式轉換的Json格式的數據返回即可。值得注意的是,此時所返回的數據為頁面二進制數據,在requests庫完成新浪微博頁面源代碼的有效獲取后,將直接利用Python語言中自帶的lxml庫,利用該庫中的etree.HTML對網頁源代碼進行相應處理,由此自動生成一個可使用lxml庫中自帶的xpath方法完成解析處理的對象[7]。其中,xpath方法在對被選擇對象進行處理時,采用的方法類似目錄樹,在HTML文檔的路徑中直接對源代碼結構進行準確描述,并使用“/”將上層級路徑和下層級路徑相互分隔。對某一HTML標簽進行定位后便可以對相類似文件中的相對路徑進行有效運用。例如存儲在HTML標簽元素組class當中的微博文本wbContent中,class的屬性是“ctt”。但同樣存儲在該元素組中的微博發布時間WbDate中,class的屬性則是“ct”。而存儲在HTML標簽元素組name當中的微博總頁數pageNum中,class的屬性是“mp”,在其多維字典當中value為鍵,其值便是微博總頁數即pageNum。對微博文本與微博發布時間進行獲取的函數getWB(),依次會將含有微博發布時間的列表list以及含有微博文本的列表list進行返回。由于在獲取用戶發表微博中,使用瀏覽器對用戶所發表的微博內容進行瀏覽時,頁面并不會一次性顯示出所有微博,而是需要用戶滾動至頁面底部之后,頁面才會自動加載出其他微博信息,如此滾動加載操作至少兩次才能在一頁中顯示出所有微博內容。故而此時獲取的網頁源代碼也缺乏一定的完整性,需要配合使用手動滾動的方式或是使用發送HTTP請求的GET方式,建立相應的URL對滾動加載過程進行有效模擬,以便保障獲取的網頁源代碼具有良好的完整性[8]。
2.3.3 ?匹配關鍵詞
根據最新的數據顯示,截至2018年上半年,微博月活躍用戶數已經達到了4.3億人次,且這一數值仍在不斷增長。可見越來越多的網民開始選擇使用微博獲取信息并進行信息的分享與交互。微博文本內容也成為一大海量信息源,但任何一個用戶的微博中必定存在意義較小甚至無意義的內容,但只簡單使用純爬蟲其無法對微博內容有用與否進行有效區分。因此在簡單使用純爬蟲的過程中,其往往會將所有微博全部存儲至本地磁盤中,從而導致大量無意義微博內容占據過多存儲空間,并大大降低從微博數據中準確篩選所需微博內容的效率。因此本文在設計基于Python的新浪微博爬蟲程序時,選擇在爬蟲中增設帶有關鍵字匹配模塊,使得爬蟲在讀取微博內容時可以直接利用關鍵字,如果微博文本與關鍵字相匹配,滿足關鍵字條件則爬蟲會將其歸至有用微博范疇中并直接將其下載、存儲到本地文件中[9]。在關鍵詞提取中,首先需要將微博預處理文檔打開并對其中一行字符串進行有效讀取,賦給變量text,此時字符串即文檔數量表示為text_ num。在text不為空的情況下,對其進行拆分,此時將該文檔記錄成text_name,并為其創建相應的列表,命名為text_list1。對拆分后的詞語進行存儲后將該文檔總詞數記錄為text_name_num。隨后對其他字符串進行讀取,此時對于拆分的詞語word需要對text_name文檔中是否存在word詞語進行準確判斷。如果存在則需要對word在其他文檔里出現與否進行判斷,如果不存在則可以直接將該詞添加至字典word_all中,同時賦鍵值為一。否則需要將該關鍵字鍵值加一。但假如字典word_all中不存在與text_name變量相對應的文檔名的元素,需要重新建立一個新文件名,作為text_name變量指向的文檔名,并賦鍵值為一空字典word_all2。在該空字典中重新建立一個列表,對當前關鍵字及其數量、文檔詞數總量進行準確記錄。重復上述步驟直至在word_all中出現了含有各關鍵字的文檔總篇數,求出TF-IDF值即可確定關鍵字[10]。
2.4 ?數據分析
本文以利用基于Python的新浪微博爬蟲程序對關于“十九大”的微博數據進行抓取,通過對相關微博及微博發布時間進行分析。可知央視新聞在2017年10月1日到10月25日期間,在新浪微博央視新聞客戶端中總共發布了300余條微博,在搜索欄中鍵入“十九大”這一關鍵字并進行匹配分析后,可知在新浪微博央視新聞客戶端中共有266條與該關鍵字相匹配的微博。而在整個2017年新浪微博用戶對十九大的關注度均相對較高,這也意味著當年十九大是人們較為關注的一大熱點話題。隨著2017年10月24日十九大正式閉幕以后,人們對于十九大的關注熱度也在不斷降低。但在我國持續貫徹落實十九大精神,要求各行各業以及黨員干部抓緊學習十九大精神,嚴格按照十九大要求開展各項工作的過程中,人們對十九大依舊保持一定關注度,但并未達到十九大召開期間的關注度高峰。
3 ?結論
通過本文的分析研究,可知Python語言具有語法簡便、功能強大等優勢特征,運用在新浪微博爬蟲程序設計中具有較高的可行性。通過采用純爬蟲的方式搭配使用Python語言,使得用戶只需利用新浪微博賬號,便可運用爬蟲對相關微博數據與信息內容進行準確抓取。同時在設計過程中增加關鍵詞匹配模塊,可以令爬蟲更加精準搜索與關鍵詞相匹配的微博內容并直接下載保存至本地文件中,便于程序開發者及其他用戶對微博的深入挖掘。因此本文所設計的Python下的新浪微博爬蟲程序具有較高的實用性和有效性。
參考文獻
[1] 王金峰, 彭禹, 王明, 等. 基于網絡爬蟲的新浪微博數據抓取技術[J]. 中小企業管理與科技(上旬刊), 2019(01): 162-163.
[2] 王英杰. 基于Python的微博數據爬蟲程序設計研究[J]. 信息與電腦(理論版), 2018(23): 93-94.
[3] 杜翔, 蔡燕, 蘭小機. 基于Python的新浪微博位置數據獲取方法研究[J]. 江西理工大學學報, 2018, 39(05): 90-96.
[4] 陳政伊, 袁云靜, 賀月錦, 等. 基于Python的微博爬蟲系統研究[J]. 大眾科技, 2017, 19(08): 8-11.
[5] 王芳, 肖皇培. 以爬蟲為興趣牽引的Python教學方案探索與實踐[J]. 軟件, 2018, 39(12): 28-31.
[6] 張小璞, 左小清. 在ArcGIS下基于Python的路網數據批處理方法[J]. 軟件, 2018, 39(07): 130-133.
[7] 劉清. 網絡爬蟲針對“反爬”網站的爬取策略分析[J]. 信息與電腦(理論版), 2019(03): 23-24.
[8] Justyna Rybak, Wioletta Rogula-Koz?owska, Izabela Jure-czko, Rados?aw Rutkowski. Monitoring of indoor polycyclic aromatic hydrocarbons using spider webs[J]. Chemosphere, 2019, 218.
[9] 蘇國新, 蘇聿. 基于Python的可配置網絡爬蟲[J]. 寧德師范學院學報(自然科學版), 2018, 30(04): 364-368.
[10] 邵曉文. 多線程并發網絡爬蟲的設計與實現[J]. 現代計算機(專業版), 2019(01): 97-100.