抖音爬虫教程,从0到1,获取抖音用户数据
前言
因为最终目的是要抓取抖音视频数据,而通过抓包发现请求抖音的视频数据都需要对应用户的sec_id,这个加密的id的生成过程我们是不知道的,但是我们可以从抖音用户的数据包中看到对应的sec_id,而且这个加密的id不会变的,所以我可以先爬取用户的数据,但通过用户的关注列表以及粉丝列表获取其他用户的sec_id,知道了用户的数据,我们就可以爬取用户的视频数据了。这一篇文章我将介绍抖音用户数据爬取。
一、分析用户请求包
如果你已经配置好环境(手机上安装好了抖音app并且抓包软件等也都配置好了),就可以开心食用下文,否则请查看环境配置然后再继续本文。
1. 分析用户数据
打开抖音,进入抖音发布者个人页面:(点击右方发布者头像进入发布者个人页面)
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的代码:
假设我们已经知道了我们自己的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里的数据。
以上就是获取抖音用户的全部内容了,后面我会具体讲解怎么抓取视频数据等,码字不易,还请点赞关注,有任何问题请留言。
——————————————————————————————————————————
TiToData:专业的短视频、直播数据接口服务平台。
更多信息请联系: TiToData
覆盖主流平台:抖音,快手,小红书,TikTok,YouTube