(重慶交通大學(xué) 重慶 400074)
信息技術(shù)的進(jìn)步和人工智能的到來使人們的生活方式逐漸發(fā)生改變,社交網(wǎng)絡(luò)的高速發(fā)展和形式變遷就是一個(gè)非常突出的例子。在大數(shù)據(jù)時(shí)代,社交網(wǎng)絡(luò)產(chǎn)生的數(shù)據(jù)就像一個(gè)巨大的寶庫,這吸引了大量的研究人員參與到相關(guān)內(nèi)容的研究。在國外,人們針對Twitter、Facebook等知名社交平臺(tái)展開了一系列的分析。但是針對國內(nèi)社交網(wǎng)絡(luò)平臺(tái)的研究還比較欠缺。主要是缺乏相關(guān)的研究數(shù)據(jù),使得一些研究難以開展。在國外Twitter等社交平臺(tái)會(huì)提供一些數(shù)據(jù)接口供研究人員獲取研究數(shù)據(jù),但是在國內(nèi)卻無法正常訪問這些接口。如此之大的一個(gè)社交平臺(tái)為社交網(wǎng)絡(luò)分析、網(wǎng)絡(luò)數(shù)據(jù)挖掘等研究提供了強(qiáng)有力的大數(shù)據(jù)支持。
目前微信公眾號(hào)注冊量巨大,然而微信公眾平臺(tái)并沒有提供相關(guān)的數(shù)據(jù)接口,沒有數(shù)據(jù),一些研究分析工作也無法進(jìn)行。目前網(wǎng)絡(luò)中也存在一些公開的微信公眾號(hào)數(shù)據(jù)供人們下載,但是這些數(shù)據(jù)集通常規(guī)模比較小,而些技術(shù)力量強(qiáng)勁、資源充足的研究團(tuán)隊(duì)通常自己開發(fā)一些爬蟲來獲取研究數(shù)據(jù)。這對不熟悉爬蟲技術(shù)的且還缺乏實(shí)時(shí)性。有研究人員而言是個(gè)極大的挑戰(zhàn)。本文提出了一款基于Python語言的微信公眾號(hào)數(shù)據(jù)爬蟲,為數(shù)據(jù)獲取提供支持。
本文爬蟲通過模擬客戶端的操作如登錄、訪問關(guān)注量、查看歷史消息、查看消息內(nèi)容等方式獲取相關(guān)數(shù)據(jù),并且將這些數(shù)據(jù)持久化保存到本地硬盤上,方便后續(xù)進(jìn)一步的數(shù)據(jù)挖掘與分析。使用本文爬蟲能夠節(jié)省分析人員的開發(fā)時(shí)間,使得他們可以將更多的精力放在數(shù)據(jù)分析上面,同時(shí)也可以對一些無用的數(shù)據(jù)起到過濾作用。
想要爬取某些網(wǎng)站的數(shù)據(jù)需要一些手段才能實(shí)現(xiàn),因?yàn)椴⒎撬腥硕枷M约旱某晒粍e人輕易地復(fù)制據(jù)為己有,但是在不違反道德和法律的基礎(chǔ)上,僅用于個(gè)人能力提升和學(xué)術(shù)上的研究以及在不影響他人利益的情況下自己獲利進(jìn)行網(wǎng)頁數(shù)據(jù)爬取是很有必要的。
首先找到目標(biāo)數(shù)據(jù)網(wǎng)頁并發(fā)送請求,獲取響應(yīng)內(nèi)容,分析目標(biāo)數(shù)據(jù)所對應(yīng)的URL(統(tǒng)一資源定位符),找到目標(biāo)數(shù)據(jù)在網(wǎng)頁源代碼中的位置,然后用正則表達(dá)式鎖定要選取的內(nèi)容下載數(shù)據(jù)存到本地,清洗數(shù)據(jù),最后保存數(shù)據(jù)。
(一)發(fā)送HTTP請求
進(jìn)行網(wǎng)頁數(shù)據(jù)爬取的第一步是得到該網(wǎng)頁的URL,有了URL之后用Python向服務(wù)端發(fā)送HTTP請求。
一般的網(wǎng)頁信息的爬取請求方式是get,如果需要填寫表單才能進(jìn)一步獲取資源請求方式是post。在專業(yè)領(lǐng)域中還有更多請求方式,一般有四種基本請求方式,即get,post,put,delete,本文主要涉及get請求和post請求。一般的網(wǎng)站專業(yè)人士認(rèn)為get請求和post請求的本質(zhì)的區(qū)別在于,get請求主要用于獲取、查詢資源信息,post請求主要用于更新(修改)資源信息。
(二)HTTP請求響應(yīng)
當(dāng)用戶向服務(wù)端發(fā)送了請求之后,服務(wù)端會(huì)根據(jù)HTTP協(xié)議中的定義解析出請求的東西然后發(fā)送給用戶。每一次響應(yīng)都會(huì)有一個(gè)相對應(yīng)響應(yīng)狀態(tài),響應(yīng)成功對應(yīng)的響應(yīng)碼是200,其他的一般都是響應(yīng)錯(cuò)誤。
(三)正則表達(dá)式
正則表達(dá)式,又稱規(guī)則表達(dá)式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式通常被用來檢索、替換那些符合某個(gè)模式(規(guī)則)的文本。
許多程序設(shè)計(jì)語言都支持利用正則表達(dá)式進(jìn)行字符串操作。例如,在Perl中就內(nèi)建了一個(gè)功能強(qiáng)大的正則表達(dá)式引擎。正則表達(dá)式這個(gè)概念最初是由Unix中的工具軟件(例如sed和grep)普及開的。正則表達(dá)式通??s寫成“regex”,單數(shù)有regexp、regex,復(fù)數(shù)有regexps、regexes、regexen。
正則表達(dá)式能從一大堆信息中提取本文想要的信息。構(gòu)造正則表達(dá)式是得到網(wǎng)頁源代碼之后非常重要的一步,構(gòu)造正則表達(dá)式需要觀察網(wǎng)頁源代碼的特征,正則表達(dá)式中的字符表達(dá)基本上有下面這些:
(一)主要模塊
1.re模塊
re模塊就是正則表達(dá)式對應(yīng)的模塊,可以直接選取本文需要的資源,這里主要用了re模塊下的re.compile(A).findall(B)函數(shù),參數(shù)A是本文按照自己需求構(gòu)造的正則表達(dá)式用來提取有用的資源,參數(shù)B是所有資源
2.urllib模塊
urllib模塊有很多功能,其中本文主要涉及到的函數(shù)或功能有urllib.request下面的urlopen,build_opener,install_opener,ProxyHandler,retrieve等。
urllib模塊是整個(gè)基礎(chǔ)爬蟲中最重要的模塊之一,本文主要引用了urllib模塊進(jìn)行爬蟲有關(guān)操作,當(dāng)然也有其他模塊和框架(scrapy項(xiàng)目框架)可以進(jìn)行爬蟲,在此暫時(shí)不做考慮。
(二)應(yīng)對反爬蟲機(jī)制
在對某些網(wǎng)站進(jìn)行爬取的時(shí)候會(huì)遇到一些反爬機(jī)制,所謂反爬機(jī)制就是指對方不希望別人用除瀏覽器以外的途徑去獲取該網(wǎng)站的信息或者不希望該網(wǎng)站的數(shù)據(jù)被某些人用于商業(yè)用途從而制作的一些拒絕爬取的手段。本文主要講的有兩種反爬機(jī)制分別是,網(wǎng)站拒絕除瀏覽器以外的訪問方式和網(wǎng)站拒絕反復(fù)多次提供數(shù)據(jù)給同一IP地址.針對第一種常見的解決方案是構(gòu)建用戶代理或者用戶代理池,針對第二種情況則是構(gòu)建IP代理或者IP代理池。
(三)用戶代理池
用戶代理(User Agent),簡稱 UA,它是一個(gè)特殊字符串頭,使得服務(wù)器能夠識(shí)別客戶使用的操作系統(tǒng)及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等.一些網(wǎng)站常常通過判斷 UA 來給不同的操作系統(tǒng)、不同的瀏覽器發(fā)送不同的頁面,因此可能造成某些頁面無法在某個(gè)瀏覽器中正常顯示,但通過偽裝 UA 可以繞過檢測。
用戶代理池由多個(gè)用戶代理構(gòu)成,從里面隨機(jī)選取一個(gè)用戶代理來應(yīng)對相應(yīng)的錯(cuò)誤.
(四)IP代理池
高頻抓取某個(gè)網(wǎng)站的數(shù)據(jù),很有可能就被網(wǎng)站管理員封掉IP,導(dǎo)致抓取數(shù)據(jù)失敗,解決這個(gè)問題最直接,簡單的方法就是使用代理IP。目前網(wǎng)上有不少提供付費(fèi)代理IP的平臺(tái),但是如需長期使用,該方案是筆不少的開銷。本項(xiàng)目通過抓取IP代理網(wǎng)站提供免費(fèi)代理IP,并不間斷的驗(yàn)證IP的有效性,根據(jù)代理IP驗(yàn)證的歷史記錄對IP進(jìn)行評(píng)估,輸出高質(zhì)量代理IP。
(一)微信登錄
微信公眾號(hào)平臺(tái)數(shù)據(jù)需要在登錄的情況下才能訪問到,所以微信公眾號(hào)登錄是爬蟲需要解決的第一個(gè)問題。微信公眾號(hào)一般有以下幾個(gè)步驟:
1.客戶端向用戶服務(wù)器發(fā)送登錄請求;
2.服務(wù)器接收到登錄請求后會(huì)生成相應(yīng)的密鑰返回給客戶端;
3.客戶端將用戶的用戶名、密碼以及中服務(wù)器發(fā)回的登錄密鑰結(jié)合在一起再向服務(wù)器提交登錄信息,服務(wù)器驗(yàn)證成功之后將會(huì)返回正確的登錄狀態(tài)以及當(dāng)前用戶的個(gè)人信息。成功登錄之后客戶端只需要保持與服務(wù)器的session會(huì)話就可以方便地訪問微信公眾號(hào)中的數(shù)據(jù)資源。
(二)微信公眾號(hào)正文內(nèi)容抓取
本文爬蟲針對用戶的微信公眾號(hào)內(nèi)容提供了相應(yīng)的抓取方法。一種方法是:本文爬蟲可以將用戶的所有微信公眾號(hào)內(nèi)容全部以文件的形式完全記錄到磁盤,但是這樣做就需要很多的物理存儲(chǔ)空間才能將如此之多的用戶數(shù)據(jù)保存下來。另一種方法是:本文爬蟲提供了簡單的字符串匹配功能,在抓取用戶微信公眾號(hào)內(nèi)容的過程中會(huì)根據(jù)需要匹配的關(guān)鍵字進(jìn)行匹配,如果發(fā)現(xiàn)匹配成功的爬蟲會(huì)將該數(shù)據(jù)內(nèi)容保存到磁盤。這樣研究人員就可以有針對性地進(jìn)行相關(guān)研究和分析。
(三)某微信公眾號(hào)的爬蟲數(shù)據(jù)分析
通過對某一微信公眾號(hào)的數(shù)據(jù)進(jìn)行爬蟲,從網(wǎng)頁上爬取文本數(shù)據(jù)之后可以進(jìn)行一系列的分析,以關(guān)鍵詞出現(xiàn)頻率為例畫出詞云圖。相對傳統(tǒng)的統(tǒng)計(jì)圖有更好的觀賞性,并且清晰直觀的看出此微信公眾號(hào)的主要內(nèi)容與CNN卷積神經(jīng)網(wǎng)絡(luò),運(yùn)算,領(lǐng)導(dǎo)等關(guān)鍵詞有關(guān),可以粗略推斷本文爬取的公眾號(hào)是與人工智能和數(shù)據(jù)科學(xué)有關(guān)的公眾號(hào)。
在本文利用Python數(shù)據(jù)爬蟲對微信公眾號(hào)數(shù)據(jù)進(jìn)行爬取中,選出爬取文本中高頻出現(xiàn)的詞匯,并用詞云圖的形式表示出來,由于其清晰明了的可視化效果,可以為初學(xué)者的統(tǒng)計(jì)分析提供分析方向。
大數(shù)據(jù)時(shí)代,對大數(shù)據(jù)的分析應(yīng)當(dāng)成為一個(gè)行業(yè),數(shù)據(jù)擁有者應(yīng)該開放數(shù)據(jù)的分析接口,讓數(shù)據(jù)的價(jià)值釋放,而爬蟲開發(fā)者,很多時(shí)候是數(shù)據(jù)分析者,最起碼是個(gè)數(shù)據(jù)清洗和篩選者。他們蒙上了一層神秘面紗,帶著一絲黑客氣息,法律應(yīng)當(dāng)給他們更大的生存空間,讓這個(gè)有價(jià)值的行業(yè)創(chuàng)造更大的價(jià)值。