1. 程式人生 > >我用爬蟲一天時間“偷了”知乎一百萬使用者,只為證明PHP是世界上最好的語言

我用爬蟲一天時間“偷了”知乎一百萬使用者,只為證明PHP是世界上最好的語言

看了不少朋友圈裡推薦的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)互相有關聯(關注了和關注者)的使用者。

爬蟲程式設計:

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

使用兩大獨立迴圈程序組(使用者索引程序組、使用者詳情程序組),用的是php的pcntl擴充套件,封裝了一個非常好用的類,使用起來和golang的攜程也差不多了。

下面是使用者詳情的截圖,使用者索引程式碼類似

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

1、使用者索引程序組先以一個使用者為起點,抓取這個使用者的關注了和關注者,然後合併入庫,因為是多程序,所以當有兩個程序在處理同一個使用者入庫的時候就會出 現重複的使用者,所以資料庫使用者名稱欄位一定要建立唯一索引,當然也可以用redis這些第三方快取來保證原子性,這個就見仁見智了。

通過步驟一之後,我們就得到下面的使用者列表:

2、使用者詳情程序組按照時間正序,拿到最先入庫的使用者抓取詳情,並且把更新時間更新為當前時間,這樣就可以變成一個死迴圈,程式可以無休止的跑,不斷的迴圈更新使用者資訊。

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

第一感覺就是胡亂給我輸出資料讓我採集不到,換了IP、模擬偽裝了些資料,都沒用,突然感覺這個很熟悉,會不會是gzip?抱著懷疑的態度,試了試gzip,首先當然是告訴知乎不要給我gzip壓縮過的資料

把 "Accept-Encoding: gzip,deflate\r\n"; 去掉,然並卵!

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

$content = substr($content, 10);

$content = gzinflate($content));

當然還可以用curl自帶的:

curl_setopt( self::$ch, CURLOPT_ENCODING, 'gzip' );

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

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

   

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

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

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

有了這些資訊,其實就可以做一些別人開頭閉口就亂吹一通的大資料分析拉

最常見的當然是:

1、性別分佈

2、地域分佈

3、職業分佈,來自那個公司

4、每個職業的男女比例

5、大家一般在什麼時候上知乎?發問題、關注問題,那些問題值得關注

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

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

然後,你還可以看看那些大學出來的人,最後都幹了什麼。

有了這些資料,是不是可以開啟腦洞 ^_^

http://developer.51cto.com/art/201509/491336.htm

相關推薦

爬蟲時間百萬使用者證明PHP世界最好語言

看了不少朋友圈裡推薦的Python爬蟲文章,都覺得太小兒科,處理內容本來就是PHP的強項,Python唯一的好處估計也就天生的Linux自帶, 和Perl一樣,這點覺得挺不夠意思的Linux,還是Mac厚道,天生就自帶了Python、Perl、PHP、Ruby,當然我也很討厭

200 萬資料圖說程式設計師都喜歡去哪兒工作

點選上方“CSDN”,選擇“置頂公眾號” 關鍵時刻,第一時間送達! 因為最近和朋友吃飯,大家都到了大三季,都在糾結自己該以哪裡作為自己職業發展的起點?也想看看自己的背景,能不能找到靠譜的師哥師

android:怎樣時間寫出“飛機大戰”這種遊戲!(無框架-SurfaceView繪制)

col ride raw ech tro cti 開發人員 contex epo 序言作為一個android開發人員,時常想開發一個小遊戲娛樂一下大家,今天就說說,我是怎麽樣一天寫出一個簡單的“飛機大戰”的.體驗地址:http://www.wandoujia.com/ap

戶群分析--又雙叒叕爬蟲20萬

-c spider nor ember tps 數值 don thumb 分享 一直想趁著知乎還比較開放爬點數據做分析,因為懶延期至今。 爬蟲由Java實現,放在服務器上跑了三四天,可以說是龜速了,畢竟爬蟲和反爬蟲就是應該友好相處的嘛,反反爬蟲和反反反爬蟲互相傷害就沒意思了

Python給自己手機寫個人臉識別!拉開普通手機識別萬倍!

    本文首先會介紹人臉識別模型的內部工作原理。隨後結合一個簡單的案例,我們將通過Python進行案例實踐。在本文的最後部分,你將完成你的第一個人臉識別模型! 目錄 理解人臉識別的工作原理 案例學習 Python應用 理解Py

時間入門python爬蟲直接寫一個爬蟲案例分享出來很簡單

經過兩天的摸索,終於寫出了一個小小小爬蟲。我的電腦是沒有配置python環境的,所以首先要上官網下載python的環境檔案。   點選點頭指向的按鈕,下載到桌面,它是一個這樣的檔案“python-3.6.5.exe”,下載成功後直接點選安裝,安裝成功後,那接下來就是配置環境變數啦。 &

python多程序跑程式花費的時間縮短4倍

應用場景:本人需要對200萬條網頁html格式資料進行清洗,提取文字後將分詞結果寫入資料庫,之前做了一次,大概花費了80多個小時才跑完。機器配置是4核,記憶體8G;開完會領導讓再改點東西重新跑一遍,然後說用多程序或者多執行緒跑,速度快。 本人接觸python不到兩個月,以前也基本不怎麼程式設計,所以這種優化

