Python爬蟲抓取知乎所有使用者資訊

青衫無名發表於2018-03-14

今天用遞迴寫了個抓取知乎所有使用者資訊的爬蟲,原始碼放在了github上,有興趣的同學可以上去下載一下看看,這裡介紹一下程式碼邏輯以及分頁分析,首先看網頁,這裡本人隨便選了一個大V作為入口,然後點開他的關注列表,如圖

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy

注意,本人爬蟲的全稱都是處於非登入狀態的。這裡的粉絲列表以及關注者列表都是後臺ajax請求得到的資料(沒有聽過ajax的童鞋別慌,ajax請求跟普通瀏覽器的請求沒有區別,它主要就是在我們 瀏覽網頁時候偷偷給伺服器傳送的請求,就是為了節省流量以及減少請求數,不然每次看點新資料都全部重新整理網頁,伺服器壓力很大的,所以有了這玩意),然後我們找到粉絲列表以及關注者列表的URL,這個很簡單,在chrome瀏覽器下面點選一下頁數切換就可以找到,如圖

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy

找到關注者以及粉絲的URL就好辦理,下面看一看這些資料,這裡以粉絲的資料舉例,如圖,是一段json

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

這裡找到了粉絲的資料,不過這裡不是使用者的詳細資訊,只有部分資料,不過他提供了一個token_url,我們就可以獲取這個ID訪問使用者的詳細資訊了,我們看看每個使用者的詳細資訊怎麼提取。這裡樓主發現,在觀看粉絲或者關注列表的時候,網頁是會自動觸發該使用者詳細資訊的請求,如圖

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

這次獲得的是使用者詳細資訊查詢的URL,這裡看一看這個詳細資訊的URL,如圖

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

上面介紹了網頁的基礎分析,下面說一下程式碼的思路,這次爬蟲用到了遞迴,本次用的scrapy抓取以及mogodb資料庫儲存的。
首先本人是用了一個大V作為爬蟲第一個網頁,然後分三步,第一步是爬了該大V的詳細資訊然後存入資料庫,第二步是爬取了該大V的粉絲,第三是爬取了該大V 的關注者(其實就是爬取粉絲或者關注者的token_url),完成之後,利用爬取的粉絲以及關注者的資料構造他們每個人詳細資訊的url,然後挖取詳細 資訊存入資料庫。到這裡遞迴第一步算是完成了,然後爬蟲會從每一個粉絲和關注者入手,分別爬取他們的粉絲以及關注者的詳細資料,不斷遞迴
在程式碼裡面還有加入了一些自動翻頁的功能,有興趣可以看看。下面是我們item裡面定義要抓取的資料:
import scrapyclass ZhihuUserItem(scrapy.Item):
 # define the fields for your item here like:
 # name = scrapy.Field()
 answer_count = scrapy.Field()

#回答數量
 articles_count = scrapy.Field()

#寫過的文章數
 follower_count = scrapy.Field()

#粉絲數量
 following_count = scrapy.Field()

#關注了多少人
 educations=scrapy.Field()

#教育背景
 description = scrapy.Field()

#個人描述
 locations = scrapy.Field()

#所在地
 url_token =scrapy.Field()

#知乎給予的每個人使用者主頁唯一的ID
 name=scrapy.Field()

#使用者暱稱
 employments = scrapy.Field()

#工作資訊
 business=scrapy.Field()

#一些工作或者商業資訊的合集
 user_type =scrapy.Field()

#使用者型別,可以是個人,也可以是團體等等
 headline =scrapy.Field()

#個人主頁的標籤
 voteup_count = scrapy.Field()

#獲得的贊數
 thanked_count=scrapy.Field()

#獲得的感謝數
 favorited_count = scrapy.Field()

#被收藏次數
 avatar_url = scrapy.Field()

#頭像URl

程式碼一共不足80行,執行了一分鐘就抓了知乎一千多個使用者的資訊,這裡上張結果圖

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy
最近忙完別的事了,終於可以天天寫爬蟲了,不知道大家這篇有什麼問題不,可以隨便向我提
最後提一提,爬取一定要偽裝好headers,裡面有些東西伺服器每次都會檢查。
原文釋出時間為:2017-04-09
本文作者:蝸牛仔
本文來自雲棲社群合作伙伴“Python中文社群”,瞭解相關資訊可以關注“Python中文社群”微信公眾號


相關文章