朱燁行 等
趙寶瑩? 張明杰? 魏笑笑? 衛(wèi)昆
摘? 要:為深入了解新浪微博用戶的有關(guān)情況,從中找出最有影響力的微博用戶,發(fā)現(xiàn)當(dāng)前新浪微博中的意見領(lǐng)袖,需要知道每位微博用戶迄今為止已發(fā)表的微博數(shù)、關(guān)注數(shù)和粉絲數(shù)等信息。為此使用Python語言設(shè)計實現(xiàn)了一個基于Scrapy框架的網(wǎng)絡(luò)爬蟲,該爬蟲根據(jù)輸入的微博用戶標(biāo)識號ID抓取該用戶目前已發(fā)表的微博數(shù)、關(guān)注數(shù)和粉絲數(shù)等信息。由于要連續(xù)多次訪問微博網(wǎng)站,為了不讓微博網(wǎng)站拒絕訪問,在設(shè)計的爬蟲中使用了用戶代理和IP代理,其中IP代理選用隧道代理這一動態(tài)類型。實驗結(jié)果表明下載七千多位微博用戶的信息用時6小時22分鐘。
關(guān)鍵詞:Scrapy;網(wǎng)絡(luò)爬蟲;微博;用戶代理;IP代理
中圖分類號:TP311.1? ? 文獻(xiàn)標(biāo)識碼:A? 文章編號:2096-4706(2023)24-0041-05
Design and Implementation of Weibo User Information Collection System
Based on Scrapy Framework
ZHU Yehang1, ZHAO Baoying2, ZHANG Mingjie3, WEI Xiaoxiao1, WEI Kun3
(1.School of Modern Post, Xi'an University of Posts and Telecommunications, Xi'an? 710121, China;
2.Information Technology Center, Luoyang Institute of Science and Technology, Luoyang? 471023, China;
3.College of Economics and Management, Xi'an University of Posts and Telecommunications, Xi'an? 710121, China)
Abstract: To gain a deeper understanding of Sina Weibo users' information, from which to identify the most influential Weibo users, discover opinion leaders on current Sina Weibo, it is necessary to know the number of Weibo posts, followers and fans of every Weibo user so far. To this end, a Web crawler based on the Scrapy framework is designed and implemented in Python language. The crawler captures the number of Weibo posts, followers, fans published by the user according to the Weibo user ID entered. We have to visit Weibo website for many times in succession, to prevent Weibo website from denying access, the User Agent and IP Proxy are used in the designed crawler. Among them, the IP proxy selects the dynamic type of tunnel proxy. The experimental results show that it takes 6 hours and 22 minutes to download the information of more than 7 000 Weibo users.
Keywords: Scrapy; Web crawler; Weibo; User Agent; IP Proxy
0? 引? 言
新浪微博又名“微博”,于2009年上線,是一個中國的社交媒體平臺,截至2023年5月,其月活躍用戶為5.86億,日活躍用戶為2.52億[1]。可通過個人計算機(jī)、手機(jī)等設(shè)備接入該平臺,通過文字、圖片、視頻等方式,實現(xiàn)信息互動傳播、即時分享。
本文所說的微博用戶信息指的是微博用戶當(dāng)前已發(fā)表的微博數(shù)、關(guān)注數(shù)和粉絲數(shù),這些數(shù)據(jù)對刻畫微博用戶很有幫助,可用于確定微博用戶影響力、找出意見領(lǐng)袖等方面[2]。
1? 相關(guān)技術(shù)及原理
1.1? 網(wǎng)絡(luò)爬蟲
網(wǎng)絡(luò)爬蟲是按規(guī)則自動抓取Web網(wǎng)上數(shù)據(jù)的程序。主要由控制器、解析器、資源庫等組成??刂破魃暾堃粋€線程調(diào)用爬蟲獲取網(wǎng)頁內(nèi)容。解析器下載網(wǎng)頁,過濾并分析其中的數(shù)據(jù)。資源庫存儲下載的數(shù)據(jù)[3]。
首先給出一組統(tǒng)一資源定位符(URL)值作為種子,網(wǎng)絡(luò)爬蟲依次訪問其中的每一個URL值,下載相應(yīng)網(wǎng)頁,找到在這些網(wǎng)頁中的URL鏈接地址并據(jù)此下載新的網(wǎng)頁,在新的網(wǎng)頁中找新的URL鏈接地址并下載對應(yīng)的網(wǎng)頁,這樣循環(huán)下去,直到相關(guān)網(wǎng)頁抓完為止[4]。
1.2? 網(wǎng)絡(luò)爬蟲框架Scrapy
框架就是半成品,集成很多功能、具有較強(qiáng)通用性的項目模板。Scrapy是用Python寫的一個Web抓取框架,其中的引擎、調(diào)度器不需要用戶編寫,而其中的Spiders、Item Pipeline需要用戶編寫。Scrapy是為網(wǎng)頁抓取而設(shè)計,也可用于通用的網(wǎng)絡(luò)爬蟲[3]。
2? 系統(tǒng)設(shè)計
2.1? 具體實現(xiàn)流程
2.1.1? 安裝Scrapy
在操作系統(tǒng)Windows 7下安裝Scrapy的方法是先安裝好Python,在命令行模式下使用pip命令即可安裝:pip install scrapy[4]。
2.1.2? 創(chuàng)建Scrapy工程
在命令行模式下進(jìn)入現(xiàn)有的任一目錄,如“>cd G:\gzhuyehang\scrapyProject”,運(yùn)行命令“>scrapy startproject zSinaUser”。即可創(chuàng)建Scrapy工程zSinaUser,并在當(dāng)前已存在目錄下新生成目錄zSinaUser,在它下面生成配置文件scrapy.cfg和另外一個名稱同為zSinaUser的目錄,在第二個zSinaUser目錄下生成一個目錄spiders和四個文件items.py、middlewares.py、pipelines.py、settings.py[5]。
2.1.3? 創(chuàng)建一個爬蟲文件
在命令行模式下進(jìn)入目錄“>cd G:\gzhuyehang\scrapyProject\zSinaUser”,運(yùn)行如下命令:
>scrapy genspider userInfoSpider weibo.cn。使用scrapy genspider命令在目錄spiders下創(chuàng)建一個名字為userInfoSpider.py的文件,這個文件搜索的域為weibo.cn,之所以選weibo.cn而不選weibo.com,是因為weibo.cn中頁面較簡單而且反爬蟲措施較弱[5]。
2.2? 有關(guān)文件分析
本文設(shè)計實現(xiàn)的Scrapy框架爬蟲最終文件目錄結(jié)構(gòu)如圖1所示。下面對其中各有關(guān)文件進(jìn)行分析。
2.2.1? 文件userInfoSpider.py
該文件用于從輸入文件中讀取用戶標(biāo)識號ID,并向微博網(wǎng)站發(fā)起請求,從網(wǎng)站返回內(nèi)容中提取相應(yīng)用戶已發(fā)表的微博數(shù)、關(guān)注數(shù)和粉絲數(shù),并把這些數(shù)據(jù)返回給Scrapy引擎[6]。
該文件包含一個類class UserinfospiderSpider(scrapy.Spider),其中包含有兩個函數(shù):start_requests和parse_user,分別介紹如下:
1)函數(shù)start_requests(self)。該函數(shù)從輸入文件z0420userid.txt中每次讀入一行內(nèi)容,這行內(nèi)容是一個微博用戶的標(biāo)識號ID,用該ID號形成該用戶的微博主頁地址,調(diào)用函數(shù)Request訪問該網(wǎng)頁。如此反復(fù)直到讀完該文件中所有行的內(nèi)容為止[7]。
2)函數(shù)parse_user(self, response)。其中的參數(shù)response是讀取某一位微博用戶主頁的返回內(nèi)容,從中提取出該微博用戶標(biāo)識號ID、微博數(shù)、關(guān)注數(shù)、粉絲數(shù)共四個屬性數(shù)據(jù),組成item項并返回給Scrapy引擎[7]。
2.2.2? 文件customUserAgent.py
這是用戶代理隨機(jī)挑選文件,在zmiddlewares目錄下,用于從文件resource.py中的列表UserAgents中隨機(jī)挑選一個瀏覽器的名稱,并把它設(shè)置為當(dāng)前缺省的用戶代理[8]。
2.2.3? 文件resource.py
該文件是用戶代理列表文件,在zmiddlewares目錄下,在其中定義列表UserAgents,該列表中存放的是30個不同的瀏覽器的名稱[9]。
2.2.4? 文件items.py
該文件定義要爬取的數(shù)據(jù)項。
2.2.5? 文件middlewares.py
該文件中的類class ProxyDownloaderMiddleware,用來設(shè)置隧道代理服務(wù)器的域名、端口號、用戶名、密碼等[10]。
2.2.6? 文件pipelines.py
該文件輸出文本文件“z0421test.txt”,每行的四個數(shù)分別表示用戶標(biāo)識號ID,該用戶已發(fā)表的微博數(shù)、關(guān)注數(shù)和粉絲數(shù)等。
2.2.7? 文件settings.py
該文件是配置文件,給出了一些參數(shù)的值。
1)DOWNLOAD_DELAY = 6,代表爬蟲訪問完一個頁面再訪問下一個頁面時需要等待的時間間隔。如果間隔時間太短,網(wǎng)站會發(fā)現(xiàn)是爬蟲在訪問網(wǎng)站,從而拒絕訪問。
2)COOKIES_ENABLED = False,設(shè)置為不用cookies。如果使能cookies,則微博網(wǎng)站會發(fā)現(xiàn)每次是同一個用戶在訪問該網(wǎng)站,從而拒絕訪問。
3)程序如何輸出。如下結(jié)構(gòu)中的內(nèi)容表明使用項目zSinaUser中文件pipelines.py中的類class ZsinauserPipeline來輸出:
ITEM_PIPELINES = {'zSinaUser.pipelines.ZsinauserPipeline': 300,}
4)ROBOTSTXT_OBEY = False:表示爬取內(nèi)容不符合robots協(xié)議時仍要爬取[11]。
2.2.8? 文件begin.py
調(diào)試運(yùn)行程序時文件begin.py應(yīng)用說明如下:
1)在Python的集成開發(fā)環(huán)境PyCharm中,為了避免每一次運(yùn)行或調(diào)試程序都輸入一串命令,可以在工程目錄“>cd G:\gzhuyehang\scrapyProject\zSinaUser”下創(chuàng)建一個文件,名字可為begin.py,也可命名為其他名字。在PyCharm的運(yùn)行選項配置中寫入該文件名字,這樣每次點(diǎn)擊運(yùn)行菜單命令時就會首先運(yùn)行該文件的腳本,從而啟動該爬蟲工作,下載網(wǎng)站上的相關(guān)數(shù)據(jù)[12]。該文件內(nèi)容如下:
from scrapy import cmdline
cmdline.execute('scrapy crawl userInfoSpider'.split())
其中“userInfoSpider”為本文2.1.3節(jié)中給出的名字,是該爬蟲的名字。
2)若想在命令行模式下調(diào)試運(yùn)行程序,就不需要文件begin.py,可直接進(jìn)入命令行模式,運(yùn)行命令:>scrapy crawl userInfoSpider。
2.2.9? 文件scrapy.cfg
該文件是整個Scrapy項目的配置文件,其內(nèi)容如下:
[settings]
default = zSinaUser.settings
[deploy]
#url = http://localhost:6800/
project = zSinaUser
該文件聲明了兩件事,一是定義默認(rèn)設(shè)置文件的位置為zSinaUser目錄下的settings.py文件,二是定義項目名稱為zSinaUser。
2.3? 獲取cookie步驟
步驟如下:
1)用谷歌瀏覽器Chrome打開網(wǎng)址https://www.weibo.com/。
2)點(diǎn)擊“立即登錄”,完成手機(jī)驗證碼驗證,進(jìn)入微博平臺里面。
3)按鍵盤功能鍵F12打開開發(fā)者工具(或鼠標(biāo)右擊網(wǎng)頁空白處,在彈出菜單中點(diǎn)擊條目“檢查”),在Network標(biāo)簽下選擇Fetch/XHR,在頁面左側(cè)的Name框中點(diǎn)擊某一行,再在頁面右側(cè)的標(biāo)簽Headers下的Request Headers下,找到“Cookie: ”后的值,把它復(fù)制拷貝到文件settings.py中結(jié)構(gòu)DEFAULT_REQUEST_HEADERS的關(guān)鍵詞“cookie”后,如下所示[13]:
DEFAULT_REQUEST_HEADERS = {? ?'Accept-Language': 'en',
'cookie':'SINAGLOBAL=3374182609874.5854. ……Num%22%3A42%2C%22msgbox%22%3A0%7D'}
2.4? 用戶代理
若總是用同一個瀏覽器訪問微博網(wǎng)站,網(wǎng)站就會發(fā)覺是爬蟲在訪問它從而拒絕訪問。為了不讓微博網(wǎng)站發(fā)現(xiàn)是程序在訪問,在下載微博期間可不斷變換瀏覽器名稱,具體做法是每次從瀏覽器名稱列表中隨機(jī)挑選出一個瀏覽器名稱來訪問微博網(wǎng)站,這樣瀏覽器名稱在不斷變化,微博網(wǎng)站就會認(rèn)為是不同的用戶在訪問它,從而不會拒絕訪問。在文件settings.py中的結(jié)構(gòu)DOWNLOADER_MIDDLEWARES中,如下顯示的前一行表示使用我們自己提供的可不斷變換挑選的用戶代理,后一行表示禁用框架Scrapy中原有的用戶代理[14]。
DOWNLOADER_MIDDLEWARES = {? ? ……
'zSinaUser.zmiddlewares.customUserAgent.RandomUserAgent':30,
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,? ?}
其中前一行表示啟用目錄zSinaUser下的目錄zmiddlewares下的文件customUserAgent.py中的類class RandomUserAgent來設(shè)置本次請求訪問Request所使用的用戶代理的值,具體實現(xiàn)的語句如下:
ua = random.choice(UserAgents)
request.headers.setdefault('User-Agent',ua)
前一句表示從文件resource.py中的列表UserAgents中隨機(jī)挑選一個瀏覽器的名稱,后一句表示把挑選出的瀏覽器的名稱設(shè)置為當(dāng)前請求Request的用戶代理[8]。
文件resource.py中用戶代理列表UserAgents的內(nèi)容是30個不同的瀏覽器的名稱,內(nèi)容如下所示:
UserAgents = [? ? "Mozilla/5.0 (Linux; U; Android 1.5; en-us; sdk Build/CUPCAKE) AppleWebkit/528.5? (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.
20.1",? ? ……….]
2.5? IP代理
若長時間總是用同一個IP地址訪問微博網(wǎng)站,那微博網(wǎng)站就會發(fā)現(xiàn)是爬蟲在訪問它,從而拒絕訪問。為此我們從快代理公司購買了隧道代理服務(wù)功能,可在訪問網(wǎng)站的過程中每隔一定時間變換IP值,比如每隔一分鐘變換一次IP值,而且這些IP值是從上萬個不同的IP值中選出,從而基本上不重復(fù),這就讓微博網(wǎng)站難以發(fā)現(xiàn)是爬蟲程序在下載數(shù)據(jù)[15]。
為此我們在文件settings.py中的結(jié)構(gòu)DOWNLOADER_MIDDLEWARES中,設(shè)置了一項,如下所示:
DOWNLOADER_MIDDLEWARES = {…… 'zSinaUser.middlewares.ProxyDownloaderMiddleware': 100,}
即調(diào)用目錄zSinaUser下的文件middlewares.py中的類class ProxyDownloaderMiddleware,設(shè)置隧道代理服務(wù)器域名、端口號、用戶名、密碼等。
3? 實驗方案
3.1? 實驗過程
本節(jié)說明如何通過Scrapy框架網(wǎng)絡(luò)爬蟲批量抓取微博用戶信息。
3.1.1? 輸入
要爬取的微博用戶的ID標(biāo)識號,集中放在一個文本文件“z0420userid.txt”中,其前5行和最后5行內(nèi)容如圖2所示,共有7 754行數(shù)據(jù),按ID標(biāo)識號順序從小到大排列。
3.1.2? 輸出
輸出文件“z0421test.txt”前5行和最后5行的截圖如圖3所示,按微博用戶ID標(biāo)識號升序排列,每行的四個數(shù)分別表示該行對應(yīng)的微博用戶的標(biāo)識號ID,已發(fā)表的微博數(shù)、關(guān)注數(shù)和粉絲數(shù),要注意的是用戶粉絲數(shù)中的值有的單位是“個”,而有的單位是“萬”,還有的單位是“億”。
3.2? 實驗結(jié)果分析
3.2.1? 輸入與輸出分析
輸入是7 754行,而輸出是7 639行,輸出比輸入的行數(shù)少了115行。這是由于有些微博用戶在輸出前已經(jīng)被新浪微博網(wǎng)站刪除,從而不存在了;還有些是由于網(wǎng)絡(luò)不穩(wěn)定,導(dǎo)致在規(guī)定的時間內(nèi)沒有下載到相關(guān)的數(shù)據(jù),從而造成缺失。為此,找出缺失的這115行微博用戶的ID標(biāo)識號,把它們重新輸入該網(wǎng)絡(luò)爬蟲,運(yùn)行結(jié)果得到其中107個微博用戶的標(biāo)識號ID、微博數(shù)、關(guān)注數(shù)和粉絲數(shù)信息,仍未下載到數(shù)據(jù)的另外8個微博用戶,經(jīng)人工上網(wǎng)查找,發(fā)現(xiàn)它們已經(jīng)被新浪微博網(wǎng)站刪除,已不存在了。
3.2.2? 處理時間分析
下載輸入文件“z0420userid.txt”中的七千多名微博用戶的信息耗時6小時22分鐘,這是在Scrapy框架爬蟲的配置文件即本文2.2.7節(jié)文件settings.py中的參數(shù)DOWNLOAD_DELAY = 6時得到的結(jié)果,該參數(shù)用于人為設(shè)置接連兩次訪問微博網(wǎng)站的時間間隔。如果該參數(shù)值設(shè)置為更小的值比如“3”,則會更快地下載完這七千多名微博用戶的信息,但風(fēng)險是有可能被新浪微博網(wǎng)站識別出是爬蟲在訪問它,從而被拒絕訪問,更嚴(yán)重的后果是被封號,那樣得不償失,反倒要花更多的時間、更慢了。所以這個參數(shù)的值應(yīng)該權(quán)衡利弊慎重選擇。
4? 結(jié)? 論
本文用Python語言設(shè)計并實現(xiàn)了一個基于Scrapy框架的網(wǎng)絡(luò)爬蟲,能夠根據(jù)輸入的用戶標(biāo)識號ID從新浪微博網(wǎng)站下載到該用戶目前已發(fā)表的微博數(shù)、關(guān)注數(shù)和粉絲數(shù)等信息。下載七千多微博用戶信息需要6小時22分鐘,影響下載時長的一個重要參數(shù)是接連兩次訪問新浪微博網(wǎng)站的時間間隔,如果該參數(shù)值設(shè)置太小,微博網(wǎng)站會識別出是爬蟲在訪問它,從而會拒絕訪問,甚至封號,確定該間隔值的最佳值是今后要進(jìn)一步研究的問題。
參考文獻(xiàn):
[1] 孫握瑜.基于Python的新浪微博爬蟲程序設(shè)計與實現(xiàn) [J].科技資訊,2022,20(12):34-37.
[2] 史媛.基于Scrapy框架爬取豆瓣圖書的設(shè)計與實現(xiàn) [J].山西電子技術(shù),2022(4):75-77+86.
[3] 王嘉寶,雒偉群.基于Scrapy框架的電影數(shù)據(jù)爬取和可視化分析 [J].西藏科技,2022(2):64-68.
[4] 邢婭凱.基于Scrapy框架爬蟲和數(shù)據(jù)挖掘的當(dāng)當(dāng)網(wǎng)頁信息分析 [D].長沙:湘潭大學(xué),2020.
[5] 孫瑜.基于Scrapy框架的網(wǎng)絡(luò)爬蟲系統(tǒng)的設(shè)計與實現(xiàn) [D].北京:北京交通大學(xué),2019.
[6] 何波.基于Python的新浪微博中爬蟲程序維護(hù)方法 [J].軟件,2022,43(2):52-54.
[7] 汪兵.基于Scrapy框架的分布式爬蟲系統(tǒng)設(shè)計與實現(xiàn) [D].合肥:合肥工業(yè)大學(xué),2019.
[8] 魏海昱,林偉鴻,賀超波.基于Scrapy的食品安全輿情數(shù)據(jù)爬取與分析 [J].現(xiàn)代計算機(jī),2022,28(14):49-54+95.
[9] 樊宇豪.基于Scrapy的分布式網(wǎng)絡(luò)爬蟲系統(tǒng)設(shè)計與實現(xiàn) [D].成都:電子科技大學(xué),2018.
[10] 楊君.基于Scrapy技術(shù)的數(shù)據(jù)采集系統(tǒng)的設(shè)計與實現(xiàn) [D].南京:南京郵電大學(xué),2018.
[11] 董少林,李鐘慎.采用Scrapy分布式爬蟲技術(shù)的微博熱點(diǎn)輿情信息獲取與分析 [J].電腦與信息技術(shù),2020,28(5):23-26.
[12] 謝鋼.基于Scrapy的信息采集與分析 [J].現(xiàn)代信息科技,2020,4(14):96-98.
[13] 周毅,李威,何金,等.基于Scrapy框架的分布式網(wǎng)絡(luò)爬蟲系統(tǒng)設(shè)計與實現(xiàn) [J].現(xiàn)代信息科技,2021,5(19):43-46.
[14] 鄒維,李廷元.基于Scrapy爬蟲框架的領(lǐng)域網(wǎng)站文件爬取 [J].現(xiàn)代信息科技,2020,4(21):6-9.
[15] 閻澤群.基于網(wǎng)絡(luò)爬蟲技術(shù)的大數(shù)據(jù)采集系統(tǒng)設(shè)計 [J].現(xiàn)代信息科技,2021,5(12):83-86.
作者簡介:朱燁行(1969—),男,漢族,陜西渭南人,副教授,博士,研究方向:數(shù)據(jù)挖掘;通訊作者:趙寶瑩(1985—),女,漢族,河南洛陽人,講師,碩士,研究方向:教育技術(shù);張明杰(1977—),男,漢族,陜西銅川人,副教授,博士,研究方向:互聯(lián)網(wǎng)輿情分析;魏笑笑(1979—),女,漢族,湖南益陽人,副教授,碩士,研究方向:信息資源管理;衛(wèi)昆(1976—),男,漢族,江蘇昆山人,講師,博士,研究方向:數(shù)據(jù)挖掘。
收稿日期:2023-04-19
基金項目:陜西省社會科學(xué)基金項目(2020R048);陜西省科技計劃項目(2021GY-180);陜西省科技廳項目(2021JM-467);陜西省教育廳科研計劃項目(20JZ086)