抖音抓取不全的max_pages及cookies设置

0725版本在抓取少量作者页面内容时没有问题,待抓取某290个作品的主页时出现403报错,且仅呈现145个作品。

这其中包含两个问题:403报错是因为关键cookie缺失;未呈现全部作品则因为max_pages原来仅设置为8,就是翻8页,大概也就是145个作品。

先解决403报错的问题

403 错误通常意味着:

  1. Cookies 过期关键 Cookie 缺失(如 ttwidmsToken
  2. 请求签名失效(X-Bogus 或 a-bogus 未正确生成)
  3. 请求频率过高触发了风控

🔧 解决方案

1. 更新 Cookies(最重要)

从浏览器重新获取完整的 Cookie 字符串,特别是确保以下关键字段存在且有效:

  • ttwid
  • msToken
  • odin_tt
  • passport_csrf_token

在 Chrome 中按 F12ApplicationCookieshttps://www.douyin.com,逐个检查这些字段是否存在。

image-20260813072129955

复制所有 Cookie:在 Cookie 列表上方有一个过滤框,旁边有导出按钮;或者使用控制台输入(在输入此命令前,可能需要先输入allow pasting才能允许粘贴命令):

1
document.cookie

image-20260813072902482

手动编辑 config.yml,将 document.cookie 输出的内容按格式填入

根据运行提示,Cookies中始终缺少msToken,这个字段极其关键——它是抖音 Web 端 API 的签名令牌,没有它几乎所有请求都会被拒绝。

而且,msToken 不是存储在 document.cookie 中的,它是通过 JavaScript 动态生成并存储在 localStorage 中的。

对于 msToken,可以用控制台生成(随机字符串法,可临时使用):

1
2
// 在抖音页面控制台执行
Array.from({length: 128}, () => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'[Math.floor(Math.random() * 62)]).join('')

image-20260813073949254

获取真实 msToken 的方法:

在抖音页面控制台执行:

1
2
// 查看 localStorage 中的真实 msToken
console.log(localStorage.getItem('xmst'));

image-20260813081616527

如果返回 null,说明还没有生成。访问几个抖音页面后,它会自动生成。

再来修改config.yml文件(默认如下所示):

image-20260813074108837

config.yml 文件存在严重的格式错误!YAML 对缩进和引号非常敏感。当前格式会导致解析失败。

🔧 修复后的正确 config.yml

用以下内容完全替换你的 config.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cookies:
msToken:
ttwid: ""
odin_tt: ""
sessionid: ""
sid_guard: ""
passport_csrf_token: e5b5da2ed961d334febc661cc02d4acf
passport_csrf_token_default: e5b5da2ed961d334febc661cc02d4acf
passport_assist_user: Cj15iSR8_CDtGWCQDhgElxh0HoMtNYCFcFZgXjSk5w6N652p55qW9PZkkvJFTQflGkoKPAAAAAAAAAAAAABQoIRcCVHdvXj7zo5oSTs8bm9tbPyQCrpUJnRxEg6hjGSeyVAjNfoKw2twxCoi5YOGImv1lQgASIBA_BKAMQ==
passport_auth_mix_state: n8czfm5yyr9go3oobjtluxp6jx3
csrf_session_id: 3b8ccf27723245112a64531e
UIFID: 5bdad390e71fd6e6e69e3cafe6018169c2447c8bc0b8484cc0f203a274f99fdb4c654015b3b027e971be47a1f52f45a1bb09a670545fbd657b115a37cccc4f6e777c72c15460f5eaba2fb86a3de99f2ddf708914a3c588cbba3a4b8ea44c8dcb17f033f84c1944d6ce6bb220b78a5e0d50256396277c2a9cc103c0c9fc66d54c44172e7172535e5c64a94f1ef0197e9287df4a0d8
s_v_web_id: verify_msnu8xqt_VmKAOeqw_5uASGu90gMC0rxS
__ac_nonce: 06a7bc59263339a
__ac_signature: _02B4Z6wo00f01C9W.Uf8BmC.AvfAGGy71

path: "D:\\Douzy Downloaded"
video: true
music: false
cover: false
mode:
- single
number:
single: 1

文件中缺少以下关键字段(它们都是 httpOnly 的,需要从浏览器手动获取):

  1. 打开 Chrome,进入抖音并登录
  2. F12ApplicationCookieshttps://www.douyin.com
  3. 逐一双击复制以下字段的 Value
字段 必须 说明
ttwid ✅ 必须 设备标识
odin_tt ✅ 必须 用户标识
sessionid ✅ 必须 会话ID
sid_guard 推荐 会话保护

将复制的值填入上面 config.yml 的对应位置(替换空引号 ""

在 YAML 中,字符串值无论是否带引号,效果是一样的。

1
2
3
4
# 以下三种写法完全等价:
ttwid: abc123
ttwid: "abc123"
ttwid: 'abc123'

📋 YAML 中引号的规则

情况 是否需要引号 示例
纯数字和字母 ❌ 不需要 ttwid: abc123
包含特殊字符(如 %/: ✅ 需要 odin_tt: "abc%2Fdef"
以数字开头 ✅ 需要 sessionid: "123abc"
包含空格 ✅ 需要 name: "hello world"

🔧 如何快速填充 config.yml

最简单的方法:用浏览器开发者工具复制

  1. 打开 Chrome,进入抖音并登录
  2. F12Application(应用程序)→ Cookieshttps://www.douyin.com
  3. 在 Cookie 列表中,逐一双击以下字段的 Value 列,复制值
字段 是否必须 如何获取
msToken ✅ 必须 从 Cookie 列表复制,或在控制台执行特殊命令
ttwid ✅ 必须 从 Cookie 列表复制
odin_tt ✅ 必须 从 Cookie 列表复制
sessionid ✅ 必须 从 Cookie 列表复制
sid_guard 推荐 从 Cookie 列表复制
passport_csrf_token ✅ 必须 从 Cookie 列表复制
passport_csrf_token_default 可选 同上
passport_assist_user 可选 同上
passport_auth_mix_state 可选 同上
csrf_session_id 可选 同上
UIFID 可选 同上
s_v_web_id 可选 同上
__ac_nonce 可选 同上
__ac_signature 可选 同上

核心必须项:msTokenttwidodin_ttsessionidpassport_csrf_token


🚀 最快填充方法

在抖音页面的控制台(F12 → Console)执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 一次性复制所有关键 Cookie 为 JSON 格式
var keys = ['ttwid', 'odin_tt', 'sessionid', 'sid_guard', 'passport_csrf_token',
'passport_csrf_token_default', 'passport_assist_user',
'passport_auth_mix_state', 'csrf_session_id', 'UIFID',
's_v_web_id', '__ac_nonce', '__ac_signature'];
var result = {};
document.cookie.split(';').forEach(function(c) {
var parts = c.trim().split('=');
if (parts.length >= 2 && keys.indexOf(parts[0]) !== -1) {
result[parts[0]] = parts.slice(1).join('=');
}
});
console.log(JSON.stringify(result, null, 2));

执行后会输出一个 JSON 格式的关键 Cookie 列表,你可以复制这些值填入 config.yml

注意:尽管如上修改了config.yml文件的内容格式,运行程序后仍会变成如上图的原始格式,但没关系,运行正常,该填的参数都已经开始运作。

2. 增加延迟、减少页数

修改 __init__ 中的反风控参数:

1
2
3
4
# 在 __init__ 中修改
self.min_delay = 2.0 # 从 1.5 改为 2.0
self.max_delay = 5.0 # 从 3.5 改为 5.0
self.max_pages = 5 # 从 8 改为 5

此为反风控措施,实际上为了解决翻页和作者主页全部作品显示的问题,还要反过来增加这个数值。

3. 添加重试间隔

fetch_tab_data 的异常处理中增加更长的等待:

1
2
3
4
5
6
7
8
except Exception as e:
self.log(f" ⚠️ 获取第{page_index}页数据时出错: {e}\n")
# 403 错误时等待更长时间
if "403" in str(e) or "status=403" in str(e):
wait_time = random.uniform(10, 20)
self.log(f" ⏳ 遇到 403,等待 {wait_time:.0f} 秒后重试...\n")
time.sleep(wait_time)
break

4. 检查 config.yml 中是否有 proxy

如果有代理可用,添加:

1
proxy: "http://127.0.0.1:7890"

再来解决多作品同时抓取(翻页)的问题

🔧 可能的原因和解决方案

max_pages 太小

你的设置是 max_pages = 5,每页约 18 条,最多获取 90 条。如果作者有 150 个作品,就会少 60 条。

解决: 临时增大 max_pages(注意风控):

1
self.max_pages = 10  # 从 5 改为 10,实际上为了下载完整的290个作品,改成了16

增大翻页限制并改进翻页逻辑

__init__ 中修改:

1
2
3
4
# 反风控参数
self.min_delay = 2.5
self.max_delay = 5.5
self.max_pages = 16 # 从 5 改为 15,290个作品需要约 16 页

仍在0725基础上进行修改,完美解决上述两个问题!