數(shù)據(jù)的意義在于從中發(fā)現(xiàn)有趣的事情,以了解這個世界,體驗一種創(chuàng)造性的快樂。我對豆瓣很有興趣,它很特別,在國內(nèi)外沒有可類比的公司。對它的探究,要從研究豆瓣的用戶開始。
如果要研究豆瓣的用戶,先要抓取豆瓣的用戶信息。豆瓣的用戶的主頁形如:http://www.douban.com/people/laoluo/,這個是老羅的豆瓣主頁,在右下角有“羅永浩的關(guān)注”,里面有他關(guān)注的8個用戶。
如果想抓豆瓣,最簡單的方式是,從任意一個用戶開始,比如老羅,先抓取http://www.douban.com/people/laoluo/,把頁面存起來,然后找到他關(guān)注的8個用戶,記下ta們的用戶ID,然后再抓取ta們的主頁,再找他們關(guān)注的用戶,循環(huán)不斷地抓下去,幾乎可以抓取豆瓣用戶的所有用戶。
我試了幾種開源的Java爬蟲,有的叫spider,有的叫crawler,其實意思都一樣,業(yè)內(nèi)常用的是Nutch,但體量有點大,粗略看了下代碼有幾萬行,讀它的代碼可能比較耗時。最后選了crawler4j,它的代碼量只有幾千行,然后用它的庫寫了一個定制版的豆瓣crawler,從任意一個用戶主頁開始抓豆瓣的用戶資料。定制crawler用了兩個線程,一個線程負責抓頁面,一個線程負責把數(shù)據(jù)存到硬盤。不好用多個線程抓--豆瓣的 robots.txt即http://www.douban.com/robots.txt的指定抓取延遲不小于5秒,抓太快了會被禁掉的,這種情況下抓一個用戶要用6秒時間,一天能抓60/6*60*24=14400個,一個月能抓43萬個用戶,豆瓣注冊用戶有6000萬,需要139個機月,也就是139臺機器抓一個月。如果在云上租139臺機器,一個月的總成本大概是139*60=8340 塊,租一臺入門級的機器一個月60塊搞得定的,做抓取綽綽有余,只是要把crawler改成分布式的才行。每個用戶頁面大概60k左右,1G存儲1.7萬個用戶,6000萬用戶的容量不到4T。抓取線程要考慮主動注銷的用戶,存儲線程要考慮單個目錄的最大文件容量,默認每個目錄存1000個文件即可。定制 crawler用糙快猛的方式搞定的,大概500多行代碼。話說8千塊抓豆瓣的所有用戶資料不知道值不值,我覺得挺值的---應(yīng)該有很多好東西可以算出來的,隨隨便便搞出來賣分析報告也能值這個價啊,還可以賣給好幾家呢。如果要抓所有的用戶關(guān)系花時間要更多了---關(guān)注者是分頁的,想做類似 Facebook的graph search需要抓更多的頁面。
大概抓到5萬個用戶的時候,我就開始做計算了,用 htmlcleaner+jython處理頁面文件,最關(guān)鍵是找到ta們被多少人關(guān)注,被關(guān)注數(shù)表明它們的重要性。盡管5萬個用戶對6000萬個全部用戶來說太少了,還有有一些規(guī)律的---此前有一個關(guān)注榜,記錄的是關(guān)注在5000以上的豆瓣達人,它是2012年出來的,在這里http://site.douban.com/144692/widget/forum/7144906/discussion/44924707/,我的結(jié)果跟它有相當一部分的重合,可見盡管樣本數(shù)量少也是有效果的。