爬取的思路
首先我們應該找到一個賬號,這個賬號被關注的人和關注的人都相對比較多的,就是下圖中金字塔頂端的人,然后通過爬取這個賬號的信息后,再爬取他關注的人和被關注的人的賬號信息,然后爬取被關注人的賬號信息和被關注信息的關注列表,爬取這些用戶的信息,通過這種遞歸的方式從而爬取整個知乎的所有的賬戶信息。整個過程通過下面兩個圖表示:
爬蟲分析過程
這里我們找的賬號地址是:https://www.zhihu.com/people/excited-vczh/answers
我們抓取的大V賬號的主要信息是:
其次我們要獲取這個賬號的關注列表和被關注列表
這里我們需要通過抓包分析如果獲取這些列表的信息以及用戶的個人信息內容
當我們查看他關注人的列表的時候我們可以看到他請求了如下圖中的地址,並且我們可以看到返回去的結果是一個json數據,而這里就存着一頁關乎的用戶信息。
上面雖然可以獲取單個用戶的個人信息,但是不是特別完整,這個時候我們獲取一個人的完整信息地址是當我們將鼠標放到用戶名字上面的時候,可以看到發送了一個請求:
我們可以看這個地址的返回結果可以知道,這個地址請求獲取的是用戶的詳細信息:
通過上面的分析我們知道了以下兩個地址:
獲取用戶關注列表的地址: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
獲取單個用戶詳細信息的地址:https://www.zhihu.com/api/v4/members/excited-vczh?include=locations%2Cemployments%2Cgender%2Ceducations%2Cbusiness%2Cvoteup_count%2Cthanked_Count%2Cfollower_count%2Cfollowing_count%2Ccover_url%2Cfollowing_topic_count%2Cfollowing_question_count%2Cfollowing_favlists_count%2Cfollowing_columns_count%2Cavatar_hue%2Canswer_count%2Carticles_count%2Cpins_count%2Cquestion_count%2Ccolumns_count%2Ccommercial_question_count%2Cfavorite_count%2Cfavorited_count%2Clogs_count%2Cmarked_answers_count%2Cmarked_answers_text%2Cmessage_thread_token%2Caccount_status%2Cis_active%2Cis_bind_phone%2Cis_force_renamed%2Cis_bind_sina%2Cis_privacy_protected%2Csina_weibo_url%2Csina_weibo_name%2Cshow_sina_weibo%2Cis_blocking%2Cis_blocked%2Cis_following%2Cis_followed%2Cmutual_followees_count%2Cvote_to_count%2Cvote_from_count%2Cthank_to_count%2Cthank_from_count%2Cthanked_count%2Cdescription%2Chosted_live_count%2Cparticipated_live_count%2Callow_message%2Cindustry_category%2Corg_name%2Corg_homepage%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics
這里我們可以從請求的這兩個地址里發現一個問題,關於用戶信息里的url_token其實就是獲取單個用戶詳細信息的一個憑證也是請求的一個重要參數,並且當我們點開關注人的的鏈接時發現請求的地址的唯一標識也是這個url_token
創建項目進行再次分析
通過命令創建項目
scrapy startproject zhihu_user
cd zhihu_user
scrapy genspider zhihu www.zhihu.com
直接通過scrapy crawl zhihu啟動爬蟲會看到如下錯誤:
這個問題其實是爬取網站的時候經常碰到的問題,大家以后見多了就知道是怎么回事了,是請求頭的問題,應該在請求頭中加User-Agent,在settings配置文件中有關於請求頭的配置默認是被注釋的,我們可以打開,並且加上User-Agent,如下:
關於如何獲取User-Agent,可以在抓包的請求頭中看到也可以在谷歌瀏覽里輸入:chrome://version/ 查看
這樣我們就可以正常通過代碼訪問到知乎了
然后我們可以改寫第一次的請求,這個我們前面的scrapy文章關於spiders的時候已經說過如何改寫start_request,我們讓第一次請求分別請求獲取用戶列表以及獲取用戶信息
這個時候我們再次啟動爬蟲
我們會看到是一個401錯誤,而解決的方法其實還是請求頭的問題,從這里我們也可以看出請求頭中包含的很多信息都會影響我們爬取這個網站的信息,所以當我們很多時候直接請求網站都無法訪問的時候就可以去看看請求頭,看看是不是請求頭的哪些信息導致了請求的結果,而這里則是因為如下圖所示的參數:
所以我們需要把這個參數同樣添加到請求頭中:
然后重新啟動爬蟲,這個時候我們已經可以獲取到正常的內容
到此基本的分析可以說是都分析好了,剩下的就是具體代碼的實現,在下一篇文張中寫具體的實現代碼內容!