相關文章:
抖音 x-gorgon 03 免費生成接口
抖音爬蟲從0到1-第一彈:環境配置
抖音爬蟲從0到1-第二彈:獲取抖音用戶數據
前言
因為最終目的是要抓取抖音視頻數據,而通過抓包發現請求抖音的視頻數據都需要對應用戶的sec_id,這個加密的id的生成過程我們是不知道的,但是我們可以從抖音用戶的數據包中看到對應的sec_id,而且這個加密的id不會變的,所以我可以先爬取用戶的數據,但通過用戶的關注列表以及粉絲列表獲取其他用戶的sec_id,知道了用戶的數據,我們就可以爬取用戶的視頻數據了。這一篇文章我將介紹抖音用戶數據爬取。 如果實踐過程中有任何問題,請關注公共號:kedalongkeai 留言,我會統一解答。一、分析用戶請求包
如果你已經配置好環境(手機上安裝好了抖音app並且抓包軟件等也都配置好了),就可以開心食用下文,否則請查看環境配置然后再繼續本文。
1. 分析用戶數據
打開抖音,進入抖音發布者個人頁面:(點擊右方發布者頭像進入發布者個人頁面)
這個時候我們查看fiddle抓到的包,我們發現對應的數據的請求地址都是包含“aweme”樣式的url,fiddle右上角就是我們的請求數據,右下角就是對應的響應數據:
因為我的爬取思路是根據用戶的關注列表爬取關注列表的關注列表,所以我不太關注用戶本身的數據,我更感興趣的是用戶的關注列表數據以及粉絲數據,那怎么看用戶的關注列表呢?
這樣我們就可以看到用戶的關注列表了,那么對應的抓包軟件抓到的包是什么呢:
從圖中我們可以看到follower就是用戶的粉絲數據,following就是用戶關注的用戶。對應的請求頭和響應數據如下圖所示:
1.1. 請求頭分析
我們首先分析請求數據:
請求數據包括對應的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-Pods
- 我們首先介紹對應的url
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。
- 下面我們分析對應的請求頭:
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生成接口,大家可以免費獲取,但是注意請求格式:具體請參考文章:抖音 x-gorgon 03 免費生成接口
這里貼一下對應的請求X-Gorgon的代碼:
假設我們已經知道了我們自己的cookies和token以及我們請求的url那么我們可以獲取到對應的X-Gorgon:
# 獲取當前時間戳:
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了
- 通過獲取的X-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)
- doGetGzip 函數
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()
2. 分析響應數據獲取用戶數據
2.1. 響應數據格式:
響應的數據的格式是json的,所以一般我們都將響應的數據轉換成json進行處理,通過fiddle抓包我們可以看到響應數據主要包括下面幾個部分,而關注的用戶的信息都在“followers”里面。其他的字段主要用於翻頁,因為一次請求只返回20條數據,響應數據的其他字段:has_more 表示的是是不是有更的數據,max_time就是下一頁數據的游標,我們主要關注follower里的數據。
下面我們可以看到followers里面有20條數據,每一條數據里面就是一個用戶的信息
下面就是具體的每一個用戶的字段:
用戶字段有很多,大多數對我來說都沒有用,我只關注user_id 和 對應的 sec_uid,當然如果可以看自己的需求獲取更多的數據,從上圖我們發現我們可以獲取到,因此我的目的就達到了,這樣我就可以把它們存下來,下面再通過它倆請求這個用戶關注的用戶的這兩個信息,下一篇文章我將主要介紹一下如何爬取視頻信息。
last but not least
有任何問題,或者想要獲取對應的抖音APK和抓包軟件或者相關代碼,可以關注下方公眾號留言,我會及時傾盡所有問您解答
last and least
如果文章對你有用並且恰好您也手頭富裕,可以考慮捐贈一毛錢,我可以升級服務器。