為什麼有些人時間獲得你十年的工作經驗?

有這麼一個笑話,一個人跑去問老闆“我都有十年工作經驗了,問什麼您還不給我漲薪水呢?”老闆說 “你是有十年工作經驗呢,還是把一年工作經驗用了十年呢?”。 有這麼一個笑話,一個人跑去問老闆“我都有十年工作經驗了,問什麼您還不給我漲薪水呢?”老闆說 “你是有十年工作

時間學習 sass, less, stylus的基本語法和簡單使用, 談談感受.

列表 stylus 單點 blank 明顯 一點 css 自動編譯 數據 花了兩天時間學習了 sass, less, stylus的基本語法和簡單使用, 談談感受. 1. 變量的問題 1.1變量的表示 sass有個$var, [email protected]/

MySql 求時間範圍內的每小時分鐘

pda join 月份 nbsp 獲取 pan 關聯 orm now() 平常經常會求一段時間內的每一天統計數據,或者每一時點的統計數據。但是mysql本身是沒有直接獲取時點列表的函數或表。下面是自己用到的一些方法,利用臨時變量和一個已存在的比較多數據(這個需要根據實際情況

金屬蝕刻片做一個飛行器 導致的手指不能解鎖手機

戰鬥 選擇 baidu 勇敢 戰鬥機 組織 不能 href aik X翼戰鬥機是源自《星球大戰》系列的虛構星際戰鬥機,是一種由英康公司制造的戰鬥機,它在銀河內戰中首次登入戰場,在抵抗組織和“第一秩序”的爭鬥中它是抵抗組織(Resistance)星際戰鬥機部隊主力。 “英康公

獲取下時間

eg1: Date date = new Date(); Calendar calendar = new GregorianCalendar(); calendar.setTime(date); calendar.add(Calendar.DATE, 1); date = calenda

爬蟲爬下來91P**N七萬多條視訊發現...

今天開個車,帶大家通過資料認識下91P**n(以下簡稱91)這個網站。 之前一個假期學習了Python爬蟲,於是拿91試試手,發現91非常容易爬取,獲取頁面時只要使用cookies即可,於是果斷按照“收藏最多”排行榜爬下來全站77000條視訊,注意到網站上的視訊每天都是增長的,現在已經78000+了,我們忽

mysql 查詢當前月 第一/最後 時間

當月 第一天: select date_add(date_add(last_day(now()),interval 1 day),interval -1 month); 當月最後一天: select last_day(NOW()); 應用:查詢當月的 建立 使用者

【keep_moving_cqu的專欄】每天晚上疲勞的睡在床才感覺真真切切地過了一天。人生最重要的不僅是努力還有方向。壓力不是有人比你努力而是比你牛叉幾倍的人依然比你努力。即使看不到希望也依然相信自己錯不了,自己選的人生錯不

每天晚上疲勞的睡在床上時,才感覺真真切切地過了一天。人生最重要的不僅是努力,還有方向。壓力不是有人比你努力,而是比你牛叉幾倍的人依然比你努力。即使看不到希望,也依然相信,自己錯不了,自己選的人生錯不了...

眼睛就過去眼睛閉不睜一輩子就過去哼。

Android執行緒間通訊機制 當android應用程式執行時,一個主執行緒被建立(也稱作UI執行緒),此執行緒主要負責處理UI相關的事件,由於Android採用UI單執行緒模型,所以只能在主執行緒中對UI元素進行操作,如果在非UI執行緒直接對UI進行了操作,則

Asp.net C# 獲取本週上週本月上月本年上年第一最後時間大全

專案中用到了,所以就寫全了,供參考使用。 DateTime dt=DateTime.Now; int weeknow = Convert.ToInt32(DateTime.Now.DayOfWeek); int dayspan = (-1) * weeknow + 1; D

程式設計師剛入職就辭職原因讓人很無語:因為不加班!

提起程式設計師這個職業,大家回想到哪些?有些人會說老實人可靠;有些人說工資高,待遇好;有些人還會想到“加班”等等。在很多人眼裡,“加班”似乎是程式設計師的標配,不加班的程式設計師都是“假程式設計師”。無獨有偶,有一名網友就講述了自己公司所經歷的事情,她好不容易才招到一個程式設計師,結果就上了一天班就

程式設計師們都遇到過什麼樣的奇葩需求?客戶:給你時間

在我們程式設計師的職業生涯中,會遇見各種各樣的需求。會遇見合理的需求,也會遇見不合理的需求,你大概也沒有辦法猜到下一個需求會有多奇葩。 有這麼一個話題在知乎上引發了網友們的熱議“身為程式設計師碰到最奇葩的需求是怎樣的?”,今天我們就來討論一下遇見的那些奇葩需求吧~ “我自己是

從騰訊那“”3000萬QQ使用者資料份很有趣的獨家報告!

感謝部落格園! 轉載請註明部落格園地址,及作者[email protected]。     這是我近期使用C#寫的一個QQ空間蜘蛛網爬蟲程式。程式斷斷續續的運行了兩週,目前總共爬了3000萬QQ資料,其中有300萬包含使用者(QQ號,暱稱,空間名稱,頭像,最新