我用爬蟲一天時間「偷了」知乎一百萬用戶,只爲證實PHP是世界上最好的語言

【更新】:源碼在這裏:https://github.com/owner888/phpspiderphp

看了很多朋友圈裏推薦的Python爬蟲文章,都以爲過小兒科,處理內容原本就是PHP的強項,Python惟一的好處估計也就天生的Linux自帶,和Perl同樣,這點以爲挺不夠意思的Linux,仍是Mac厚道,天生就自帶了Python、Perl、PHP、Ruby,固然我也很討厭討論一門語言的好壞,每門語言存在就必定有它的道理,反正PHP是全世界最好用的語言,你們都懂的^_^python

前幾天比較火的是一我的用C#寫了一個多線程爬蟲程序,抓取了QQ空間3000萬QQ用戶,其中有300萬用戶是有QQ號、暱稱、空間名稱等信息的,也就是說,有詳情也就300萬,跑了兩週,這沒什麼,爲了證實PHP是全世界最好的語言,雖然你們都懂的^_^,我用PHP寫了一個多進程爬蟲程序,只用了一天時間,就抓了知乎100萬用戶,目前跑到第8圈(depth=8)互相有關聯(關注了和關注者)的用戶。git

爬蟲程序設計:github

由於知乎須要登陸才能獲取到關注者頁面,因此從chrome登陸以後把cookie拷貝下來給curl程序模擬登陸。golang

使用兩大獨立循環進程組(用戶索引進程組、用戶詳情進程組),用的是php的pcntl擴展,封裝了一個很是好用的類,使用起來和golang的攜程也差很少了。redis

下面是用戶詳情的截圖,用戶索引代碼相似chrome

這裏插個題外話,通過測試,個人8核的Macbook,跑16進程的速度最快,而16核的Linux服務器,竟然是跑8進程最快,這點有點讓我莫名其妙了,不過既然測試出最後進程數,就按照最後設置就好啦。數據庫

一、用戶索引進程組先以一個用戶爲起點,抓取這個用戶的關注了和關注者,而後合併入庫,由於是多進程,因此當有兩個進程在處理同一個用戶入庫的時候就會出現重複的用戶,因此數據庫用戶名字段必定要創建惟一索引,固然也能夠用redis這些第三方緩存來保證原子性,這個就見仁見智了。緩存

經過步驟一以後,咱們就獲得下面的用戶列表:服務器

二、用戶詳情進程組按照時間正序,拿到最早入庫的用戶抓取詳情,而且把更新時間更新爲當前時間,這樣就能夠變成一個死循環,程序能夠無休止的跑,不斷的循環更新用戶信息。

程序穩定運行到次日,忽然沒有新數據了,檢查了一下發現知乎改規則了,不知是爲了防我,仍是碰巧,反正給我返回的數據是這樣的

第一感受就是胡亂給我輸出數據讓我採集不到,換了IP、模擬假裝了些數據,都沒用,忽然感受這個很熟悉,會不會是gzip?抱着懷疑的態度,試了試gzip,首先固然是告訴知乎不要給我gzip壓縮過的數據

把 「Accept-Encoding: gzip,deflate\r\n」; 改爲 「Accept-Encoding:deflate\r\n」; 去掉了 gzip,然並卵!

看來知乎是強制要給我gzip壓縮數據了,既然如此,那我就解壓唄,查了一下php解壓gzip,發現就一個函數gzinflate,因而把獲取到得內容加上:

$content = substr($content, 10);

$content = gzinflate($content));

這裏我真想說,PHP真的是全世界最好的語言,就兩個函數,就完全解決了問題,程序又歡快的跑起來了。

在匹配內容的時候,知乎的細心也是給了我無數的幫助,例如我要分清用戶性別:

    

哈哈開玩笑的拉,實際上是樣式裏面有 icon-profile-female 和 icon-profile-male ^_^

我蛋疼的抓了它那麼多用戶,到底有什麼用呢?

其實沒什麼用,我就是閒的蛋疼 ^_^

有了這些信息,其實就能夠作一些別人開頭閉口就亂吹一通的大數據分析拉

最多見的固然是:

一、性別分佈

二、地域分佈

三、職業分佈

四、每一個職業的男女比例

固然,按照關注人數、瀏覽人數、提問數、回答數等排序,看看人民都在關注什麼,民生、社會、地理、政治,整個互聯網都一覽無餘拉。。

也許,你還能夠把頭像拿來分析,用開源的驗黃程序,把色情的篩選出來,而後去拯救東莞? ^_^

而後,你還能夠看看那些大學出來的人,最後都幹了什麼。

有了這些數據,是否是能夠打開腦洞 ^_^

下面是利用這些數據作出來的一些有趣的圖表,實時圖表數據能夠去 http://www.epooll.com/zhihu/ 上看

相關文章
相關標籤/搜索