由於最終目的是要抓取抖音視頻數據,而經過抓包發現請求抖音的視頻數據都須要對應用戶的sec_id,這個加密的id的生成過程咱們是不知道的,可是咱們能夠從抖音用戶的數據包中看到對應的sec_id,並且這個加密的id不會變的,因此我能夠先爬取用戶的數據,但經過用戶的關注列表以及粉絲列表獲取其餘用戶的sec_id,知道了用戶的數據,咱們就能夠爬取用戶的視頻數據了。這一篇文章我將介紹抖音用戶數據爬取。python
若是你已經配置好環境(手機上安裝好了抖音app而且抓包軟件等也都配置好了),就能夠開心食用下文,不然請查看環境配置而後再繼續本文。
android
打開抖音,進入抖音發佈者我的頁面:(點擊右方發佈者頭像進入發佈者我的頁面)
這個時候咱們查看fiddle抓到的包,咱們發現對應的數據的請求地址都是包含「aweme」樣式的url,fiddle右上角就是咱們的請求數據,右下角就是對應的響應數據:
由於個人爬取思路是根據用戶的關注列表爬取關注列表的關注列表,因此我不太關注用戶自己的數據,我更感興趣的是用戶的關注列表數據以及粉絲數據,那怎麼看用戶的關注列表呢?
這樣咱們就能夠看到用戶的關注列表了,那麼對應的抓包軟件抓到的包是什麼呢:
從圖中咱們能夠看到follower就是用戶的粉絲數據,following就是用戶關注的用戶。對應的請求頭和響應數據以下圖所示:
json
咱們首先分析請求數據:
請求數據包括對應的url(也就是api),對應的header數據,其中headers裏面有Host、Connection、Cookie、Accept-Encoding、X-SS-QUERIES、X-SS-REQ-TICKET、X-Tt-Token、sdk-version、User-Agent、X-Khronos、X-Gorgon、X-Podsapi
api = "https://api.amemv.com/aweme/v1/user/follower/list/?" \ # url "user_id={}" \ # user_id 能夠在用戶關注列表中搞到 "&max_time={}" \ # 當前時間戳 "&count=20&offset=0&source_type=1&address_book_access=2&gps_access=2" \ # 不重要 "&ts={}" \ # 當前時間戳 "&js_sdk_version=1.16.3.5&app_type=normal&manifest_version_code=630" \ # 不重要 "&_rticket={}" \ # 當前時間戳 "&ac=wifi&device_id=47012747444&iid=1846815477740845" \ # 不重要 "&os_version=8.0.0&channel=wandoujia_aweme1&version_code=630" \ # 不重要 "&device_type=HUAWEI%20NXT-AL10&language=zh&resolution=1080*1812&openudid=b202a24eb8c1538a" \ # 不重要 "&update_version_code=6302&app_name=aweme&version_name=6.3.0&os_api=26&device_brand=HUAWEI&ssmix=a" \ # 不重要 "&device_platform=android&dpi=480&aid=1128" \ # 不重要 "&sec_user_id={}"\ # 加密的uid 能夠在用戶關注列表中搞到 ".format(user_id, max_time, ts, _rticket, sec_user_id)
根據上面的api,咱們發現大部分的數據咱們是能夠構造的,只有user_id以及加密的sec_user_id咱們沒法本身構造,可是咱們能夠經過用戶的關注列表中獲取到它關注的全部的用戶的user_id和sec_user_id,因此咱們只須要知道一個用戶的user_id和sec_user_id,咱們就能夠獲取和他關聯的用戶以及和他關聯的用戶的用戶的user_id和sec_user_id。cookie
Host: api.amemv.com # 對應的host 不變 Connection: keep-alive # 不變,不重要 Cookie: "cookies" # 重要,不變,你本身的cookie,能夠在fiddle中看到 Accept-Encoding: gzip # 不變 X-SS-REQ-TICKET: 1606999477776 # 當前的時間戳,咱們能夠本身構造 X-Tt-Token: 003ea17385e4...23bbe199e41467-1.0.0 # 你本身的token,重要,不變,能夠在fiddle中看到 sdk-version: 1 # 不變 User-Agent: com.ss.a....0.2991.0) # 重要,你本身的ua,能夠在fiddle中看到 X-Khronos: 1606999477 # 當前時間戳 X-Gorgon: 03006cc00000d7464322a76ab998c12eef987b81af552788dabd # 重要,我後面會講怎麼獲取 X-Pods: # 不重要,能夠不要它
經過分析請求頭,咱們發現大部分數據是不變的,並且咱們均可以經過Fiddle得到,惟一不能得到的或者說會發生改變的是:X-Gorgon,經過反編譯抖音APK,咱們發現它是根據請求的url和cookies和token等生成的。
這裏貼一下對應的請求X-Gorgon的代碼:
假設咱們已經知道了咱們本身的cookies和token以及咱們請求的url那麼咱們能夠獲取到對應的X-Gorgon:app
# 獲取當前時間戳: ts = str(time.time()).split(".")[0] _rticket = str(time.time() * 1000).split(".")[0] max_time = ts user_id = "96244072243" sec_user_id = "MS4wLjABAAAAtk0pVzYt82o_R5jUjN4FEpRlautyPFGSgioxrH-jfvg" # 下面填寫你本身的cookies和token cookies = "你本身的cookies" token = "你本身的token" # 構造請求的url url= "https://api.amemv.com/aweme/v1/user/follower/list/?" \ "user_id={}" \ "&max_time={}" \ "&count=20&offset=0&source_type=1&address_book_access=2&gps_access=2" \ "&ts={}" \ "&js_sdk_version=1.16.3.5&app_type=normal&manifest_version_code=630" \ "&_rticket={}" \ "&ac=wifi&device_id=47012747444&iid=1846815477740845" \ "&os_version=8.0.0&channel=wandoujia_aweme1&version_code=630" \ "&device_type=HUAWEI%20NXT-AL10&language=zh&resolution=1080*1812&openudid=b202a24eb8c1538a" \ "&update_version_code=6302&app_name=aweme&version_name=6.3.0&os_api=26&device_brand=HUAWEI&ssmix=a" \ "&device_platform=android&dpi=480&aid=1128" \ "&sec_user_id={}".format(user_id, max_time, ts, _rticket, sec_user_id) # 發起請求獲取X-Gorgon headers = { "dou-url": url, # 填寫對應的請求的api "dou-cookies": cookies, # 填寫你的cookies "dou-token": token, # 填寫你的token "dou-queries": "" # 填寫你的請求的queries(沒有的話,就填空置:「」) } res = requests.get("http://8.131.59.252:8080", headers=headers) if res.status_code==200: res_gorgon = json.loads(res.text) if res_gorgon.get("status") == 0: gorgon = res_gorgon.get("X-gorgon") else: print("param error when get gorgon") return else: print("request error when get gorgon") return print("gorgon: " + gorgon) # 這就是你的gorgon了
# 從新構造請求頭: headers = { "Host": "api.amemv.com", "Connection": "keep-alive", "Cookie": cookies, # 你本身的Cookies "Accept-Encoding": "gzip", "X-SS-REQ-TICKET": _rticket, # 當前時間戳,上面的代碼片已經生成了 "X-Tt-Token": "0095a45e5cc.....c42c97e37d7350", # 你本身的token "sdk-version": "1", "User-Agent": "你本身的user-agent", "X-Khronos": ts, # 當前時間戳,上面的代碼片已經生成了 "X-Gorgon": gorgon # X-gorgon,上面的代碼片已經生成了 } # 發起請求 result = doGetGzip(url, headers) # 這是我本身寫的函數,在下面的代碼片中 print(result)
def doGetGzip(url, headers): req = request.Request(url) for key in headers: req.add_header(key, headers[key]) with request.urlopen(req) as f: data = f.read() return gzip.decompress(data).decode()
響應的數據的格式是json的,因此通常咱們都將響應的數據轉換成json進行處理,經過fiddle抓包咱們能夠看到響應數據主要包括下面幾個部分,而關注的用戶的信息都在「followers」裏面。其餘的字段主要用於翻頁,由於一次請求只返回20條數據,響應數據的其餘字段:has_more 表示的是是否是有更的數據,max_time就是下一頁數據的遊標,咱們主要關注follower裏的數據。
下面咱們能夠看到followers裏面有20條數據,每一條數據裏面就是一個用戶的信息
下面就是具體的每個用戶的字段:
用戶字段有不少,大多數對我來講都沒有用,我只關注user_id 和 對應的 sec_uid,固然若是能夠看本身的需求獲取更多的數據,從上圖咱們發現咱們能夠獲取到,所以個人目的就達到了,這樣我就能夠把它們存下來,下面再經過它倆請求這個用戶關注的用戶的這兩個信息,下一篇文章我將主要介紹一下如何爬取視頻信息。
以上就是獲取抖音用戶的所有內容了,後面我會具體講解怎麼抓取視頻數據等,碼字不易,還請點贊關注,有任何問題請留言。
函數
——————————————————————————————————————————ui
覆蓋主流平臺:抖音,快手,小紅書,TikTok,YouTube加密