共计 2454 个字符,预计需要花费 7 分钟才能阅读完成。
国内用户搜索痛点分析
作为开发者,我们经常需要为国内用户提供联网搜索功能。但直接使用通用搜索引擎(如 Google)会遇到几个典型问题:

- 语言障碍:英文结果占比过高,即使搜索中文关键词也常返回英文内容
- 结果相关性差:国际搜索引擎对中文网页的收录和排序算法不够本土化
- 访问稳定性:部分国际服务在国内访问时断时续
- 合规风险:未经处理的搜索结果可能包含敏感内容
技术方案选型
传统爬虫方案
- 优点:完全控制抓取逻辑,无需依赖第三方 API
- 缺点:
- 开发维护成本高(反爬虫对抗、页面解析适配)
- 法律风险(可能违反网站 Robots 协议)
- 稳定性差(页面结构变更导致解析失败)
百度 API 方案
- 优点:
- 官方支持,稳定合规
- 原生中文支持,结果经过安全过滤
- 开发效率高(标准 REST API)
- 缺点:
- 有调用配额限制
- 需要开发者账号
核心实现详解
1. 百度开发者账号申请
- 访问 百度开发者中心
- 注册账号并完成实名认证
- 在控制台创建 ” 网页搜索 ” 应用
- 获取 API Key 和 Secret Key
2. API 调用签名生成
百度搜索 API 使用签名认证,主要步骤:
- 构造参数字符串(参数按字母序排序)
- 拼接完整请求字符串(URI + 参数字符串 + Secret Key)
- 计算 MD5 值并转为小写
关键 Python 实现:
import hashlib
import urllib.parse
def generate_signature(params, secret_key):
# 参数按 key 排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 构造参数字符串
query_string = urllib.parse.urlencode(sorted_params)
# 计算签名
sign_string = query_string + secret_key
return hashlib.md5(sign_string.encode()).hexdigest()
3. 结果解析与过滤
百度 API 返回的 JSON 包含多个维度的信息,建议处理:
- 提取核心字段(title, url, abstract)
- 过滤广告结果(通常有特殊的标记字段)
- 按相关性排序(结合 baidu 权重和自定义规则)
完整代码示例
import requests
import time
from typing import List, Dict
class BaiduSearch:
def __init__(self, api_key: str, secret_key: str):
self.api_key = api_key
self.secret_key = secret_key
self.endpoint = "http://api.baidu.com/json/tongji/v1/WebSearch"
def search(self, query: str, max_retry=3) -> List[Dict]:
"""
执行百度搜索
:param query: 搜索关键词
:param max_retry: 最大重试次数
:return: 搜索结果列表
"""params = {"q": query,"ak": self.api_key,"timestamp": str(int(time.time())),
}
# 生成签名
params["sign"] = generate_signature(params, self.secret_key)
for attempt in range(max_retry):
try:
response = requests.get(
self.endpoint,
params=params,
timeout=5
)
response.raise_for_status()
return self._parse_results(response.json())
except Exception as e:
if attempt == max_retry - 1:
raise
time.sleep(1 * (attempt + 1))
def _parse_results(self, raw_data: Dict) -> List[Dict]:
"""解析百度 API 返回结果"""
results = []
for item in raw_data.get("data", []):
# 过滤广告结果
if item.get("is_ad", False):
continue
results.append({"title": item.get("title", ""),"url": item.get("url",""),
"abstract": item.get("abstract", ""),
})
return results
性能优化策略
1. 请求并发控制
- 使用线程池控制并发请求数(建议 5 -10 个并发)
- 避免触发百度 API 的频率限制(默认 500 次 / 分钟)
2. 缓存策略
- 对相同查询结果缓存至少 5 分钟
- 使用 LRU 缓存避免内存溢出
3. 超时设置
- 连接超时:2 秒
- 读取超时:5 秒
- 总请求超时:8 秒
安全注意事项
1. API 密钥管理
- 不要将密钥硬编码在代码中
- 使用环境变量或密钥管理服务
- 定期轮换密钥
2. 请求频率限制
- 监控调用量,避免超出配额
- 实现熔断机制(如连续失败停止请求)
3. 敏感词过滤
- 在调用 API 前过滤输入关键词
- 对返回结果进行二次过滤
生产环境检查清单
- [] 完成百度开发者实名认证
- [] API 密钥已正确配置且保密
- [] 实现了错误处理和自动重试
- [] 设置了合理的请求频率限制
- [] 部署了敏感词过滤机制
中文搜索优化经验
分词策略影响
百度采用特有的中文分词算法,与开源方案(如 jieba)不同。建议:
- 测试不同分词组合的效果
- 对专业术语使用引号强制精确匹配
百度 vs.Google 差异
- 百度更侧重网站权重和内容更新频率
- 对中文同义词的处理更智能
- 本地化内容(如.cn 域名)排名更高
应对策略:
- 重要关键词放在标题和 URL 中
- 保持内容定期更新
- 获取高质量中文外链
总结
通过百度搜索 API,我们可以快速构建稳定、合规的中文搜索功能。相比自行开发爬虫,该方案节省了大量维护成本,结果质量也更符合国内用户预期。实际应用中需要注意性能优化和安全防护,特别是在高并发场景下要做好限流和缓存。
正文完
