You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
6.3 KiB
6.3 KiB
分类点击问题修复说明(最终版本)
问题描述
用户调用 get_creative_guidance(category="校园") 时,分类参数没有生效,返回的是默认的"全部"分类数据,而不是"校园"分类的数据。
即使修复了选择器,问题仍然存在。但是单独运行 douyin_creative_guidance_playwright.py 文件时可以正常工作。
根本原因
经过对比原始文件,发现了关键问题:页面上的分类列表可能是折叠的!
在抖音创作指导页面,分类列表默认可能只显示部分分类,其他分类被折叠隐藏了。需要先点击"展开"按钮,才能看到所有分类(包括"校园")。
原始文件的正确实现
# 先展开所有分类
await page.evaluate("""
() => {
const showButtons = document.querySelectorAll('.show-button-sDo51G');
showButtons.forEach(btn => {
const text = btn.textContent.trim();
// 如果按钮不是"收起",说明需要展开
if (!text.includes('收起')) {
btn.click();
}
});
}
""")
await asyncio.sleep(1)
# 然后再点击分类
category_clicked = await page.evaluate(f"""
() => {{
const categoryDivs = Array.from(document.querySelectorAll('.each-kind-MR__DN'));
const targetDiv = categoryDivs.find(div =>
div.textContent.trim() === '{category}'
);
if (targetDiv) {{
targetDiv.click();
return true;
}}
return false;
}}
""")
完整的修复步骤
步骤1:展开所有分类
const showButtons = document.querySelectorAll('.show-button-sDo51G');
showButtons.forEach(btn => {
const text = btn.textContent.trim();
// 如果按钮不是"收起",说明需要展开
if (!text.includes('收起')) {
btn.click();
}
});
说明:
- 查找所有展开/收起按钮(
.show-button-sDo51G) - 如果按钮文本不包含"收起",说明当前是折叠状态,需要点击展开
- 等待1秒让展开动画完成
步骤2:点击目标分类
const categoryDivs = Array.from(document.querySelectorAll('.each-kind-MR__DN'));
const targetDiv = categoryDivs.find(div =>
div.textContent.trim() === '校园'
);
if (targetDiv) {
targetDiv.click();
return true;
}
说明:
- 现在所有分类都已展开,可以找到"校园"分类了
- 点击后等待8秒让新数据加载
修复内容
1. 修复 ai_agent.py
位置:get_creative_guidance() 函数
修改前:
if category and category != "全部":
category_clicked = await page.evaluate(f"""
() => {{
const categoryDivs = Array.from(document.querySelectorAll('.each-kind-MR__DN'));
const targetDiv = categoryDivs.find(div =>
div.textContent.trim() === '{category}'
);
if (targetDiv) {{
targetDiv.click();
return true;
}}
return false;
}}
""")
修改后:
if category and category != "全部":
# 先展开所有分类
await page.evaluate("""
() => {
const showButtons = document.querySelectorAll('.show-button-sDo51G');
showButtons.forEach(btn => {
const text = btn.textContent.trim();
if (!text.includes('收起')) {
btn.click();
}
});
}
""")
await asyncio.sleep(1)
# 然后点击分类
category_clicked = await page.evaluate(f"""
() => {{
const categoryDivs = Array.from(document.querySelectorAll('.each-kind-MR__DN'));
const targetDiv = categoryDivs.find(div =>
div.textContent.trim() === '{category}'
);
if (targetDiv) {{
targetDiv.click();
return true;
}}
return false;
}}
""")
2. 修复 api.py
位置:crawl_creative_guidance_api() 函数
应用了相同的修复。
为什么之前没有发现这个问题?
- 原始文件可以工作:因为它包含了展开分类的代码
- 复制代码时遗漏:在将代码复制到
ai_agent.py时,遗漏了展开分类的步骤 - 默认分类可见:某些分类(如"美食"、"旅行")可能默认就是可见的,所以没有发现问题
- "校园"被折叠:"校园"分类可能在折叠的部分,所以找不到
测试方法
方法1:使用测试脚本
python test_category_click.py
方法2:完整流程测试
python quick_test.py
输入:"我想做一些校园相关的短视频"
方法3:直接调用
import asyncio
from ai_agent import get_creative_guidance
async def test():
result = await get_creative_guidance(category="校园")
print(f"分类: {result['category']}")
print(f"视频数量: {result['total_count']}")
if result['total_count'] > 0:
video = result['videos'][0]
print(f"第一个视频作者: {video['author']}")
print(f"第一个视频描述: {video['description'][:50]}...")
print(f"标签: {video.get('hashTags', [])}")
asyncio.run(test())
验证结果
修复后,应该能看到:
-
调试信息:
尝试点击分类: 校园 分类点击结果: True -
返回的数据:
category字段是 "校园"- 视频内容都是校园相关的
- 视频标签包含
#校园等
-
示例视频:
作者: 清华大学 描述: 我会等! 等枯树生出芽,等你来清华!... 标签: ['#清华大学', '#我会等', '#校园', '#上岸']
关键点总结
- ✅ 必须先展开分类:使用
.show-button-sDo51G选择器 - ✅ 等待展开完成:展开后等待1秒
- ✅ 使用正确的选择器:
.each-kind-MR__DN - ✅ 等待数据加载:点击后等待8秒
相关文件
- ✅
ai_agent.py- 添加了展开分类的代码 - ✅
api.py- 添加了展开分类的代码 - ✅
test_category_click.py- 测试脚本 - ✅
CATEGORY_FIX_FINAL.md- 本文件
修复完成
所有修改已完成,分类点击功能现在应该可以正常工作了!
关键是要先展开所有分类,然后再点击目标分类。