抖音爬虫实战:先爬取用户数据,再通过关注粉丝获sec_id抓视频

抓取抖音用户数据困难重重?别急,掌握方法就能轻松搞定!

抖音数据抓取难题

抓取抖音视频数据的关键在于获取用户的加密ID。然而,这个加密ID的生成机制就像笼罩在迷雾中,我们对其一无所知。但我们可以转换一下思路,发现这个加密ID在抖音用户数据包中是可见的,并且保持不变。这一发现为我们抓取数据带来了一线希望,只要我们采取恰当的方法,就能克服这一难题。

爬取用户数据策略

既然我们了解到加密ID位于用户数据包之中,因此我们便开始着手进行用户数据的抓取。通过分析用户的关注名单和粉丝名单,我们可以获取到其他用户的相关信息。例如,在抖音平台上,若有一个知名的博主,我们通过对其关注名单的爬取,能够识别出相关领域的潜在目标用户,进而逐步拓宽数据收集的领域。

请求地址分析

检查捕获到的数据包,可以观察到其中涉及的数据请求地址普遍含有“aweme”格式的链接。在屏幕右上角,我们可以看到发送的数据请求,而在右下角,则是接收到的响应数据。这情形就像我们发现了通向宝藏的明确标记,沿着这些地址追踪,便能够获取到所需的用户信息。

关注重点数据

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)

在爬取过程中,我们的关注点主要在于用户关注的列表,并以此为线索进行深入挖掘。对于用户的具体数据,我们并不十分关心,相比之下,我们更关注的是用户关注的列表以及他们的粉丝数据。通过分析用户关注的列表,我们可以洞察到用户的兴趣和偏好,这对我们分析用户的行为模式极为有益。

抓包软件分析

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: # 不重要,可以不要它

我们想要了解抓包软件捕获到的数据包的具体情况。依据已知的API,大多数数据都可以被构建出来,唯独那些加密的部分我们难以自行处理。然而,通过查看用户关注的列表,我们可以获取到相关用户的加密信息,这就像在拼图中找到了几块关键的碎片,这样一来,后续获取关联用户的数据就有了明确的方向。

请求头与响应数据处理

# 获取当前时间戳:
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={}" 

图片[1]-抖音爬虫实战:先爬取用户数据,再通过关注粉丝获sec_id抓视频-东山笔记

"&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=47xxxx747444&iid=18468xxx477740845" "&os_version=8.0.0&channel=wandoujia_aweme1&version_code=630" "&device_type=HUAWEI%20NXT-AL10&language=zh&resolution=1080*1812&openudid=b202a24ebxxx538a" "&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的部分。经过对抖音APK的反编译,我们已经成功实现了相应的生成算法,并且还提供了X的生成接口。响应数据采用json格式,处理过程中需要将其转换为json格式。其中,主要部分包含众多字段,而关注用户信息则位于引号之中。其他字段则用于实现翻页功能,每进行一次请求,即可返回20条数据。

在实际操作过程中,大家是否遭遇过妨碍数据获取速度的困境?若您觉得本文对您有所帮助,不妨点赞并转发给那些可能需要它的人。

# 重新构造请求头:
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)

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()

© 版权声明
THE END
喜欢就支持一下吧
分享