1. 程式人生 > >大資料時代,如何蒐集有效資料?

大資料時代,如何蒐集有效資料?

在上一篇文章《大資料時代,引數怎麼降維?》(傳送門[1]中,小編從阿爾茲海默症成病機理出發,提到了如何對模型引數降維的問題。我們先來複(Yù)(Xí)一下那張圖表:

經過復(Yù)(Xí)後,這張圖似乎不再那麼催人入眠了!不僅如此,而且我們可以使用資訊幾何,這一自內而外散發著高格調的技術,達到引數降維的目的。正所謂——

一聲驚雷劃冬去,兩鳴鴻雁遊春來。

三月桃花映山紅,四處玉蘭擬雪白。

五味醇釀溫心海,六色晨光覆陰霾。

七刻餘暉寓暖陽,八方雲動照英才。

冬去春來,良辰美景,更何況突然有了解決難題的思路,心情大好,正該不醉不歸!但回頭仔細一想,讀者們會發現還有另一個大問題——資料從什麼地方得來呢?巧婦難為無米之炊,就算理論演算法再高屋建瓴天花亂墜,若沒有實驗資料的支援,那也無異於紙上談兵。大資料時代,資訊(資料)

的蒐集可是極其重要的。資訊(資料)通常來源於網路,而如何過濾掉無用的資料,提取有效成分,這也是公認的難題。下圖是一個例子:

提取有效資訊的過程

因此提取有效資料的關鍵在於準確地抓住資訊的特點,或者關鍵詞(keywords)。當我們把關鍵詞輸入到搜尋引擎(百度、谷歌等)後,這些搜尋引擎就會以一定的優先順序返回我們想要的資訊。那麼搜尋引擎是怎麼展開搜尋的呢?答案:網路爬蟲或者網路蜘蛛(web crawler或web spider,以下簡稱爬蟲)

一、網頁的本質

網是靜態的,但爬蟲是動態的,所以爬蟲的基本思想就是沿著網頁(蜘蛛網的節點)上的連結的爬取有效資訊。當然網頁也有動態(一般用PHP或ASP等寫成,例如使用者登陸介面就是動態網頁)

的,但如果一張蛛網搖搖欲墜,蜘蛛會感到不那麼安穩,所以動態網頁的優先順序一般會被搜尋引擎排在靜態網頁的後面。

知道了爬蟲的基本思想,那麼具體如何操作呢?這得從網頁的基本概念說起(本文只討論靜態網頁)。一個網頁有三大構成要素,分別是html檔案css檔案JavaScript檔案。如果把一個網頁看做一棟房子,那麼html相當於房子外殼;css相當於地磚塗料,美化房子外觀內飾;JavaScript則相當於傢俱電器浴池等,增加房子的功能。從上述比喻可以看出,html才是網頁的根本,畢竟地磚顏料在市場上也有,傢俱電器都可以露天擺設,而房子外殼才是獨一無二的。

下面就是一個簡單網頁的例子:

而在爬蟲眼裡,這個網頁是這樣的:

因此網頁實質上就是超文字(hypertext),網頁上的所有內容都是在形如“<>...</>”這樣的標籤之內的。如果我們要蒐集網頁上的所有超連結,只需尋找所有標籤中前面是"href="的字串,並檢視提取出來的字串是否以"http"(超文字轉換協議,https表示安全的http協議)開頭即可。如果超連結不以"http"開頭,那麼該連結很可能是網頁所在的本地檔案或者ftp或smtp(檔案或郵件轉換協議),應該過濾掉。

二、爬蟲例項

既然知道了網頁的本質,相信讀者們已經躍躍欲試了。為了使讀者更好地理解爬蟲的工作原理,小編將用兩種方式編寫一個最簡單的爬蟲,用以獲取谷歌首頁上的所有超連結(以http://或https://開頭,過濾掉本地檔案),並把它們存到電子表格(Excel)中。

從第一節的分析可以看出,超連結出現在標籤"<a href="...">... </a>"中,所以我們只需要匹配關鍵詞"href="即可。考慮到python是最簡單且使用最廣泛的多用途語言,小編以python 3.6版本為例寫了如下爬蟲,詳細註解都在圖片中,有興趣的讀者可以親自嘗試,看看會出來什麼結果:

如果採用過程式編寫思路,程式碼還會更短一些。為圖簡單,小編沒有使用異常處理手段(Exceptional Handling,一般指try-exception語句,或者條件語句加flag值),這種語句可以用於檢查網路連結是否異常、蒐集檔案的過程是否成功甚至本地檔案讀寫是否正常等。這種手段常常被經常做計算機模擬的科研工作者忽視,以至於當小編把自己寫的程式和一些教授討論時,常常被評論說我的程式“很花哨,沒必要寫得像商業程式”。儘管這種手段並非必須,但經小編大量實踐後發現,當編寫的程式碼過長時,這種手段實則可以有效提高程式查錯(debug)的效率。尤其是在計算機模擬中,程式中的bug經常來自於記憶體錯誤(陣列長度溢位、指標錯誤等),若不採用異常處理手段,這種bug會非常棘手。就像戀愛中的少女一樣,因記憶體錯誤造成的程式崩潰可以發生在任意時刻任意地點,全由計算機的心情而定。

或許不瞭解程式設計讀者會表示異議:“這程式碼有足足32行,哪裡簡單了!”其實去掉空行和評論後也就21行,也不算太多。什麼,還嫌多?好吧,為了造福更多讀者,也為了讓大家感受一下21世紀之前的程式設計師前輩們是如何碼程式碼的,小編又用Unix的外殼指令碼(shell script)把這個爬蟲重新寫了一遍,並命名為"crawler.sh"。同樣,詳細註釋盡在圖中(這是所有Unix系統都有的emacs文件編輯器)

從21行簡化到只有8行!執行後,得到的電子表格內容是這樣的:

如果經過了嘗試和對比,讀者可以發現使用外殼指令碼比python多蒐集了很多網址,而且還去掉了重複的連結。這是因為“wget”命令不僅蒐集了谷歌主頁面上的所有連結,而且直接把谷歌根目錄裡能訪問到的檔案全都爬了個遍。有了這一項技術,我們可以大大豐富電腦E盤中“三個代表重要思想”、“黨章黨規全集”和“日本現代史研究”等文件的內容,從而精神境界得到極大提高。

有經驗的讀者可能注意到了,小編明明用的是Windows系統的命令指示符(cmd),又沒有安裝虛擬機器,怎麼變成了Unix的外殼指令碼呢?從歷史角度來講,Unix和Windows完全是兩個不同派系,兩者理應是互不相容的。但事實上2015年自Win10釋出以後,微軟官方就宣佈Win10可以很簡易地安裝蘋果的終端(蘋果OS系統是Unix系統的一個分支,具體方式見文獻[2]或點選連結,並通過“bash”命令實現從cmd到蘋果終端的轉變,從此告別了Unix虛擬機器的時代!值得一提的是,vim文件編譯器可以在Windows下直接使用;emacs由於功能較多,需要輸入“sudo apt-get install emacs”命令來安裝。

值得一提的是,因為習慣原因,很多人根深蒂固地認為Windows系統更適合家用,Unix系統才適合程式設計師。其實時代一直在變化,微軟集團也在不斷地對Windows系統進行改進,一方面更好地相容Unix體系,另一方面則開發更為先進的外殼平臺。例如Powershell就是一個很好的例子。小編試著用過Powershell,它的一些語句和Unix外殼指令碼頗為類似,同時也支援物件的定義,而且還有和程式語言一樣的高度可讀性。只是對於習慣了Unix外殼的程式設計師而言,Powershell可能顯得不那麼熟悉。

回到爬蟲的話題。經過兩種方式的對比,我們可以發現外殼指令碼的巨大優勢——可以與計算機硬體直接交流,這就是為什麼程式除錯員往往對外殼指令碼(或組合語言)滾瓜爛熟的原因。當然作為多用途式的程式語言,python的其他優勢也不是外殼指令碼所具有的。在什麼場合使用何種語言,這個判斷十分重要。

三、守規矩的爬蟲才是好爬蟲

當一個爬蟲活動過於頻繁時,會造成網路交通堵塞,因此一些網站很反感陌生的爬蟲。怎麼樣限制陌生爬蟲的行為呢?答案就在目標網站根目錄的"robot.txt"檔案裡面,這個檔案規定了爬蟲應該遵守的條款。當正常的爬蟲開始爬取網頁資訊時,會首先檢查robot.txt的規定並且遵守它。例如百度的robot.txt是這樣的:

可見百度只允許少數幾個搜尋引擎訪問,所以直接用第二節的方法爬取百度首頁是會被拒絕的。如果確實有批量作業的必要,則應該把爬蟲的“User-agent”改為上述任一瀏覽器的字串,以模仿瀏覽器訪問的過程,並且限定爬蟲的活動頻率

有的壞爬蟲(Bad bots)直接無視掉robot.txt裡的約束,肆無忌憚地爬取網頁資訊,不僅可能造成網路癱瘓,還會出現安全隱患。如何過濾掉這些爬蟲,是網路安全領域的一大課題,尤其是高階的爬蟲會使用分散式技術(多個客戶端分別爬取網頁,用以防止IP被查封)和抓取AJAX(用以模仿JavaScript以爬取動態網頁),這就使得反爬蟲的工作變得十分具有挑戰性。

把壞爬蟲抓出來。圖片源自網路

有趣的是,幾乎每個大型網站都會有對應的robot.txt,而這些檔案能在一定程度上反映出不同網站開發者的偏好。有興趣的讀者可以自行分析。

四、完整的搜尋引擎

搜尋引擎要做的當然不止普通爬蟲那麼簡單。讀者可以思考一下,當你在百度上輸入關鍵詞“謝雕英雄傳”時,搜尋出的結果會是“射鵰英雄傳”,怎麼做到的呢?顯然還需要文字和網頁的預處理(Preporcessing)。另一方面,能匹配關鍵詞的網頁太多了,總得有個先後次序吧。這就是網頁的排序(Ranking)問題[3]。

預處理通常有三個步驟,第一是把網頁中的文字編號(indexing),這樣匹配關鍵詞就變成了尋找編號的的問題;第二是關鍵詞溯源(stemming),例如去掉“的”、“我”和標點符號等不重要符號限制;第三是提取網頁中的關鍵資訊。要記住,瀏覽器眼中的網頁永遠都是一堆程式碼,所以需要過濾掉標籤符號、超連結和網頁排版佈局等冗雜資訊。

網頁排序的演算法有很多,不同瀏覽器使用的演算法也有不同,但核心都是一樣的——把網路看作有向圖(小編在《愛因斯坦vs阿爾法狗》[4]中提到過,這裡又出現了,傳送門在此。網頁是有向圖的節點,如果網頁A上有指向網頁B的連結,那麼就形成了一條節點A到節點B的箭頭,有向圖就這麼被產生了。

可以看出,[4]中的神經網路其實只是網路的一個特例。如果一個網頁(節點)的連結出現在其他很多網頁上,說明這個網頁很受歡迎,理應得到較高的排名。事實上我們可以把這一過程用馬爾可夫鏈(Markov Chain)表示出來。以谷歌的PageRank演算法為例[5]:

由馬爾科夫鏈的遍歷性定理可知,當矩陣A滿足不可約漸進無週期條件(irreducible和aperiodic,也就是網路連通,且當經歷的連結夠多時兩個網頁的深度只相差1),以上關於向量P(把P看作向量,分量加起來為1)的方程一定存在穩定解。穩定解(或者收斂性)是計算工作者們的最愛,因為有了穩定解以後,就可以通過迭代演算法把這個穩定解找出來,從而得到網頁排序!

一帆風順的事並沒有那麼多,因為用上面這一方法定義出來的A未必不可約。這就是為什麼要額外加一項d,把右邊這個矩陣活生生地變得不可約。這就是PageRank演算法的精妙之處——看起來很簡單,但簡單的智慧往往可以創造出巨大的功效。這也是小編所希望追求的數學——簡單,但普適性很高。

PageRank大致效果。圖片源自網路。

當然,這只是最原始的PageRank演算法。由於不少網站利用這一演算法的特點,來千方百計增加自己的排名(例如把字型和網頁背景色設定為一樣的顏色以欺騙搜尋引擎),谷歌也不斷在更新自己的演算法,以達到精準和快速兩大目的。兩者之間的相互較量也構成了網路領域的另一個課題,即垃圾連結和垃圾郵件的清理。其中又有很多手段,在此不一一介紹了。

五、總結和其他

如果讀者能夠讀懂整篇文章,那麼恭喜,你已經大體掌握了網頁的本質、簡單爬蟲的實現和搜尋引擎的工作原理這三大網際網路基礎知識,可以準確地蒐集自己想要的資料了。比起滿目琳琅的資料處理和分析手段,資料的蒐集方式簡單粗暴,一學就會!

大資料時代,程式設計師可謂是十分吃香的行業,入門快且收入高,再多繁忙也可一筆勾銷。但不同於傳統學科,計算機語言的發展更新速度十分迅猛,同一種語言的不同版本都可能發生巨大的變化。例如小編在學習計算機系統的經典教材Computer Systems A programmer's Perspective(《深入理解計算機系統》)時,線上程控制(Thread Control)那一章花了不少時間,因為稍不注意就會發生記憶體崩潰。

相信通過這幅圖能找到不少同道中人

後來發現了mpi和openmp這兩個神奇的工具後,就再也沒用過"Ptheread_join"(加入執行緒)和"Ptheread_exit"(退出執行緒)這些老掉牙的命令。和細胞生物學類似(在小編另一篇文章《護膚與保養》[6]中提到過,傳送門在此,計算機語言也具有高度可變性,我們需要與時俱進,做好學習新知識的準備。

作為新時代的弄潮兒,生物和計算機領域的人才需求量是巨大的,這兩個學科之間交相輝映相輔相成,頗有幾分上個世紀數學和物理相互促進共同進步的味道。它們能給21世紀帶來怎樣的變革?我們在拭目以待的同時,也應當做好應對各種變化的準備。古詩云:

李杜詩篇萬口傳,至今已覺不新鮮。
江山代有才人出,各領風騷數百年。

古人尚有此等遠見,更何況這個沐浴在大資料海洋中,充滿了機遇與挑戰的時代?

如果喜歡筆者的文章,就長按下面的二維碼關注筆者的公眾號吧!

參考文獻:

[1] https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit&action=edit&lang=zh_CN&token=1564769556&type=10&appmsgid=100000224&isMul=1

[2] http://www.windowscentral.com/how-install-bash-shell-command-line-windows-10

[3] B. Liu, Exploring Hyperlinks, Contents and Usage Data.

[4] https://mp.weixin.qq.com/s?__biz=MzIyNjc2NzY4OA==&mid=2247483734&idx=1&sn=f2cfa64f6415194afa045816dfd3ba1b&chksm=e86a2771df1dae6793fea4fc55b83575298a9baee0a6cd551bcab4ada5205bee7de2cfeda7e7#rd

[5] L. Page et. al, The PageRank citation ranking: Bringing order to the web.

[6] https://mp.weixin.qq.com/s?__biz=MzIyNjc2NzY4OA==&mid=2247483827&idx=1&sn=c8c519dde272b735703ad623c7ef3de5&chksm=e86a2794df1dae82dba6eedf75a14d51f5972cc1359a4cf0d682503cf188936fcb41505614ec#rd

相關推薦

資料時代揭露個人資料洩漏和祕密跟蹤內幕

網聯網、社交網路技術的發展給人們的生活帶了很多方便,例如網上聊天、網上購物、視訊和社交等成了我們生活的新常態,據最新統計資料顯示,我國網民總數已達7.1億。但是,網際網路在給我們生活帶來便利的同時,也存在個人隱私和資訊保安的風險,這就要求我們在享受便利生活的同時,提高網路安全和個人網路資訊的保護意識。今天我們

資料時代如何蒐集有效資料

在上一篇文章《大資料時代,引數怎麼降維?》(傳送門)[1]中,小編從阿爾茲海默症成病機理出發,提到了如何對模型引數降維的問題。我們先來複(Yù)習(Xí)一下那張圖表: 經過復(Yù)習(Xí)後,這張圖似乎不再那麼催人入眠了!不僅如此,而且我們可以使用資訊幾

資料資訊時代如何防止資料洩露資料防洩漏解決方案

隨著大資料時代的到來,資料已經成為與物質資產和人力資本同樣重要的基礎生產要素,大資料正在重塑世界新格局。 伴隨著網際網路時代頻繁上演的資料洩露事件,不僅給企業及個人帶來了一定的危機,同時也對國家造成了一定的損失,資料資訊保安也愈演愈烈,那麼,大資料時代,[資料資訊保安]應該何去何從? 為什麼說資料資訊保安

資料時代如何提升格局

大資料時代,格局非常重要,想學習大資料技術的小夥伴,一定要認真閱讀此文 其實大資料時代的人才只分為三種:做事的人、做式的人、做局的人。 道生一,一生二,二生三,三生萬物。這三種人,組建起了一個龐大的社會體系。 先看做事的人。 把一件事情最好是一個人的基本能力,它遵循的是“事道”,講究

資料時代IT行業的熱門崗位有哪些?

雲端計算、大資料、BYOD、社交媒體、3D印表機、物聯網……在網際網路時代,各種新詞層出不窮,令人應接不暇。這些新的技術、新興應用和對應的IT發展趨勢,使得IT人必須瞭解甚至掌握最新的IT技能。 另一方面,雲端計算和大資料乃至其他助推各個行業發展的IT基礎設施的新一輪部署與運維,都將帶來更多的I

資料時代IT行業的熱門崗位有哪些?9前景分析!

最近幾年,特別是今年,好像經常聽到一句話:兄弟,今年生意真難做。是啊,時代在發展,市場也在變,很多人的處境越發艱難,只有適應了市場的變化才能生存。 大資料的市場前景廣闊,而技術能否達到預期的效果,關鍵是在於能否找到適合資訊社會需求的應用模式。而無論是在競爭還是合作的過程中,如果沒有切實的應用,大

資料時代你的角色是什麼?

大資料時代,不懂點資料分析都不好意思告訴別人你混網際網路、混大都市的,在大資料的環境下,我把市場上的分析師分為幾類   一、資料變現者   這類人一直在公司從事這業務分析的角色,他們一直在嘗試用資料去改變業務決策的流程變更和機遇,驅動這企業的北極星指標,更多做的事

資料時代誰的眼神鎖定你?

資料時代當前,歡迎來到楚門的世界。 雙十一餘韻未歇,剛處理完一波售後及退件等“剁手後遺症”的各方人馬也已經為再戰雙十二做好了準備。截至 12 日零點,天貓雙十一成交額達 2135 億元。與此同時,據國家郵政局監測資料顯示,主要電商企業 11 日全天共產生快遞物流訂單

資料時代資料架構的演繹發展歷程

  首先從企業資訊化發展階段時,資料平臺結構的程度來看。個人依照企業資訊化,將資料平臺階段劃分為:只有業務資料庫——>中間庫——>完善資料倉庫(DW)——>資料集市(Data Mart),順序與階段並不絕對正確,可能有組合,可能所在階段不完全一致。以下先看各個資料

人工智慧發展時代如何利用資料改變現有商業模式?

​社交媒體上,我們很多時候展示的都不是真實的自己,每個人都在不斷的給自己貼標籤:正直、成熟、知識淵博等等,分析這樣的大資料真的有意義嗎? 在交流中,人們更多的是通過非語言訊號實現的,手勢、喜歡、厭惡、猶豫、裝飾、密碼、狀態更新等,都是所謂的小資料。 找到痛點,不用研究幾百萬名顧客,只要研

資料時代Python是最好的語言!

隨著大資料瘋狂的浪潮,新生代的工具Python得到了前所未有的爆發。簡潔、開源是這款工具吸引了眾多粉絲的原因。目前Python最熱的領域,非資料分析和挖掘莫屬了。從以Pandas為代表的資料分析領域開始,便是Python的天下;一邊以實際專案實操,一邊跟著已有的資料學習,再輔以相關的理論知識,勢必將集Pyth

資料時代“還原”鏈上資料傳遞數字價值從使用Gikee開始

8月末、9月初,區塊鏈行業迎來一場大地震——多家區塊鏈媒體微信公眾賬號被永久封禁,其中不乏金色財經、火幣資訊、幣世界等大號。 這場封號風波其實並非空穴來風,今年 3 月,人民網旗下人民創投就曾公開發文批評區塊鏈媒體。如今,線上、線下一起遭遇最強監管,對於整個區塊鏈媒體們而言

資料時代你應該具備的資料思維

我們在思考問題時,當儘量避免因為自己的無知,提出一些低階的問題來。   我經常會被一些低階的問題,搞得沒了耐心。比如下面這樣的:   為什麼高考狀元,最後都很平庸? 我讀了清北,以後可以進投行嗎? 為什麼學區房那麼值錢,但學歷不值錢? 為

資料時代如何快速構建高效能資料庫平臺

        在資料爆炸的時代,給眾多IT從業人員帶來了相當大的困擾—伴隨著大資料分析,商業智慧的發展,資料量呈現指數增長,傳統資料處理系統已不堪重負。在這樣的背景下,“資料庫平臺的構建”逐漸成為一個備受關注的話題。     &nbs

資料時代區塊鏈在資料安全領域有什麼樣的表現?

    大資料時代之下,一如我們無法抗拒科技進步帶來的便捷及歡愉,我們同樣也無法避免在享受這一切的過程中留下自己的“數字足跡”。正因如此,資料如今已然被納入企業的戰略資源,開始指導決策,成為其提高行業核心競爭力的關鍵一環。   當今的數字化時代,資料可謂是這個時代的第一生產力

資料時代資料=財富!

馬雲,說了一句話,讓全世界的人都湧向了市場。“想要我的寶藏嗎?如果想要的話,那就到資料上去找吧!我把我的未來全部都放在那裡”,世界開始迎接“大資料時代”的來臨。     什麼是大資料呢?   顧名思義大資料便是數量巨大,型別眾多,結構複雜的資料

【運維專家大講堂】雲端計算和資料時代資料庫運維工程師發展方向在哪?

本次運維專家大講堂精選2014年6月份ITPUB的採訪,訪談物件是楊志洪,網名boypoo,Oracle ACE成員,現擔任上海新炬網路技術有限公司的技術總監。 開場: 一直以來運維工程師的角色被蒙上了各種神祕面紗,平時他們是默默無聞的幕後工作者,很少被人關注。而一旦企業出現技術故障,大家就會立刻呼

資料時代為什麼很多JAVA程式設計師會轉型做JAVA資料

分享之前推薦一個大資料交流學習群:722680258零基礎進階高階,需要學習大資料歡迎加入JAVA的精密,強大,擁有其它語言不可替代的效能和可維護性,早已經是成為最受歡迎的程式語言之一,很多人想進入IT行業,首選的第一門語言就是JAVA。但是,在未來10年肯定是大資料的天下,

資料時代如何成為一個年薪50w的資料開發工程師?

大資料是眼下最帶感的技術名稱之一,大資料行業的火爆發展也自然也衍生出了一些與大資料相關的職業,比如網際網路資料分析師、資料工程師等等,通過對資料的挖掘分析來影響企業的商業決策已屢見不鮮。這類職業的人群在國外被叫做資料科學家(Data Scientist),這個頭銜最早由D.J

資料時代還不認識這些資料分析工具?

在大資料時代的現今,資料龐大且繁雜,因此,如何有效利用它們,達到資源不浪費的目的成為了相關工作者