這兩天實在是被畢設(shè)折磨的夠嗆!哎,經(jīng)常在卡殼,寫一點,再卡殼,再寫一點的循環(huán)中慢慢前進。老崔死催著十號前交稿,真是焦頭爛額。今天就換換腦子,做一點好玩的事兒。干什么呢?來爬一爬人人網(wǎng)吧,看看能不能找出一些有意思的東西來。
人人網(wǎng)作為一個過氣的社交網(wǎng)站,其用戶數(shù)據(jù)還是比較可觀的。之所以選擇人人網(wǎng)的一個原因是,人人網(wǎng)不像QQ空間一樣中二:你可以禁止你的好友訪問你的空間。那么,開始吧!
由于人人網(wǎng)沒有類似于微博大廳的功能,所有的數(shù)據(jù)必須要登錄以后才能看到。我又不是什么黑客干壞事,光明正大的去,就登陸我自己的賬號。
由于不知道人人網(wǎng)這個登錄后臺是怎么做的,所以登陸的同時我們需要抓個包,看看HTTP頭里面帶了多少cookie。在這里筆者用的抓包軟件是wireshark。

真是巧,第12個數(shù)據(jù)包就是登錄包。右鍵看一下完整的通信記錄。

由于不知道這一大串cookie中具體是哪一個或哪幾個做登錄驗證用,就干脆把這些cookie全部拷貝到程序中去。至于下面的那一串POST方式提交的數(shù)據(jù)就不用管了。

接著,我們觀察一下人人網(wǎng)的個人界面吧,看看有沒有我們感興趣的信息。隨意找一個好友的主頁登陸進去,我們可以發(fā)現(xiàn)人人網(wǎng)可以查看任意好友的全部好友信息。如下圖,我選取了我人人好友中的一個公眾號“交大有思”來舉例子。

通過瀏覽器右鍵查看網(wǎng)頁源代碼我們可以發(fā)現(xiàn)網(wǎng)頁中并沒有這些好友信息的靜態(tài)信息,說明這些好友信息一定是通過網(wǎng)頁上的腳本代碼動態(tài)獲取的。怎么證實呢?我們還是來抓個包吧。通常這種異步獲取信息的腳本代碼都是通過調(diào)用網(wǎng)站后臺的某個api來實現(xiàn)的,有些不注重用戶隱私的公司就直接把這些信息在網(wǎng)絡(luò)上明文傳送。像這種api通常都會有一個比較通俗易懂的名字,例如getfriendslist這種。

果然,在第443個數(shù)據(jù)包中找到了一個疑似的。從命名上看這太像我們所要找的那個接口了。我們右鍵看一下完整的通信記錄,來確認一下我們的猜想。

服務(wù)器針對這個接口調(diào)用返回的數(shù)據(jù)是一堆亂碼。但是光憑這一堆亂碼我們也能看得出來,人人網(wǎng)的這個接口的數(shù)據(jù)是完全沒有加密的,之所以出現(xiàn)亂碼是因為編碼格式的錯誤。這并不是什么大問題,通常用瀏覽器調(diào)用一次就能夠解決。我們仔細觀察了這個接口所需要的參數(shù)以后直接用瀏覽器調(diào)用看看結(jié)果。在這里筆者調(diào)用接口打印自己好留列表的前20個好友的基本信息。

如上圖,人人網(wǎng)果然是這樣一種節(jié)奏:所有的用戶信息完全不加密,赤身裸體地在網(wǎng)絡(luò)上飛奔,而且還是這么格式良好的json數(shù)據(jù),真是呵呵呵!這個接口的調(diào)用很簡單,只用傳入人人網(wǎng)的ID,數(shù)據(jù)的分頁信息和一些登錄驗證信息就可以了。接下來,我們用python程序來調(diào)用這個接口試試看,還是調(diào)用接口打印我自己的全部人人好友。

如圖,整個接口調(diào)用成功,json數(shù)據(jù)解析成功。該函數(shù)通過傳入用戶的ID值可以打印出這個用戶全部的好友基本信息,為了保護隱私筆者將用戶ID數(shù)據(jù)全部隱去了。仔細觀察一下這些用戶基本數(shù)據(jù)吧,上面除了一些不知所云的字段以外還有一些很有意思的信息。

這些信息中包含了用戶的大頭像圖片地址,小頭像圖片地址,真實的姓名,與查詢用戶是否為好友關(guān)系,基礎(chǔ)的學(xué)校地區(qū)信息等等。一些牛掰的黑客僅僅依靠這些基礎(chǔ)的數(shù)據(jù)完全就可以完成一次社會工程學(xué)實踐,這對個人信息保護來說是一個很大的安全隱患。OK,接下來我們來驗證一下著名的“六度分割”理論吧,這理論是說在現(xiàn)代社會,不論兩個人物理上相隔多遠,都可以通過至多六個人建立聯(lián)系。今天,我們就來遍歷一下我們?nèi)亢糜训暮糜?,看一下這個人際關(guān)系樹僅僅深入到第二層能達到多大的規(guī)模。在編程上,我們使用遞歸。使用一個集合來存儲所有遍歷到的用戶信息。由于集合的特殊性質(zhì):集合不能存儲兩個相同的數(shù)據(jù)。因此我們就避免了重復(fù)統(tǒng)計一個人信息的問題。實驗的結(jié)果非常驚人,僅僅是筆者人人網(wǎng)好友圈的71個好友的所有好友就達到了12726人,幾乎是以指數(shù)2的級別向上增長。

都到這兒了就再進一步吧,通過csv文件將所有的這些用戶信息保存下來,并且將筆者71個好友的全部好友的用戶頭像都保存下來。


接下來,我們還可以遍歷所有好友的相冊。人人網(wǎng)在這里又為爬蟲提供了非常好的便利機會。不但用戶的相冊信息在網(wǎng)頁上靜態(tài)寫明,毫無加密,而且還是便于解析的json格式。以下是筆者公眾號好友“交大有思”的全部相冊信息:

獲取了這些信息后只用解析json數(shù)據(jù),然后就可以對相冊中的相片進行下載了。噗~,寫到這筆者就不打算繼續(xù)下去了。這次的博客就到這兒吧!以后看到好玩的網(wǎng)站還是會用爬蟲爬一爬。