
大數(shù)據(jù)時代,如何搜集有效數(shù)據(jù)
小編從阿爾茲海默癥成病機理出發(fā),提到了如何對模型參數(shù)降維的問題。我們先來復(fù)(Yù)習(xí)(Xí)一下那張圖表:
經(jīng)過復(fù)(Yù)習(xí)(Xí)后,這張圖似乎不再那么催人入眠了!不僅如此,而且我們可以使用信息幾何,這一自內(nèi)而外散發(fā)著高格調(diào)的技術(shù),達到參數(shù)降維的目的。正所謂——
一聲驚雷劃冬去,兩鳴鴻雁游春來。
三月桃花映山紅,四處玉蘭擬雪白。
五味醇釀溫心海,六色晨光覆陰霾。
七刻余暉寓暖陽,八方云動照英才。
冬去春來,良辰美景,更何況突然有了解決難題的思路,心情大好,正該不醉不歸!但回頭仔細一想,讀者們會發(fā)現(xiàn)還有另一個大問題——數(shù)據(jù)從什么地方得來呢?巧婦難為無米之炊,就算理論算法再高屋建瓴天花亂墜,若沒有實驗數(shù)據(jù)的支持,那也無異于紙上談兵。大數(shù)據(jù)時代,信息(數(shù)據(jù))的搜集可是極其重要的。信息(數(shù)據(jù))通常來源于網(wǎng)絡(luò),而如何過濾掉無用的數(shù)據(jù),提取有效成分,這也是公認的難題。下圖是一個例子:
提取有效信息的過程
因此提取有效數(shù)據(jù)的關(guān)鍵在于準確地抓住信息的特點,或者關(guān)鍵詞(keywords)。當我們把關(guān)鍵詞輸入到搜索引擎(百度、谷歌等)后,這些搜索引擎就會以一定的優(yōu)先級返回我們想要的信息。那么搜索引擎是怎么展開搜索的呢?答案:網(wǎng)絡(luò)爬蟲或者網(wǎng)絡(luò)蜘蛛(web crawler或web spider,以下簡稱爬蟲)。
一、網(wǎng)頁的本質(zhì)
網(wǎng)是靜態(tài)的,但爬蟲是動態(tài)的,所以爬蟲的基本思想就是沿著網(wǎng)頁(蜘蛛網(wǎng)的節(jié)點)上的鏈接的爬取有效信息。當然網(wǎng)頁也有動態(tài)(一般用PHP或ASP等寫成,例如用戶登陸界面就是動態(tài)網(wǎng)頁)的,但如果一張蛛網(wǎng)搖搖欲墜,蜘蛛會感到不那么安穩(wěn),所以動態(tài)網(wǎng)頁的優(yōu)先級一般會被搜索引擎排在靜態(tài)網(wǎng)頁的后面。
知道了爬蟲的基本思想,那么具體如何操作呢?這得從網(wǎng)頁的基本概念說起(本文只討論靜態(tài)網(wǎng)頁)。一個網(wǎng)頁有三大構(gòu)成要素,分別是html文件、css文件和JavaScript文件。如果把一個網(wǎng)頁看做一棟房子,那么html相當于房子外殼;css相當于地磚涂料,美化房子外觀內(nèi)飾;JavaScript則相當于家具電器浴池等,增加房子的功能。從上述比喻可以看出,html才是網(wǎng)頁的根本,畢竟地磚顏料在市場上也有,家具電器都可以露天擺設(shè),而房子外殼才是獨一無二的。
下面就是一個簡單網(wǎng)頁的例子:
而在爬蟲眼里,這個網(wǎng)頁是這樣的:
因此網(wǎng)頁實質(zhì)上就是超文本(hypertext),網(wǎng)頁上的所有內(nèi)容都是在形如“<>...</>”這樣的標簽之內(nèi)的。如果我們要搜集網(wǎng)頁上的所有超鏈接,只需尋找所有標簽中前面是"href="的字符串,并查看提取出來的字符串是否以"http"(超文本轉(zhuǎn)換協(xié)議,https表示安全的http協(xié)議)開頭即可。如果超鏈接不以"http"開頭,那么該鏈接很可能是網(wǎng)頁所在的本地文件或者ftp或smtp(文件或郵件轉(zhuǎn)換協(xié)議),應(yīng)該過濾掉。
二、爬蟲實例
既然知道了網(wǎng)頁的本質(zhì),相信讀者們已經(jīng)躍躍欲試了。為了使讀者更好地理解爬蟲的工作原理,小編將用兩種方式編寫一個最簡單的爬蟲,用以獲取谷歌首頁上的所有超鏈接(以http://或https://開頭,過濾掉本地文件),并把它們存到電子表格(Excel)中。
從第一節(jié)的分析可以看出,超鏈接出現(xiàn)在標簽"<a href="...">... </a>"中,所以我們只需要匹配關(guān)鍵詞"href="即可??紤]到python是最簡單且使用最廣泛的多用途語言,小編以python 3.6版本為例寫了如下爬蟲,詳細注解都在圖片中,有興趣的讀者可以親自嘗試,看看會出來什么結(jié)果:
如果采用過程式編寫思路,代碼還會更短一些。為圖簡單,小編沒有使用異常處理手段(Exceptional Handling,一般指try-exception語句,或者條件語句加flag值),這種語句可以用于檢查網(wǎng)絡(luò)鏈接是否異常、搜集文件的過程是否成功甚至本地文件讀寫是否正常等。這種手段常常被經(jīng)常做計算機模擬的科研工作者忽視,以至于當小編把自己寫的程序和一些教授討論時,常常被評論說我的程序“很花哨,沒必要寫得像商業(yè)程序”。盡管這種手段并非必須,但經(jīng)小編大量實踐后發(fā)現(xiàn),當編寫的代碼過長時,這種手段實則可以有效提高程序查錯(debug)的效率。尤其是在計算機模擬中,程序中的bug經(jīng)常來自于內(nèi)存錯誤(數(shù)組長度溢出、指針錯誤等),若不采用異常處理手段,這種bug會非常棘手。就像戀愛中的少女一樣,因內(nèi)存錯誤造成的程序崩潰可以發(fā)生在任意時刻任意地點,全由計算機的心情而定。
或許不了解編程讀者會表示異議:“這代碼有足足32行,哪里簡單了!”其實去掉空行和評論后也就21行,也不算太多。什么,還嫌多?好吧,為了造福更多讀者,也為了讓大家感受一下21世紀之前的程序員前輩們是如何碼代碼的,小編又用Unix的外殼腳本(shell script)把這個爬蟲重新寫了一遍,并命名為"crawler.sh"。同樣,詳細注釋盡在圖中(這是所有Unix系統(tǒng)都有的emacs文檔編輯器):
從21行簡化到只有8行!執(zhí)行后,得到的電子表格內(nèi)容是這樣的:
如果經(jīng)過了嘗試和對比,讀者可以發(fā)現(xiàn)使用外殼腳本比python多搜集了很多網(wǎng)址,而且還去掉了重復(fù)的鏈接。這是因為“wget”命令不僅搜集了谷歌主頁面上的所有鏈接,而且直接把谷歌根目錄里能訪問到的文件全都爬了個遍。有了這一項技術(shù),我們可以大大豐富電腦E盤中“三個代表重要思想”、“黨章黨規(guī)全集”和“日本現(xiàn)代史研究”等文檔的內(nèi)容,從而精神境界得到極大提高。
有經(jīng)驗的讀者可能注意到了,小編明明用的是Windows系統(tǒng)的命令指示符(cmd),又沒有安裝虛擬機,怎么變成了Unix的外殼腳本呢?從歷史角度來講,Unix和Windows完全是兩個不同派系,兩者理應(yīng)是互不兼容的。但事實上2015年自Win10發(fā)布以后,微軟官方就宣布Win10可以很簡易地安裝蘋果的終端(蘋果OS系統(tǒng)是Unix系統(tǒng)的一個分支,具體方式見文獻[2]),并通過“bash”命令實現(xiàn)從cmd到蘋果終端的轉(zhuǎn)變,從此告別了Unix虛擬機的時代!值得一提的是,vim文檔編譯器可以在Windows下直接使用;emacs由于功能較多,需要輸入“sudo apt-get install emacs”命令來安裝。
值得一提的是,因為習(xí)慣原因,很多人根深蒂固地認為Windows系統(tǒng)更適合家用,Unix系統(tǒng)才適合程序員。其實時代一直在變化,微軟集團也在不斷地對Windows系統(tǒng)進行改進,一方面更好地兼容Unix體系,另一方面則開發(fā)更為先進的外殼平臺。例如Powershell就是一個很好的例子。小編試著用過Powershell,它的一些語句和Unix外殼腳本頗為類似,同時也支持對象的定義,而且還有和編程語言一樣的高度可讀性。只是對于習(xí)慣了Unix外殼的程序員而言,Powershell可能顯得不那么熟悉。
回到爬蟲的話題。經(jīng)過兩種方式的對比,我們可以發(fā)現(xiàn)外殼腳本的巨大優(yōu)勢——可以與計算機硬件直接交流,這就是為什么程序調(diào)試員往往對外殼腳本(或匯編語言)滾瓜爛熟的原因。當然作為多用途式的編程語言,python的其他優(yōu)勢也不是外殼腳本所具有的。在什么場合使用何種語言,這個判斷十分重要。
三、守規(guī)矩的爬蟲才是好爬蟲
當一個爬蟲活動過于頻繁時,會造成網(wǎng)絡(luò)交通堵塞,因此一些網(wǎng)站很反感陌生的爬蟲。怎么樣限制陌生爬蟲的行為呢?答案就在目標網(wǎng)站根目錄的"robot.txt"文件里面,這個文件規(guī)定了爬蟲應(yīng)該遵守的條款。當正常的爬蟲開始爬取網(wǎng)頁信息時,會首先檢查robot.txt的規(guī)定并且遵守它。例如百度的robot.txt是這樣的:
可見百度只允許少數(shù)幾個搜索引擎訪問,所以直接用第二節(jié)的方法爬取百度首頁是會被拒絕的。如果確實有批量作業(yè)的必要,則應(yīng)該把爬蟲的“User-agent”改為上述任一瀏覽器的字符串,以模仿瀏覽器訪問的過程,并且限定爬蟲的活動頻率。
有的壞爬蟲(Bad bots)直接無視掉robot.txt里的約束,肆無忌憚地爬取網(wǎng)頁信息,不僅可能造成網(wǎng)絡(luò)癱瘓,還會出現(xiàn)安全隱患。如何過濾掉這些爬蟲,是網(wǎng)絡(luò)安全領(lǐng)域的一大課題,尤其是高級的爬蟲會使用分布式技術(shù)(多個客戶端分別爬取網(wǎng)頁,用以防止IP被查封)和抓取AJAX(用以模仿JavaScript以爬取動態(tài)網(wǎng)頁)等,這就使得反爬蟲的工作變得十分具有挑戰(zhàn)性。
有趣的是,幾乎每個大型網(wǎng)站都會有對應(yīng)的robot.txt,而這些文件能在一定程度上反映出不同網(wǎng)站開發(fā)者的偏好。有興趣的讀者可以自行分析。
四、完整的搜索引擎
搜索引擎要做的當然不止普通爬蟲那么簡單。讀者可以思考一下,當你在百度上輸入關(guān)鍵詞“謝雕英雄傳”時,搜索出的結(jié)果會是“射雕英雄傳”,怎么做到的呢?顯然還需要文字和網(wǎng)頁的預(yù)處理(Preporcessing)。另一方面,能匹配關(guān)鍵詞的網(wǎng)頁太多了,總得有個先后次序吧。這就是網(wǎng)頁的排序(Ranking)問題[3]。
預(yù)處理通常有三個步驟,第一是把網(wǎng)頁中的文字編號(indexing),這樣匹配關(guān)鍵詞就變成了尋找編號的的問題;第二是關(guān)鍵詞溯源(stemming),例如去掉“的”、“我”和標點符號等不重要符號限制;第三是提取網(wǎng)頁中的關(guān)鍵信息。要記住,瀏覽器眼中的網(wǎng)頁永遠都是一堆代碼,所以需要過濾掉標簽符號、超鏈接和網(wǎng)頁排版布局等冗雜信息。
網(wǎng)頁排序的算法有很多,不同瀏覽器使用的算法也有不同,但核心都是一樣的——把網(wǎng)絡(luò)看作有向圖(小編在《愛因斯坦vs阿爾法狗》[4]中提到過,這里又出現(xiàn)了)。網(wǎng)頁是有向圖的節(jié)點,如果網(wǎng)頁A上有指向網(wǎng)頁B的鏈接,那么就形成了一條節(jié)點A到節(jié)點B的箭頭,有向圖就這么被產(chǎn)生了。
可以看出,[4]中的神經(jīng)網(wǎng)絡(luò)其實只是網(wǎng)絡(luò)的一個特例。如果一個網(wǎng)頁(節(jié)點)的鏈接出現(xiàn)在其他很多網(wǎng)頁上,說明這個網(wǎng)頁很受歡迎,理應(yīng)得到較高的排名。事實上我們可以把這一過程用馬爾可夫鏈(Markov Chain)表示出來。以谷歌的PageRank算法為例[5]:
由馬爾科夫鏈的遍歷性定理可知,當矩陣A滿足不可約和漸進無周期條件時(irreducible和aperiodic,也就是網(wǎng)絡(luò)連通,且當經(jīng)歷的鏈接夠多時兩個網(wǎng)頁的深度只相差1),以上關(guān)于向量P(把P看作向量,分量加起來為1)的方程一定存在穩(wěn)定解。穩(wěn)定解(或者收斂性)是計算工作者們的最愛,因為有了穩(wěn)定解以后,就可以通過迭代算法把這個穩(wěn)定解找出來,從而得到網(wǎng)頁排序!
一帆風(fēng)順的事并沒有那么多,因為用上面這一方法定義出來的A未必不可約。這就是為什么要額外加一項d,把右邊這個矩陣活生生地變得不可約。這就是PageRank算法的精妙之處——看起來很簡單,但簡單的智慧往往可以創(chuàng)造出巨大的功效。這也是小編所希望追求的數(shù)學(xué)——簡單,但普適性很高。
當然,這只是最原始的PageRank算法。由于不少網(wǎng)站利用這一算法的特點,來千方百計增加自己的排名(例如把字體和網(wǎng)頁背景色設(shè)置為一樣的顏色以欺騙搜索引擎),谷歌也不斷在更新自己的算法,以達到精準和快速兩大目的。兩者之間的相互較量也構(gòu)成了網(wǎng)絡(luò)領(lǐng)域的另一個課題,即垃圾鏈接和垃圾郵件的清理。其中又有很多手段,在此不一一介紹了。
五、總結(jié)和其他
如果讀者能夠讀懂整篇文章,那么恭喜,你已經(jīng)大體掌握了網(wǎng)頁的本質(zhì)、簡單爬蟲的實現(xiàn)和搜索引擎的工作原理這三大互聯(lián)網(wǎng)基礎(chǔ)知識,可以準確地搜集自己想要的數(shù)據(jù)了。比起滿目琳瑯的數(shù)據(jù)處理和分析手段,數(shù)據(jù)的搜集方式簡單粗暴,一學(xué)就會!
大數(shù)據(jù)時代,程序員可謂是十分吃香的行業(yè),入門快且收入高,再多繁忙也可一筆勾銷。但不同于傳統(tǒng)學(xué)科,計算機語言的發(fā)展更新速度十分迅猛,同一種語言的不同版本都可能發(fā)生巨大的變化。例如小編在學(xué)習(xí)計算機系統(tǒng)的經(jīng)典教材Computer Systems A programmer's Perspective(《深入理解計算機系統(tǒng)》)時,在線程控制(Thread Control)那一章花了不少時間,因為稍不注意就會發(fā)生內(nèi)存崩潰。
相信通過這幅圖能找到不少同道中人
后來發(fā)現(xiàn)了mpi和openmp這兩個神奇的工具后,就再也沒用過"Ptheread_join"(加入線程)和"Ptheread_exit"(退出線程)這些老掉牙的命令。和細胞生物學(xué)類似(在小編另一篇文章《護膚與保養(yǎng)》[6]中提到過),計算機語言也具有高度可變性,我們需要與時俱進,做好學(xué)習(xí)新知識的準備。
作為新時代的弄潮兒,生物和計算機領(lǐng)域的人才需求量是巨大的,這兩個學(xué)科之間交相輝映相輔相成,頗有幾分上個世紀數(shù)學(xué)和物理相互促進共同進步的味道。它們能給21世紀帶來怎樣的變革?我們在拭目以待的同時,也應(yīng)當做好應(yīng)對各種變化的準備。古詩云:
李杜詩篇萬口傳,至今已覺不新鮮。
江山代有才人出,各領(lǐng)風(fēng)騷數(shù)百年。
古人尚有此等遠見,更何況這個沐浴在大數(shù)據(jù)海洋中,充滿了機遇與挑戰(zhàn)的時代?
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報考條件詳解與準備指南? ? 在數(shù)據(jù)驅(qū)動決策的時代浪潮下,CDA 數(shù)據(jù)分析師認證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計的實用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認 ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動決策的時代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報考到取證的全攻略? 在數(shù)字經(jīng)濟蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據(jù)背后的時間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時間維度的精準切片? ? 在數(shù)據(jù)的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準 ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準確捕捉數(shù)據(jù)的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03