抖音爬蟲教程,從0到1,爬取抖音用戶詳細數據
前言
爬取抖音用戶的數據須要使用用戶的user_id和sec_user_id,咱們經過抓包工具獲取用戶的id以及sec_user_id,而後經過用戶的關注列表和follow列表獲取更多的用戶的user_id和sec_user_id,下面我將介紹一下如何根據user_id和sec_user_id來獲取抖音用戶的詳細數據。python
1、分析請求用戶數據的api
1. 用戶數據抓包
首先在搭建好的環境中經過Fiddle抓取用戶數據包。<br/><br/>android
2. 用戶數據包分析
2.1. 請求信息分析
-
請求頭字段 | 字段 | 字段值 | | --- | --- | | 請求方法 | GET | | 請求的api | GET後面的 | | 請求的協議 | api後面的,系http1.1 | | 請求的目的主機域名 | aweme-eagle.snssdk.com | | 鏈接信息 | keep-alive | | Cookie | 你本身的cookies | | Accept-Encoding 編碼信息 | gzip | | X-SS-QUERIES | 請求的query | | token | 你本身的token | | sdk版本 | 1 | | User-Agent | 用戶代理 | | X-Khronos | 咱也不知道是啥,可是本質上就是個時間戳 | | X-Gorgon | 加密驗證的部分 | | X-Pods | 咱也不知道是啥,可是貌似沒有用 |json
-
請求的api分析api
<br/>咱們知道了請求的api以及請求頭裏面都包含了哪些信息,咱們就能夠經過手動構造對應的請求參數來爬取用戶的數據了。我已經在前面的文章獲取到了1W+ 的用戶的uid以及sec_user_id的數據了,而後咱們就能夠經過這些數據來爬取用戶的詳細數據。cookie
2.2. 響應信息分析
<br/><br/><br/>網絡
2、獲取用戶數據
1.構造請求api
在文章《抖音爬蟲教程,從0到1,獲取抖音用戶數據》 咱們已經介紹了爬取抖音關注列表的api及其構造方法,其實獲取用戶詳細信息和獲取用戶的關注列表的api基本一致,主要都是須要咱們自行填充用戶的user_id以及用戶的sec_user_id還有一大堆的時間戳信息,其餘的信息都是不變的。下面咱們構造獲取用戶詳細信息的api<br/>app
def construct_api(user_id, _rticket, ts, sec_user_id): """ api 構造函數 :param user_id: 用戶的id :param _rticket: 時間戳 :param ts: 時間戳 :param sec_user_id: 用戶的加密的id :return: api """ api = "https://aweme-eagle.snssdk.com" \ "/aweme/v1/user/?" \ "user_id={}" \ "&retry_type=no_retry" \ "&iid=1846815477740845" \ "&device_id=47012747444" \ "&ac=wifi&channel=wandoujia_aweme1" \ "&aid=1128&app_name=aweme" \ "&version_code=630" \ "&version_name=6.3.0" \ "&device_platform=android" \ "&ssmix=a&device_type=HUAWEI+NXT-AL10" \ "&device_brand=HUAWEI&language=zh" \ "&os_api=26&os_version=8.0.0" \ "&openudid=b202a24eb8c1538a" \ "&manifest_version_code=630" \ "&resolution=1080*1812" \ "&dpi=480&update_version_code=6302" \ "&_rticket={}" \ "&js_sdk_version=1.16.3.5" \ "&ts={}" \ "&sec_user_id={}" \ "".format(user_id, _rticket, ts, sec_user_id) return api
2.構造請求頭
上文咱們已經分析了請求頭,請求頭的構造也比較方便,大部份內容都是固定的,須要咱們填充的主要仍是幾個時間戳以及對應的X-Gorgon,其中X-Gorgon的構造方法比較複雜,可是要注意填入正確的Cookie和Token你才能得到可用的X-Gorgon,不然你的Gorgon就是不可用的。下圖是請求頭裏面的主要信息:<br/><br/>下面我寫了一個構造請求頭的函數:函數
def construct_header(user_id, sec_user_id, cookie, query, token, user_agent, _rticket, ts): """ 構造請求頭,須要傳入的參數以下 :param user_id: 要爬取的用戶的uid :param sec_user_id: 要爬取的用戶的加密的id :param cookie: cookie :param query: 請求的query :param token: 你的token :param user_agent: 請求的user_agent :param _rticket: 時間戳(毫秒級) :param ts: 時間戳(秒級) :return: 構造好的請求頭:headers """ api = construct_api(user_id, _rticket, ts, sec_user_id) headers = { "Host": "aweme-eagle.snssdk.com", "Connection": "keep-alive", "Cookie": cookie, "Accept-Encoding": "gzip", "X-SS-QUERIES": query, "X-SS-REQ-TICKET": _rticket, "X-Tt-Token": token, "sdk-version": "1", "User-Agent": user_agent } x_gorgon = get_gorgon(api, cookie, token, query) headers["X-Khronos"] = ts headers["X-Gorgon"] = x_gorgon print(headers) return headers def get_gorgon(url, cookies, token, query): """ 獲取headers裏面的X-Gorgon :param url: 請求的api :param cookies: 你的cookie :param token: 你的token :param query: 你的query :return: gorgon """ # 發起請求獲取X-Gorgon headers = { "dou-url": url, # 填寫對應的請求的api "dou-cookies": cookies, # 填寫你的cookies "dou-token": token, # 填寫你的token "dou-queries": query # 填寫你的請求的queries } gorgon_host = "http://8.131.59.252:8080" res = requests.get(gorgon_host, headers=headers) gorgon = "" if res.status_code == 200: print("請求成功") res_gorgon = json.loads(res.text) if res_gorgon.get("status") == 0: print("成功獲取 X-Gorgon") print(res_gorgon.get("X-gorgon")) # 你就能夠用來爬數據了 gorgon = res_gorgon.get("X-gorgon") else: print("獲取 X-Gorgon 失敗") print(res_gorgon.get("reason")) raise ValueError(res_gorgon.get("reason")) else: print("請求發送錯誤/多是你的網絡錯誤,也多是個人錯誤,可是大機率是你那邊的錯誤") raise ValueError("請求發送錯誤/多是你的網絡錯誤,也多是個人錯誤,可是大機率是你那邊的錯誤") return gorgon
3. 請求頭弄好了咱們就能夠獲取用戶數據了
def get_user_detail_info(cookie, query, token, user_agent, user_id, sec_user_id): """ 爬取用戶數據 :param cookie: 你本身的cookie :param query: 你本身的query :param token: 你本身的token :param user_agent: 你本身的User-Agent :param user_id: 用戶的uid :param sec_user_id: 用戶的加密的uid :return: response """ _rticket = str(time.time() * 1000).split(".")[0] ts = str(time.time()).split(".")[0] api = construct_api(user_id, _rticket, ts, sec_user_id) headers = construct_header(user_id, sec_user_id, cookie, query, token, user_agent, _rticket, ts) print(api) req = request.Request(api) for key in headers: req.add_header(key, headers[key]) with request.urlopen(req) as f: data = f.read() return gzip.decompress(data).decode()
4. 解析用戶數據
根據上面對響應數據的分析,其對應的響應數據是json格式的,並且數據特別多,分析了一下,我找了一些對我比較有用的數據:工具
# 用戶的抖音號 unique_id=345345345O # 用戶的user_id uid=103600654544 # 用戶的 sec_user_id sec_uid=MS4wLjABAAAA2_HUlxau0riJ8UBMwyd_bUtA8yzKdWepfg9nUc5wQy0 # 頭像地址 avatar_uri=26e880003aefb8cddd496 # 用戶的暱稱 nickname=成都潮人榜 # 用戶的簽名 signature=謝謝關注❤ # 用戶的出生日期 birthday=1995-01-01 # 用戶的國家 country=中國 # 用戶的省份 province=四川 # 用戶的城市 city=成都 # 用戶所在的區域 district=武侯 # 用戶的粉絲數 follower_count=929219 # 用戶的關注數 following_count=15 # 發佈的抖音數量 aweme_count=453 # 發佈的動態數量 dongtai_count=480 # 用戶點讚的視頻數 favoriting_count=322 # 總共被點讚的次數 total_favorited=14900700
5. 下面就能夠爬取數據了
if __name__ == '__main__': cookie = "" # 你本身的cookie token = "" # 你本身的token query = "" # 你本身的query user_agent = "" # 你本身的user-agent user_id = 103600654544 sec_user_id = "MS4wLjABAAAA2_HUlxau0riJ8UBMwyd_bUtA8yzKdWepfg9nUc5wQy0" res = get_user_detail_info(cookie,query, token, user_agent, user_id, sec_user_id) print(res)
3、總結
以上就是爬取用戶信息的所有內容。碼字不易,還請點贊關注,有任何問題請留言。<br/> <br/>——————————————————————————————————————————ui
TiToData:專業的短視頻、直播數據接口服務平臺。
更多信息請聯繫: TiToData
覆蓋主流平臺:抖音,快手,小紅書,TikTok,YouTube
——————————————————————————————————————————
TiToData:專業的短視頻、直播數據接口服務平臺。
更多信息請聯繫: TiToData
覆蓋主流平臺:抖音,快手,小紅書,TikTok,YouTube