我用爬蟲一天“偷了”一百萬用戶,只為證明PHP是最好的語言

pm45e 9年前發布 | 9K 次閱讀 爬蟲

看了不少朋友圈里推薦的 Python 爬蟲文章,都覺得太小兒科,處理內容本來就是 PHP 的強項,Python 唯一的好處估計也就天生的 Linux 自帶,和 Perl 一樣,這點覺得挺不夠意思的 Linux,還是 Mac 厚道,天生就自帶了 Python、Perl、PHP、Ruby,當然我也很討厭討論一門語言的好壞,每門語言存在就一定有它的道理,反正 PHP 是全世界最好用的語言,大家都懂的^_^

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

我用爬蟲一天“偷了”一百萬用戶,只為證明PHP是最好的語言

我用爬蟲一天“偷了”一百萬用戶,只為證明PHP是最好的語言

我用爬蟲一天“偷了”一百萬用戶,只為證明PHP是最好的語言

爬蟲程序設計:

因為知乎需要登錄才能獲取到關注者頁面,所以從 chrome 登錄之后把 cookie 拷貝下來給 curl 程序模擬登錄。

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

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

我用爬蟲一天“偷了”一百萬用戶,只為證明PHP是最好的語言

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

1、用戶索引進程組先以一個用戶為起點,抓取這個用戶的關注了和關注者,然后合并入庫,因為是多進程,所以當有兩個進程在處理同一個用戶入庫的 時候就會出現重復的用戶,所以數據庫用戶名字段一定要建立唯一索引,當然也可以用 redis 這些第三方緩存來保證原子性,這個就見仁見智了。

通過步驟一之后,我們就得到下面的用戶列表:

我用爬蟲一天“偷了”一百萬用戶,只為證明PHP是最好的語言

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

程序穩定運行到第二天,突然沒有新數據了,檢查了一下發現知乎改規則了,不知是為了防我,還是碰巧,反正給我返回的數據是這樣的

我用爬蟲一天“偷了”一百萬用戶,只為證明PHP是最好的語言

第一感覺就是胡亂給我輸出數據讓我采集不到,換了 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));

</blockquote>

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

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

我用爬蟲一天“偷了”一百萬用戶,只為證明PHP是最好的語言     我用爬蟲一天“偷了”一百萬用戶,只為證明PHP是最好的語言

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

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

其實沒什么用,我就是閑的蛋疼 ^_^

有了這些信息,其實就可以做一些別人開頭閉口就亂吹一通的大數據分析拉。

最常見的當然是:

1、性別分布

2、地域分布

3、職業分布

4、每個職業的男女比例

當然,按照關注人數、瀏覽人數、提問數、回答數等排序,看看人民都在關注什么,民生、社會、地理、政治,整個互聯網都盡收眼底拉。。

也許,你還可以把頭像拿來分析,用開源的驗黃程序,把色情的篩選出來,然后去拯救東莞?

然后,你還可以看看那些大學出來的人,最后都干了什么。

有了這些數據,是不是可以打開腦洞!

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

我用爬蟲一天“偷了”一百萬用戶,只為證明PHP是最好的語言

 本文由用戶 pm45e 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!