前言
爬取抖音用户的数据须要应用用户的 user_id 和 sec_user_id,咱们通过抓包工具获取用户的 id 以及 sec_user_id,而后通过用户的关注列表和 follow 列表获取更多的用户的 user_id 和 sec_user_id,上面我将介绍一下如何依据 user_id 和 sec_user_id 来获取抖音用户的具体数据。
一、剖析申请用户数据的 api
1. 用户数据抓包
首先在搭建好的环境中通过 Fiddle 抓取用户数据包。
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 | 咱也不晓得是啥,然而貌似没有用 |
- 申请的 api 剖析
咱们晓得了申请的 api 以及申请头外面都蕴含了哪些信息,咱们就能够通过手动结构对应的申请参数来爬取用户的数据了。我曾经在后面的文章获取到了 1W+ 的用户的uid 以及 sec_user_id 的数据了,而后咱们就能够通过这些数据来爬取用户的具体数据。
2.2. 响应信息剖析
二、获取用户数据
1. 结构申请 api
在文章《抖音爬虫教程,从 0 到 1,获取抖音用户数据》咱们曾经介绍了爬取抖音关注列表的 api 及其构造方法,其实获取用户详细信息和获取用户的关注列表的 api 基本一致,次要都是须要咱们自行填充用户的 user_id 以及用户的 sec_user_id 还有一大堆的工夫戳信息,其余的信息都是不变的。上面咱们结构获取用户详细信息的 api
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 就是不可用的。下图是申请头外面的次要信息:
上面我写了一个结构申请头的函数:
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)
三、总结
以上就是爬取用户信息的全部内容。码字不易,还请点赞关注,有任何问题请留言。
——————————————————————————————————————————
TiToData:业余的短视频、直播数据接口服务平台。
更多信息请分割:TiToData
笼罩支流平台:抖音,快手,小红书,TikTok,YouTube