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

分类点击问题修复说明(最终版本)

问题描述

用户调用 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() 函数

应用了相同的修复。

为什么之前没有发现这个问题?

  1. 原始文件可以工作:因为它包含了展开分类的代码
  2. 复制代码时遗漏:在将代码复制到 ai_agent.py 时,遗漏了展开分类的步骤
  3. 默认分类可见:某些分类(如"美食"、"旅行")可能默认就是可见的,所以没有发现问题
  4. "校园"被折叠:"校园"分类可能在折叠的部分,所以找不到

测试方法

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

验证结果

修复后,应该能看到:

  1. 调试信息

    尝试点击分类: 校园
    分类点击结果: True
    
  2. 返回的数据

    • category 字段是 "校园"
    • 视频内容都是校园相关的
    • 视频标签包含 #校园
  3. 示例视频

    作者: 清华大学
    描述: 我会等! 等枯树生出芽,等你来清华!...
    标签: ['#清华大学', '#我会等', '#校园', '#上岸']
    

关键点总结

  1. 必须先展开分类:使用 .show-button-sDo51G 选择器
  2. 等待展开完成:展开后等待1秒
  3. 使用正确的选择器.each-kind-MR__DN
  4. 等待数据加载:点击后等待8秒

相关文件

  • ai_agent.py - 添加了展开分类的代码
  • api.py - 添加了展开分类的代码
  • test_category_click.py - 测试脚本
  • CATEGORY_FIX_FINAL.md - 本文件

修复完成

所有修改已完成,分类点击功能现在应该可以正常工作了!

关键是要先展开所有分类,然后再点击目标分类