爬取的思路

首先我們應(yīng)該找到一個賬號,這個賬號被關(guān)注的人和關(guān)注的人都相對比較多的,就是下圖中金字塔頂端的人,然后通過爬取這個賬號的信息后,再爬取他關(guān)注的人和被關(guān)注的人的賬號信息,然后爬取被關(guān)注人的賬號信息和被關(guān)注信息的關(guān)注列表,爬取這些用戶的信息,通過這種遞歸的方式從而爬取整個知乎的所有的賬戶信息。整個過程通過下面兩個圖表示:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

爬蟲分析過程

這里我們找的賬號地址是:https://www.zhihu.com/people/excited-vczh/answers
我們抓取的大V賬號的主要信息是:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

其次我們要獲取這個賬號的關(guān)注列表和被關(guān)注列表

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

這里我們需要通過抓包分析如果獲取這些列表的信息以及用戶的個人信息內(nèi)容
當(dāng)我們查看他關(guān)注人的列表的時候我們可以看到他請求了如下圖中的地址,并且我們可以看到返回去的結(jié)果是一個json數(shù)據(jù),而這里就存著一頁關(guān)乎的用戶信息。

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

 

上面雖然可以獲取單個用戶的個人信息,但是不是特別完整,這個時候我們獲取一個人的完整信息地址是當(dāng)我們將鼠標(biāo)放到用戶名字上面的時候,可以看到發(fā)送了一個請求:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

我們可以看這個地址的返回結(jié)果可以知道,這個地址請求獲取的是用戶的詳細(xì)信息:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

通過上面的分析我們知道了以下兩個地址:
獲取用戶關(guān)注列表的地址:https://www.zhihu.com/api/v4/members/excited-vczh/followees?include=data%5B*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset=0&limit=20

獲取單個用戶詳細(xì)信息的地址:https://www.zhihu.com/api/v4/members/cheng-cheng-78-35?include=allow_message%2Cis_followed%2Cis_following%2Cis_org%2Cis_blocking%2Cemployments%2Canswer_count%2Cfollower_count%2Carticles_count%2Cgender%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics

這里我們可以從請求的這兩個地址里發(fā)現(xiàn)一個問題,關(guān)于用戶信息里的url_token其實就是獲取單個用戶詳細(xì)信息的一個憑證也是請求的一個重要參數(shù),并且當(dāng)我們點開關(guān)注人的的鏈接時發(fā)現(xiàn)請求的地址的唯一標(biāo)識也是這個url_token

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

 

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

創(chuàng)建項目進(jìn)行再次分析

通過命令創(chuàng)建項目
scrapy startproject zhihu_user
cd zhihu_user
scrapy genspider zhihu www.zhihu.com

直接通過scrapy crawl zhihu啟動爬蟲會看到如下錯誤:

 iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

這個問題其實是爬取網(wǎng)站的時候經(jīng)常碰到的問題,大家以后見多了就知道是怎么回事了,是請求頭的問題,應(yīng)該在請求頭中加User-Agent,在settings配置文件中有關(guān)于請求頭的配置默認(rèn)是被注釋的,我們可以打開,并且加上User-Agent,如下:iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

關(guān)于如何獲取User-Agent,可以在抓包的請求頭中看到也可以在谷歌瀏覽里輸入:chrome://version/ 查看
這樣我們就可以正常通過代碼訪問到知乎了
然后我們可以改寫第一次的請求,這個我們前面的scrapy文章關(guān)于spiders的時候已經(jīng)說過如何改寫start_request,我們讓第一次請求分別請求獲取用戶列表以及獲取用戶信息

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

這個時候我們再次啟動爬蟲

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

我們會看到是一個401錯誤,而解決的方法其實還是請求頭的問題,從這里我們也可以看出請求頭中包含的很多信息都會影響我們爬取這個網(wǎng)站的信息,所以當(dāng)我們很多時候直接請求網(wǎng)站都無法訪問的時候就可以去看看請求頭,看看是不是請求頭的哪些信息導(dǎo)致了請求的結(jié)果,而這里則是因為如下圖所示的參數(shù):

 iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

所以我們需要把這個參數(shù)同樣添加到請求頭中:

 iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

 

然后重新啟動爬蟲,這個時候我們已經(jīng)可以獲取到正常的內(nèi)容

到此基本的分析可以說是都分析好了,剩下的就是具體代碼的實現(xiàn),在下一篇文張中寫具體的實現(xiàn)代碼內(nèi)容!

http://www.cnblogs.com/zhaof/p/7215617.html