1. 项目概述:用50行代码打造AI搜索助手
"Hello, Agent!"这个标题背后隐藏着一个极具实用价值的自动化场景——让AI程序自动完成百度搜索任务。作为一名长期关注自动化技术落地的开发者,我发现用50行左右的Python代码就能构建一个能理解自然语言指令、自动执行百度搜索并返回结果的AI助手。这个项目的核心价值在于将日常重复性搜索工作自动化,比如定期获取"防脱发指南"这类需要持续跟踪的资讯。
这个微型AI系统的技术栈非常精简:主要依赖Python的requests库处理网络请求,配合百度搜索的URL参数规则,再加上基础的自然语言处理(NLP)来解析用户指令。整个系统可以拆解为三个关键模块:指令解析模块、搜索执行模块和结果处理模块。相比复杂的AI系统,这种轻量级实现特别适合个人开发者快速搭建实用工具。
提示:百度搜索API有严格的调用频率限制,实际开发时建议添加适当的延时逻辑,避免触发反爬机制。我在实测中发现每次搜索间隔保持在3-5秒最为安全。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心设计思路与技术选型
2.1 为什么选择百度搜索作为数据源
百度作为中文搜索引擎,在本地化结果呈现方面有明显优势。通过分析搜索URL的构造规则(如https://www.baidu.com/s?wd=关键词),我们可以直接用程序模拟搜索行为。相比官方API,这种方式无需申请密钥,但需要注意以下几点:
- 结果解析需要处理HTML文档结构
- 要模拟浏览器头部信息(User-Agent)
- 需处理可能的验证码挑战
我推荐使用requests-html库,它内置了HTML解析功能,可以轻松提取搜索结果的标题和链接:
python复制from requests_html import HTMLSession
session = HTMLSession()
r = session.get(f'https://www.baidu.com/s?wd={keyword}')
results = r.html.find('.result') # 百度搜索结果容器的CSS选择器
2.2 自然语言指令的轻量级处理方案
完整的NLP管道对于这个小项目显然过重。我的解决方案是采用关键词提取+规则匹配的混合策略:
- 用
jieba库提取指令中的实体词(如"防脱发") - 预设指令模板(如"搜索...","查找...")
- 组合生成最终搜索关键词
python复制import jieba.analyse
def parse_command(text):
tags = jieba.analyse.extract_tags(text, topK=3)
if "搜索" in text or "查找" in text:
return " ".join(tags)
return None
这种方案在保持精简的同时,能处理大多数日常指令。对于更复杂的需求,可以考虑接入ChatGPT等大模型的API,但会显著增加代码复杂度和运行成本。
3. 完整实现步骤与核心代码
3.1 环境准备与依赖安装
首先创建Python虚拟环境并安装必要依赖:
bash复制python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
pip install requests-html jieba
3.2 核心搜索功能实现
构建一个完整的搜索函数需要处理以下几个关键点:
- 模拟真实浏览器头部
- 处理URL编码
- 设置合理的超时时间
- 解析结果页面结构
python复制from urllib.parse import quote
from requests_html import HTMLSession
import time
def baidu_search(query, max_results=5):
session = HTMLSession()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
url = f'https://www.baidu.com/s?wd={quote(query)}'
try:
r = session.get(url, headers=headers, timeout=10)
r.html.render(sleep=2) # 确保JavaScript渲染完成
results = []
for item in r.html.find('.result', first=max_results):
title = item.find('h3', first=True).text
link = item.find('a', first=True).attrs['href']
abstract = item.find('.c-abstract', first=True).text
results.append({'title': title, 'link': link, 'abstract': abstract})
return results
except Exception as e:
print(f"搜索出错: {e}")
return []
finally:
time.sleep(3) # 礼貌性延迟
3.3 指令处理与交互逻辑
将自然语言指令转换为实际搜索动作:
python复制import jieba.analyse
class SearchAgent:
def __init__(self):
jieba.initialize()
def process(self, text):
# 提取关键词
kw = self._extract_keywords(text)
if not kw:
return "未能识别搜索指令"
# 执行搜索
print(f"正在搜索: {kw}")
results = baidu_search(kw)
# 格式化结果
return self._format_results(results)
def _extract_keywords(self, text):
# 过滤停用词
stopwords = ["请", "帮我", "查找", "搜索"]
words = [w for w in jieba.cut(text) if w not in stopwords]
return " ".join(words)
def _format_results(self, items):
if not items:
return "未找到相关结果"
output = ["找到以下结果:"]
for i, item in enumerate(items, 1):
output.append(f"{i}. {item['title']}")
output.append(f" {item['link']}")
output.append(f" {item['abstract']}\n")
return "\n".join(output)
3.4 完整示例代码
将上述模块组合起来,实现一个完整的命令行交互程序:
python复制if __name__ == "__main__":
agent = SearchAgent()
print("欢迎使用百度搜索助手!输入指令开始搜索(输入q退出)")
while True:
query = input("\n你想搜索什么?> ")
if query.lower() in ['q', 'quit', 'exit']:
break
response = agent.process(query)
print(response)
这个完整实现仅用了约45行有效代码(不含空行和注释),完美达成了项目目标。用户现在可以用自然语言指令如"帮我找防脱发的最新治疗方法"来获取百度搜索结果。
4. 实战优化与问题排查
4.1 常见问题与解决方案
在实际使用中,可能会遇到以下典型问题:
-
返回空结果
- 检查百度是否返回了验证页面(添加错误捕获和重试逻辑)
- 更新CSS选择器(百度偶尔会调整页面结构)
-
被封禁IP
- 增加请求间隔时间(建议3-5秒)
- 使用代理IP池(需谨慎合法使用)
-
中文编码问题
- 确保正确使用
urllib.parse.quote处理查询参数 - 检查系统默认编码设置为UTF-8
- 确保正确使用
4.2 性能优化技巧
经过多次实测,我总结出以下提升稳定性的经验:
- 结果渲染等待:百度搜索结果有部分是通过JavaScript动态加载的,
r.html.render()中的sleep参数很关键 - 请求头伪装:完善的浏览器指纹能显著降低被封风险,可以随机切换User-Agent
- 结果去重:百度可能会返回相似结果,添加基于标题的简单去重逻辑
python复制# 在baidu_search函数中添加去重逻辑
seen_titles = set()
for item in r.html.find('.result'):
title = item.find('h3', first=True).text
if title not in seen_titles:
seen_titles.add(title)
# 处理结果...
4.3 扩展功能建议
这个基础框架可以轻松扩展更多实用功能:
- 结果过滤:只显示特定域名(如".edu.cn"的教育资源)
- 定时搜索:用schedule库实现定期自动搜索并邮件通知
- 结果摘要:用NLP技术生成搜索结果摘要
- 多引擎搜索:同时查询百度、搜狗等引擎对比结果
python复制# 示例:添加域名过滤
def filter_by_domain(results, domain):
return [r for r in results if domain in r['link']]
# 使用示例
results = baidu_search("防脱发指南")
edu_results = filter_by_domain(results, ".edu.cn")
5. 法律合规与道德考量
在开发此类自动化工具时,必须注意:
- 遵守robots.txt:百度对爬虫有明确限制,本项目仅作技术演示
- 控制请求频率:避免对目标服务器造成负担
- 注明数据来源:如果公开使用结果,应声明数据来自百度搜索
- 个人使用原则:不建议大规模部署或商业化使用
重要提示:百度搜索结果的商业用途需要获得官方授权。本项目的代码示例仅供学习Python网络编程和自动化技术使用,请勿用于任何可能违反百度服务条款的用途。
在实际开发中,我建议添加以下合规性保护措施:
python复制# 在请求函数中添加速率限制
RATE_LIMIT = 5 # 每分钟最大请求数
last_request_time = 0
def make_request(url):
global last_request_time
now = time.time()
elapsed = now - last_request_time
if elapsed < 60/RATE_LIMIT:
time.sleep(60/RATE_LIMIT - elapsed)
last_request_time = time.time()
# 继续请求逻辑...
这个50行代码的AI搜索助手虽然简单,但完整展示了自动化技术如何提升日常效率。通过合理的模块划分和错误处理,即使是小型脚本也能具备实用价值。我在实际使用中发现,它对跟踪医疗健康资讯(如防脱发研究)、竞品分析和市场调研特别有帮助。
