鄧曉璐 姚松



摘? 要:為了快速獲取到新浪微博中的數據,在學習和分析當前爬蟲技術的原理、核心模塊和運行過程的基礎上,文章將探索實現一個基于Scrapy框架的網絡爬蟲工具,以完成數據捕獲等目標。該工具可根據一個或多個微博關鍵詞搜索相關微博信息,并將搜索結果寫入本地文件。實驗結果顯示:該爬蟲擁有較好的加速比,可以快速地獲取數據,并且這些數據具有一定的實時性和準確性。
關鍵詞:Scrapy;新浪微博;數據抓取
中圖分類號:TP391.3? 文獻標識碼:A? 文章編號:2096-4706(2023)03-0044-04
Research on MicroBlog Data Crawler Based on Scrapy
DENG Xiaolu, YAO Song
(Guangdong Polytechnic of Science and Technology, Zhuhai? 519090, China)
Abstract: In order to quickly obtain the data in MicroBlog, based on learning and analyzing the principle, core modules and operation process of current crawler technology, this paper will explore and implement cyber crawler tool based on the Scrapy framework to achieve data capture and other goals. This tool can search relevant MicroBlog information according to one or more MicroBlog keywords, and write the search results into local files. The experimental results show that the crawler has a better speedup ratio and can quickly obtain data, and the data have a certain degree of real-time and accuracy.
Keywords: Scrapy; MicroBlog; data capture
0? 引? 言
近年來,新興數據平臺的地位與日俱增,越來越多的人更加樂意通過網絡來關注當前社會的熱點話題。微博作為新興數據平臺之一,自其投入開放以來,逐漸被越來越多的人所使用,同時,微博話題也正以指數的趨勢不斷增長,這些話題涉及眾多維度。在信息爆炸的時代,微博主題的不同指標成為研究人員的重要研究數據,比如近幾年火爆的推薦系統等。因此,如何高質量且個性化的獲取微博數據對研究者和運營者具有非常重要的意義。
然而,新浪微博并未提供相應的數據接口供研究人員使用,目前國內有一些網站提供公開數據,但這些數據量非常有限,并且類似于推薦系統這類研究,對數據的實時性具有很高的要求。眾所周知,微博熱點話題隨著時間的推移、人們關注程度而不斷更新的,如以往的話題熱點可能成為現在的非熱點,從而使其推薦價值降低;同樣的,一條非熱點話題也可能變為現在的熱點話題。微博話題的這些特征也給微博話題推薦算法帶來了越來越多的挑戰,因此,如何提高抓取微博數據的實時性也有重要的研究價值。
本文所提供的爬蟲工具可以模擬客戶端操作,如用戶登錄、查看微博話題、查看評論等,通過設置某些條件,獲取某個時間段內一個或多個微博關鍵詞搜索結果,并將結果寫入本地文件且永久保存。所謂微博關鍵詞搜索即:搜索正文中包含指定關鍵詞的微博;本系統還可以指定搜索的時間范圍,能更好地匹配研究者的研究需求;此外,本系統還可以通過設置參數篩選各種要搜索的微博類型,如原創微博、熱門微博、關注人微博、媒體微博等。使用本爬蟲一方面可以節省研究人員的時間,讓他們專注于數據分析上,同時也更加能夠匹配研究人員的需求。
1? 網絡爬蟲現狀
網絡爬蟲是自動提取網頁數據的程序,近幾年關于網絡爬蟲的研究不計其數,謝蓉蓉[1]等人通過分析網絡爬蟲操作的基本流程,按照流程提取了大數據的關鍵特征,然后根據特征提取結果提出了基于網絡爬蟲的數據捕獲策略;李俊華[2]等人利用Python網絡爬蟲的相關知識對豆瓣電影評論進行了一次抓取,并使用可視化庫生成單詞云并對其進行分析。王鋒[3]等人針對當前影響爬蟲程序效率的許多關鍵因素,在研究爬蟲程序內部運行機制的基礎上,優化了爬蟲程序的架構并改進了相關算法。SU[4]等人首先分析了爬蟲的功能結構,然后提出了一個三層爬蟲模型。針對海量專題組織數據的空間信息和屬性信息缺失的問題,楊宇[5]等人提出了一種基于爬蟲框架的專題組織數據空間信息采集方法,以專題組織信息網站為信息源,以深度優先策略爬蟲為信息獲取方式。曾建榮[6]等人提出了一種面向多數據源的網絡爬蟲數據采集技術,解決了現有爬蟲技術不便于采集多源數據的問題。在研究新浪微博、人民日報、百度百科全書、百度貼吧、微信公眾號、東方財富吧六大媒體平臺上的數據采集爬蟲的基礎上,采用Servlet后臺調度技術,整合面向多數據源的網絡爬蟲,解決了不同媒體平臺的數據采集問題。張寧蒙[7]等人提出了一種結合LDA的卷積神經網絡主題爬蟲,將主題判斷模塊視為一個文本分類問題,并使用深度神經網絡來提高主題爬蟲的性能。在卷積層之后,對LDA提取的主題特征進行拼接,以彌補傳統卷積神經網絡中主題信息的不足。汪巋等人[8]提出融合LDA的卷積神經網絡主題爬蟲,將主題判斷模塊視為文本分類問題,利用深度神經網絡提升主題爬蟲的性能。李俊華[2]龍香妤[9]張勝敏[10]等人面對獲取有用信息的需求,在通用網絡爬蟲技術的基礎上,利用Python軟件對爬蟲數據采集器進行了深度優化。然而新浪微博一方面具有反爬蟲機制,一方面又具有較復雜的登錄機制,因此,普通爬蟲很難直接拿過來直接獲取微博數據,針對這種問題,本文開發出一款專門適用于新浪微博的爬蟲工具。
2? 模擬用戶登錄
由于登錄是新浪微博訪問數據的必要步驟,所以本爬蟲工具首先需要解決的問題就是如何登錄微博。通過分析微博平臺代碼可知,登錄微博時客戶端需要向服務器端發送請求,服務器端會在收到請求后生成并返回密鑰給客戶端,客戶端收到密鑰后結合著用戶的ID和密碼一并發給服務器端,微博服務器端驗證通過后則進入當前用戶的登錄狀態。登錄具體方式描述如下:
首先使用者需要設置cookie值。DEFAULT_REQUEST_HEADERS中的cookie是需要填的值,其獲取方式為:用Chrome打開https://weibo.com/。使用者模擬用戶登錄成功之后,按F12打開開發者工具,在開發者工具的Network->whitelist->Request Headers,找到"Cookie:"后的值,這就是要找的cookie值,將其復制即可,如圖1所示。
3? 設置爬蟲參數
使用者應按照自身需求設置搜索關鍵詞,本爬蟲支持搜索包含一個或多個關鍵詞、分別搜索包括多個關鍵詞、搜索某個微博話題等。使用者在設置關鍵詞時,可以直接通過代碼設置,也可以通過文本文檔設置后,將其傳到代碼中。具體示例如下:
首先,用戶需要修改setting.py文件夾中的KEYWORD_LIST參數,接著使用者根據不同需求進行以下設置:
如用戶需要搜索微博正文包含一個指定關鍵詞,如“聽_貓在裙角”:
KEYWORD_LIST = ['聽_貓在裙角'];
如用戶需要搜索微博正文包含多個關鍵詞,如想要分別獲得“聽_貓在裙角”和“璐璐”的搜索結果:
KEYWORD_LIST = ['聽_貓在裙角', '璐璐'];
如用戶需要搜索微博正文同時包含多個關鍵詞的微博,如同時包含“聽_貓在裙角”和“璐璐”微博的搜索結果:
KEYWORD_LIST = ['聽_貓在裙角 璐璐'];
如用戶需要搜索指定微博話題,即包含#的內容,如“#聽_貓在裙角#”:
EYWORD_LIST = ['#聽_貓在裙角#'];
本爬蟲支持設置是否進一步搜索的閾值,一般情況下,如果在某個搜索條件下,搜索結果通常會有很多,則搜索結果應該有50頁微博,多于50頁不顯示。當總頁數等于50時,程序認為搜索結果可能沒有顯示完全,所以會繼續細分。比如,若當前是按天搜索的,程序會把當前的1個搜索分成24個搜索,每個搜索的條件粒度是小時,這樣就能獲取在天粒度下無法完全獲取的微博。同理,如果小時粒度下總頁數仍然是50,系統則會繼續細分,以此類推。然而,有一些關鍵詞,搜索結果即便很多,也只顯示40多頁。所以此時如果閾值是50,程序會認為只有這么多微博,不再繼續細分,導致很多微博沒有獲取。因此為了獲取更多微博,閾值應該是小于50的數字。但是如果設置的特別小,如設置為1,這樣即便結果真的只有幾頁,程序也會細分,這些沒有必要的細分會使程序速度降低。因此,將程序的閾值設置為40~46之間。如使用者將搜索閾值設置為46,只需要設置代碼FURTHER_THRESHOLD = 46即可。
設置好搜索閾值后,使用者需要設置結果保存類型,第一個代表去重,第二個代表寫入csv文件,第三個代表下載圖片,第四個代表下載視頻。后面的數字代表執行的順序,數字越小優先級越高。若使用者只要寫入部分類型,可以把不需要的類型用“#”注釋掉,以節省資源。本系統還可以篩選要搜索的微博類型,0代表搜索全部微博,1代表搜索全部原創微博,2代表熱門微博,3代表關注人微博,4代表認證用戶微博,5代表媒體微博,6代表觀點微博。如使用者需要搜索全部原創微博,只需設置代碼WEIBO_TYPE = 1即可。
在爬蟲系統爬取數據的過程中,使用者需要設置等待時間,所謂等待時間,即訪問完一個頁面再訪問下一個時需要等待的時間,默認為10秒。系統支持篩選結果微博中必須包含的內容,0代表不篩選,獲取全部微博,1代表搜索包含圖片的微博,2代表包含視頻的微博,3代表包含音樂的微博,4代表包含短鏈接的微博。如,當使用者想需要爬蟲等待時間為15秒,且在搜索中包含圖片的微博,只需設置代碼DOWNLOAD_DELAY = 15;CONTAIN_TYPE = 1即可。
設置好搜索關鍵詞后,使用者可以設置搜索微博發布的時間范圍,即微博發布的起始日期和結束日期。本系統篩選微博的發布地區時,可以精確到省或直轄市,值不應包含“省”或“市”等字,如想篩選北京市的微博請用“北京”而不是“北京市”,想要篩選安徽省的微博請用“安徽”而不是“安徽省”,可以寫多個地區,注意本系統只支持省或直轄市的名字,不支持省下面的市名及直轄市下面的區縣名,不篩選則用“全部”。如,當使用者篩選微博發布日期為2020-06-01到2020-06-02之間且發布地區為“山東”的微博時,只需設置代碼START_DATE = '2022-05-01;END_DATE = '2022-05-02';REGION =['山東']即可。
其中,各個變量表示的含義如表1所示。
4? 實驗與分析
4.1? 并行效率分析
對本文爬蟲的并行效率進行分析,分別在不同CPU核數的計算機上抓取了以“校企合作”為關鍵詞的微博,其中運行設備的具體配置與型號如表2所示。
如圖2和表3所示,隨著CPU核數的增加,該爬蟲的加速比呈線性增長趨勢。
由圖2可得出結論:該爬蟲在CPU核數為2時并無顯著的加速效果,但隨著CPU核數的增加,加速比也呈現線性增加的趨勢,這表明該爬蟲在抓取大量數據時具有很好的加速效果。
4.2? 校企合作數據分析
在該實驗中,本文針對關鍵詞“校企合作”,獲取了在2012年1月至2022年1月這個時間段內的共2 904 270條微博,部分結果如圖3所示,并且將獲取微博所發布的時間記錄下并作圖分析。
如圖4所示,是“校企合作”相關微博的發布數量在2012年到2022年不同年份變化曲線,可以看出:有關于“校企合作”的話題數量在總體上呈現出指數增長的趨勢,由此可以看出,此爬蟲工具具有非常重要的應用價值,使用者完全可以根據其研究方向及需要進行數據的實時爬取,從而進行必要的研究分析。
5? 結? 論
本文以為社交網絡研究者們提供優質的研究數據為目標,設計了一款方便快捷的新浪微博數據獲取工具。經實驗驗證,該工具具有使用方便、支持關鍵字匹配、支持并行的特點,使用者只需提供微博賬號、設置好抓取的微博關鍵字,即可利用本工具進行數據抓取,并將抓取的數據永久性保留至本地文件內。很好地解決了目前國內社交軟件研究者們研究數據匱乏的問題,具有很大的使用價值。
參考文獻:
[1] 謝蓉蓉,徐慧,鄭帥位,等.基于網絡爬蟲的網頁大數據抓取方法仿真 [J].計算機仿真,2021,38(6):439-443.
[2] 李俊華.基于Python的網絡爬蟲研究 [J].現代信息科技,2019,3(20):26-27+30.
[3] 王鋒,王偉,張璟,等.基于Linux的網絡爬蟲系統 [J].計算機工程,2010,36(1):280-282.
[4] SU F,LIN Z W,MA Y. Modeling and Analysis of Internet Worm Propagation [J].The Journal of China Universities of Posts and Telecommunications,2010,17(4):63-68.
[5] 楊宇,孫亞琴,閆志剛.網絡爬蟲的專題機構數據空間信息采集方法 [J].測繪科學,2019,44(7):122-127+140.
[6] 曾健榮,張仰森,鄭佳,等.面向多數據源的網絡爬蟲實現技術及應用 [J].計算機科學,2019,46(5):304-309.
[7] 張寧蒙.基于Python的網絡爬蟲技術探析 [J].移動信息,2020(2):84-85.
[8] 汪巋,費晨杰,劉柏嵩.融合LDA的卷積神經網絡主題爬蟲研究 [J].計算機工程與應用,2019,55(11):123-128+178.
[9] 龍香妤.基于網絡爬蟲技術的數據抓取程序的設計 [J].技術與市場,2021,28(10):41-43.
[10] 張勝敏,王愛菊.基于Python的分布式多主題網絡爬蟲的研究與設計 [J].開封大學學報,2021,35(1):93-96.
作者簡介:鄧曉璐(1994.01—),女,漢族,江蘇徐州人,助教,碩士研究生,研究方向:推薦系統;姚松(1997.11—),男,漢族,廣東珠海人,助理研究員,碩士研究生,研究方向:數據挖掘。
收稿日期:2022-09-14
基金項目:廣東省教育廳科研項目-青年創新人才類項目(2020KQNCX157)