引言

最近华为云开启了CodeArts Doer代码智能体体验官活动:https://developer.huaweicloud.com/signup/78745481cafb4d79bf62096f6770c72e?channelCode=hcdg

我最近对AI编程非常感兴趣,自然要参加测试一下。在日常工作和学习中,我们经常需要获取百度搜索结果并进行分析。我们测试的目标就是如何开发一个Python应用,用于获取百度智能体搜索结果的前十条,让我们看看华为这个代码智能体的表现如何。

CodeArts Doer代码智能体简介

CodeArts Doer代码智能体是一款集AI IDE、Code Agent、代码大模型为一体的智能编码产品,它面向项目级代码生成、代码续写、研发知识问答、单元测试用例生成、代码解释、代码注释、代码调试、代码翻译、代码检查、代码优化等场景,依据开发者输入的需求描述,准确且高效地生成高质量代码, 如同开发者身边的专属技术顾问。它和字节的TRAE、阿里千问的Qoder、腾讯的Code Buddy是同类型产品。

点击前面的链接完成报名后,访问链接免费开通服务,然后下载安装,参照官网帮助文档(内含最佳实践)或收录进案例中心的实操案例,就可以使用了。我测试的是VSCode插件版本,模型采用的是默认的质谱GLM。

体验过程

直接代码生成

CodeArts Doer的安装和使用过程和TRAE差不多,所以使用时没有感觉到什么困难。我故意给了一个非常简短的提示词,想看看工具是否能够正确处理:

生成一个python应用,访问百度的智能体搜索结果的前十条

CodeArts Doer开始生成代码:

它生成的这个代码方案是一个经典的requests+BeautifulSoup爬虫的方法,应该是很多Python教程上用的方法,不过这个方法已经不太能用了,因为百度加了反爬虫机制。这个方法的基本思路:

1. 构造百度搜索URL

2. 添加HTTP请求头模拟浏览器访问

3. 发送GET请求获取HTML内容

4. 使用BeautifulSoup解析HTML

5. 提取搜索结果的标题、链接和描述

创建`baidu_ai_search.py`文件:

import requests
from bs4 import BeautifulSoup
import json
import time
import random

def fetch_baidu_ai_search(query, max_results=10):
    """
    Fetch search results from Baidu's search

    Args:
        query (str): Search query
        max_results (int): Maximum number of results to return (default: 10)

    Returns:
        list: List of search result dictionaries
    """
    # Baidu search URL
    url = "https://www.baidu.com/s"

    # Headers to mimic a real browser
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1'
    }

    # Parameters for the search request
    params = {
        'wd': query,
        'rn': str(max_results),
        'ie': 'utf-8',
        'oe': 'utf-8'
    }

    try:
        # Add random delay to avoid being blocked
        time.sleep(random.uniform(1, 3))

        # Send GET request
        response = requests.get(url, headers=headers, params=params, timeout=10)
        response.raise_for_status()

        # Parse the HTML content
        soup = BeautifulSoup(response.text, 'html.parser')

        # Extract search results
        results = []

        # Find all result containers
        result_containers = soup.find_all('div', class_='result')

        for idx, container in enumerate(result_containers[:max_results], 1):
            try:
                # Extract title and link
                title_tag = container.find('h3')
                if not title_tag:
                    continue

                link_tag = title_tag.find('a')
                if link_tag:
                    title = link_tag.get_text(strip=True)
                    link = link_tag.get('href', '')
                else:
                    title = title_tag.get_text(strip=True)
                    link = ''

                # Extract description/snippet
                snippet_tag = container.find('div', class_='c-abstract') or \
                             container.find('div', class_='c-span-last') or \
                             container.find('div', class_='content')

                snippet = snippet_tag.get_text(strip=True) if snippet_tag else ''

                # Add to results
                results.append({
                    'rank': idx,
                    'title': title,
                    'link': link,
                    'snippet': snippet
                })

            except Exception as e:
                print(f"Error parsing result {idx}: {e}")
                continue

        return results

    except requests.exceptions.RequestException as e:
        print(f"Error fetching search results: {e}")
        return []
    except Exception as e:
        print(f"Unexpected error: {e}")
        return []


def display_results(results):
    """
    Display search results in a formatted way

    Args:
        results (list): List of search result dictionaries
    """
    if not results:
        print("No results found.")
        return

    print(f"\n{'='*80}")
    print(f"Found {len(results)} results:")
    print(f"{'='*80}\n")

    for result in results:
        print(f"[{result['rank']}] {result['title']}")
        print(f"    URL: {result['link']}")
        print(f"    {result['snippet']}\n")
        print("-" * 80 + "\n")


