抖音爬虫教程,从0到1,爬取抖音用户详细数据
前言
爬取抖音用户的数据需要使用用户的user_id和sec_user_id,我们通过抓包工具获取用户的id以及sec_user_id,然后通过用户的关注列表和follow列表获取更多的用户的user_id和sec_user_id,下面我将介绍一下如何根据user_id和sec_user_id来获取抖音用户的详细数据。
一、分析请求用户数据的api
1. 用户数据抓包
首先在搭建好的环境中通过Fiddle抓取用户数据包。<br/><br/>
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分析
<br/>我们知道了请求的api以及请求头里面都包含了哪些信息,我们就可以通过手动构造对应的请求参数来爬取用户的数据了。我已经在前面的文章获取到了1W+ 的用户的uid以及sec_user_id的数据了,然后我们就可以通过这些数据来爬取用户的详细数据。
2.2. 响应信息分析
<br/><br/><br/>
二、获取用户数据
1.构造请求api
在文章《抖音爬虫教程,从0到1,获取抖音用户数据》 我们已经介绍了爬取抖音关注列表的api及其构造方法,其实获取用户详细信息和获取用户的关注列表的api基本一致,主要都是需要我们自行填充用户的user_id以及用户的sec_user_id还有一大堆的时间戳信息,其他的信息都是不变的。下面我们构造获取用户详细信息的api<br/>
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)
三、总结
以上就是爬取用户信息的全部内容。码字不易,还请点赞关注,有任何问题请留言。<br/> <br/>——————————————————————————————————————————
TiToData:专业的短视频、直播数据接口服务平台。
更多信息请联系: TiToData
覆盖主流平台:抖音,快手,小红书,TikTok,YouTube
——————————————————————————————————————————
TiToData:专业的短视频、直播数据接口服务平台。
更多信息请联系: TiToData
覆盖主流平台:抖音,快手,小红书,TikTok,YouTube
来源:oschina
链接:https://my.oschina.net/u/2293598/blog/4780607