首先咱們應該找到一個帳號,這個帳號被關注的人和關注的人都相對比較多的,就是下圖中金字塔頂端的人,而後經過爬取這個帳號的信息後,再爬取他關注的人和被關注的人的帳號信息,而後爬取被關注人的帳號信息和被關注信息的關注列表,爬取這些用戶的信息,經過這種遞歸的方式從而爬取整個知乎的全部的帳戶信息。整個過程經過下面兩個圖表示:chrome
這裏咱們找的帳號地址是:https://www.zhihu.com/people/excited-vczh/answers
咱們抓取的大V帳號的主要信息是:json
其次咱們要獲取這個帳號的關注列表和被關注列表api
這裏咱們須要經過抓包分析若是獲取這些列表的信息以及用戶的我的信息內容
當咱們查看他關注人的列表的時候咱們能夠看到他請求了以下圖中的地址,而且咱們能夠看到返回去的結果是一個json數據,而這裏就存着一頁關乎的用戶信息。scrapy
上面雖然能夠獲取單個用戶的我的信息,可是不是特別完整,這個時候咱們獲取一我的的完整信息地址是當咱們將鼠標放到用戶名字上面的時候,能夠看到發送了一個請求:ide
咱們能夠看這個地址的返回結果能夠知道,這個地址請求獲取的是用戶的詳細信息:網站
經過上面的分析咱們知道了如下兩個地址:
獲取用戶關注列表的地址: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=20url
獲取單個用戶詳細信息的地址: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.topicsspa
這裏咱們能夠從請求的這兩個地址裏發現一個問題,關於用戶信息裏的url_token其實就是獲取單個用戶詳細信息的一個憑證也是請求的一個重要參數,而且當咱們點開關注人的的連接時發現請求的地址的惟一標識也是這個url_token3d
經過命令建立項目
scrapy startproject zhihu_user
cd zhihu_user
scrapy genspider zhihu www.zhihu.comblog
直接經過scrapy crawl zhihu啓動爬蟲會看到以下錯誤:
這個問題實際上是爬取網站的時候常常碰到的問題,你們之後見多了就知道是怎麼回事了,是請求頭的問題,應該在請求頭中加User-Agent,在settings配置文件中有關於請求頭的配置默認是被註釋的,咱們能夠打開,而且加上User-Agent,以下:
關於如何獲取User-Agent,能夠在抓包的請求頭中看到也能夠在谷歌瀏覽裏輸入:chrome://version/ 查看
這樣咱們就能夠正常經過代碼訪問到知乎了
而後咱們能夠改寫第一次的請求,這個咱們前面的scrapy文章關於spiders的時候已經說過如何改寫start_request,咱們讓第一次請求分別請求獲取用戶列表以及獲取用戶信息
這個時候咱們再次啓動爬蟲
咱們會看到是一個401錯誤,而解決的方法其實仍是請求頭的問題,從這裏咱們也能夠看出請求頭中包含的不少信息都會影響咱們爬取這個網站的信息,因此當咱們不少時候直接請求網站都沒法訪問的時候就能夠去看看請求頭,看看是否是請求頭的哪些信息致使了請求的結果,而這裏則是由於以下圖所示的參數:
因此咱們須要把這個參數一樣添加到請求頭中:
而後從新啓動爬蟲,這個時候咱們已經能夠獲取到正常的內容
到此基本的分析能夠說是都分析好了,剩下的就是具體代碼的實現,在下一篇文張中寫具體的實現代碼內容!