def main():
    """
    Main function to run the Baidu search application
    """
    print("Baidu Search - Top 10 Results")
    print("=" * 50)

    # Get search query from user
    query = input("\nEnter your search query: ").strip()

    if not query:
        print("Please enter a search query.")
        return

    # Fetch results
    print(f"\nSearching for: {query}")
    print("Please wait...")

    results = fetch_baidu_ai_search(query, max_results=10)

    # Display results
    display_results(results)

    # Optional: Save results to JSON file
    if results:
        save_option = input("\nSave results to JSON file? (y/n): ").strip().lower()
        if save_option == 'y':
            filename = f"baidu_search_results_{int(time.time())}.json"
            with open(filename, 'w', encoding='utf-8') as f:
                json.dump(results, f, ensure_ascii=False, indent=2)
            print(f"Results saved to: {filename}")


if __name__ == "__main__":
    main()

代码调试

运行程序并搜索"智能体":

python baidu_ai_search.py

输入搜索词:智能体,程序运行后输出:

Baidu AI Agent Search - Top 10 Results

==================================================

Enter your search query: 智能体

Searching for: 智能体

Please wait...

No results found.

显然程序没有得到正确的结果。将这个结果反馈给Doer,它做了如下分析:

Doer修改了代码,主要做了如下改进:

改进后的代码就不贴了。Doer增加调试代码的思路是正确的,但是再次运行程序后仍然无法获得正确结果。接下来Doer就进入死胡同了,它总是认为代码的解析有问题,没有怀疑过百度反爬机制的问题。所以最后没有得到可用的代码。

TRAE对比

我刚开始用TRAE的VSCode插件进行了结果分析:

从TRAE的结果分析看,它注意到运行结果反映出百度使用了反爬虫机制,所以建议采用Selenum模拟浏览器。

我又开启了TRAE IDE,从头开始让它生成代码。

TRAE刚开始生成的代码和CodeArts Doer是一样的,也是个老的爬虫方案,但是执行之后,TRAE发现百度返回的是"网络不给力,请稍后重试"的安全验证页面,而不是实际的搜索结果,意识到因为百度的反爬措施检测到了我们的请求可能是爬虫。

为了解决这个问题,TRAE采用了SerpAPI来获取百度搜索结果。SerpAPI是一个第三方搜索API服务,可以提供各种搜索引擎的搜索结果,包括百度。修改后的代码为:

def search_baidu_agent(query):
    # 使用SerpAPI获取百度搜索结果
    serpapi_key = "YOUR_SERPAPI_KEY"  # 请替换为您的SerpAPI密钥
    
    if not serpapi_key or serpapi_key == "YOUR_SERPAPI_KEY":
        print("请先在代码中设置您的SerpAPI密钥")
        print("您可以在 https://serpapi.com/ 注册并获取API密钥")
        return []
    
    url = "https://serpapi.com/search"
    
    params = {
        "engine": "baidu",
        "q": query,
        "api_key": serpapi_key,
        "num": 10  # 返回10条结果
    }
    
    try:
        # 发送请求
        response = requests.get(url, params=params, timeout=10)
        response.raise_for_status()
        
        # 解析JSON响应
        data = response.json()
        
        # 提取搜索结果
        results = []
        if "organic_results" in data:
            for i, result in enumerate(data["organic_results"]):
                title = result.get("title", "")
                link = result.get("link", "")
                summary = result.get("snippet", "")
                
                results.append({
                    "rank": i + 1,
                    "title": title,
                    "link": link,
                    "summary": summary
                })
        
        return results
    except Exception as e:
        print(f"搜索出错: {e}")
        return []

我访问 https://serpapi.com/ 注册并获取API密钥,将 serpapi_key = "YOUR_SERPAPI_KEY" 中的 YOUR_SERPAPI_KEY 替换为实际API密钥。

使用修改后的代码,我们成功获取了百度搜索结果的前十条,并按照预期格式输出。以下是测试结果示例:

正在搜索: 人工智能

=== 百度智能体搜索结果(前10条)===

【1】人工智能_百度百科
链接: https://baike.baidu.com/item/人工智能/9180
摘要: 人工智能(Artificial Intelligence,简称AI),是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。
--------------------------------------------------------------------------------
【2】人工智能的定义是什么? - 知乎
链接: https://www.zhihu.com/question/26733667
摘要: 人工智能(Artificial Intelligence,简称AI)是指由人制造出来的机器所表现出来的智能。人工智能的核心问题包括推理、知识、规划、学习、交流、感知、移动和操作物体的能力等。
--------------------------------------------------------------------------------
...
共找到 10 条结果

Deepseek网页版对比

我也用Deepseek网页版做了对比,在它的分析中直接指出了反爬机制问题。

DeepSeek生成的代码方案就不包括这种经典爬虫方案。

小结

AI编程是兵家不争之地,所以华为推出了Doer应该是对先前Snap的一个重大改进,不过华为在AI方面起步一直偏晚,还有很多工作要做,期待它会越来越好。第一次代码生成有问题不奇怪,很多是基础模型的能力问题,但是如何处理错误,采用何种修复策略就是工具自身的功力问题了。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