为什么我们需要这个工具?
在 AI 智能体(Agents)飞速发展的今天,让它们能够'联网思考'已成为刚需。想象一下,你的 AI 助手不仅能回答训练数据中的问题,还能实时获取最新的新闻、股价、科研成果——这就像给盲人恢复了视力。
然而,现实很骨感:主流的搜索 API 服务往往需要付费注册,有的还有严格的调用限制。对于个人开发者、学生或小型项目来说,这些门槛可能让人望而却步。
本文将介绍如何利用 Selenium(一个流行的浏览器自动化工具)搭建一个完全免费的 Web 搜索 API 服务,让你的 AI 智能体也能轻松获取实时网络信息。
核心思路:模拟人类,获取数据
我们的解决方案基于一个简单而有效的想法:如果 AI 不能直接调用搜索 API,那我们就让它'像人一样使用浏览器'。
具体流程如下:
- 使用 Selenium 启动一个'隐形'的浏览器(无头模式)
- 访问 Bing 的 Copilot 搜索页面
- 从页面中提取、整理搜索结果
- 通过一个简单的 Web API 将结果返回给调用者
这种方法绕过了官方 API 的限制,直接与搜索引擎的公开界面交互,实现了'曲线救国'。
分步实现
搭建搜索服务端
服务端的核心是一个 Flask Web 应用,它接收搜索请求,用 Selenium 执行搜索,然后返回结果。
这里我们需要注意几个关键点:
- 反检测设置:搜索引擎通常会检测自动化脚本,所以我们需要伪装 User-Agent 并禁用自动化特征。
- 资源优化:禁止加载图片可以显著减少流量消耗和渲染时间。
- 等待机制:网络速度不确定,必须等待元素加载完成再提取。
import time
import json
import re
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import urllib.parse
from flask import Flask, jsonify, request
from flask_cors import CORS
import traceback
app = Flask(__name__)
CORS(app) # 允许跨域请求
# 设置 Chrome 选项
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument()
chrome_options.add_argument()
chrome_options.add_argument()
chrome_options.add_argument()
chrome_options.add_argument()
chrome_options.add_argument()
chrome_options.add_experimental_option(, [])
chrome_options.add_experimental_option(, )
chrome_options.add_argument()
chrome_options.add_argument()
chrome_options.add_argument()
prefs = {: }
chrome_options.add_experimental_option(, prefs)
():
combined_texts = []
combined_text =
driver.switch_to.default_content()
iframes = driver.find_elements(By.TAG_NAME, )
:
i, iframe (iframes):
src = iframe.get_attribute()
src.startswith():
driver.switch_to.frame(iframe)
wait.until(EC.presence_of_all_elements_located((By.XPATH, )))
answer_elements = driver.find_elements(By.XPATH, )
answer_elements:
element answer_elements:
span_elements = element.find_elements(By.TAG_NAME, )
span_elements:
span_texts = [span.text span span_elements span.text.strip()]
combined_text = .join(span_texts)
combined_texts.append(combined_text)
:
.join(combined_texts).replace(, )
():
driver = webdriver.Chrome(options=chrome_options)
wait = WebDriverWait(driver, )
keyword_url_encoded = urllib.parse.quote(keyword)
url =
t0 = time.time()
driver.delete_all_cookies()
driver.get(url)
i ():
combined_text = get_result(wait, driver)
((combined_text))
(combined_text) > :
time.sleep()
t1 = time.time()
output_data = {
: ,
: combined_text,
: keyword,
: t1 - t0,
: driver.current_url,
: driver.title
}
driver.quit()
output_data
():
:
data = request.get_json()
data:
jsonify({: , : }),
keyword = data.get()
body = search_impl(keyword)
jsonify(body),
Exception e:
traceback.print_exc()
jsonify({: , : }),
__name__ == :
app.run(host=, port=, debug=)


