我用爬蟲一天時間「偷了」知乎一百萬用戶php
只爲證實PHP是世界上最好的語言
看了很多朋友圈裏推薦的Python爬蟲文章, 都以爲過小兒科,處理內容原本就是PHP的強項,Python惟一的好處估計也就天生的Linux自帶,和Perl同樣,這點以爲挺不夠意思的 Linux,仍是Mac厚道,天生就自帶了Python、Perl、PHP、Ruby,固然我也很討厭討論一門語言的好壞,每門語言存在就必定有它的道 理,反正PHP是全世界最好用的語言,你們都懂的!java
前幾天比較火的是一我的,用C#寫了一個多線程爬蟲程序,抓取了QQ空間3000萬QQ用戶,其 中有300萬用戶是有QQ號、暱稱、空間名稱等信息的,也就是說,有詳情也就300萬,跑了兩週,這沒什麼,爲了證實PHP是全世界最好的語言,雖然你們 都懂的^_^,我用PHP寫了一個多進程爬蟲程序,只用了一天時間,就抓了知乎100萬用戶,目前跑到第8圈(depth=8)互相有關聯(關注了和關注 者)的用戶。golang
爬蟲程序設計redis
由於知乎須要登陸才能獲取到關注者頁面,因此從chrome登陸以後把cookie拷貝下來給curl程序模擬登陸。chrome
使用兩大獨立循環進程組(用戶索引進程組、用戶詳情進程組),用的是php的pcntl擴展,封裝了一個很是好用的類,使用起來和golang的攜程也差很少了。數據庫
下面是用戶詳情的截圖,用戶索引代碼相似緩存
這裏插個題外話,通過測試,個人8核的Macbook,跑16進程的速度最快,而16核的Linux服務器,竟然是跑8進程最快,這點有點讓我莫名其妙了,不過既然測試出最後進程數,就按照最後設置就好啦。服務器
一、 用戶索引進程組先以一個用戶爲起點,抓取這個用戶的關注了和關注者,而後合併入庫,由於是多進程,因此當有兩個進程在處理同一個用戶入庫的時候就會出現重 復的用戶,因此數據庫用戶名字段必定要創建惟一索引,固然也能夠用redis這些第三方緩存來保證原子性,這個就見仁見智了。微信
經過步驟一以後,咱們就獲得下面的用戶列表:cookie
二、用戶詳情進程組按照時間正序,拿到最早入庫的用戶抓取詳情,而且把更新時間更新爲當前時間,這樣就能夠變成一個死循環,程序能夠無休止的跑,不斷的循環更新用戶信息。
程序穩定運行到次日,忽然沒有新數據了,檢查了一下發現知乎改規則了,不知是爲了防我,仍是碰巧,反正給我返回的數據是這樣的
第一感受就是胡亂給我輸出數據讓我採集不到,換了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/ 上看
來源:楊澤濤
java學習 (ID: java4fun)(←長按複製)
專一於 Java 技術分享。
(複製微信號,搜索公衆號便可關注)
如何關注
一、將微信升級到最新版本,長按二維碼,選擇「識別圖中二維碼」便可關注。
二、若沒法識別二維碼,在微信界面「添加朋友」項進入「查找公衆號」,輸入「java學習」,亦可關注。
三、爲了你們能夠更好的交流java技術,能夠加入qq羣:432784980 「java學習」。
推薦文章:
《招聘一個靠譜的iOS》—參考答案(上)
點擊閱讀原文查看