使用 Selenium 搭建免费 Web 搜索 API 服务
一、引言:为什么我们需要这个工具?
在 AI 智能体(Agents)飞速发展的今天,让它们能够'联网思考'已成为刚需。想象一下,你的 AI 助手不仅能回答训练数据中的问题,还能实时获取最新的新闻、股价、科研成果。
然而,现实很骨感:主流的搜索 API 服务(如 Google Search API、Bing Search API 等)往往需要付费注册,有的还有严格的调用限制。对于个人开发者、学生或小型项目来说,这些门槛可能让人望而却步。
本文将介绍如何利用 Selenium(一个流行的浏览器自动化工具)搭建一个完全免费的 Web 搜索 API 服务,让你的 AI 智能体也能轻松获取实时网络信息。
二、核心思路:模拟人类,获取数据
我们的解决方案基于一个简单而有效的想法:如果 AI 不能直接调用搜索 API,那我们就让它'像人一样使用浏览器'。
具体流程如下:
- 使用 Selenium 启动一个'隐形'的浏览器(无头模式)
- 访问 Bing 的 Copilot 搜索页面
- 从页面中提取、整理搜索结果
- 通过一个简单的 Web API 将结果返回给调用者
这种方法绕过了官方 API 的限制,直接与搜索引擎的公开界面交互,实现了'曲线救国'。
三、分步实现
1、搭建搜索服务端(server.py)
服务端的核心是一个 Flask Web 应用,它接收搜索请求,用 Selenium 执行搜索,然后返回结果。
import datetime
from tqdm import tqdm
import os
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()
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)
combined_text = .join(combined_texts).replace(, )
:
combined_text
():
driver = webdriver.Chrome(options=chrome_options)
wait = WebDriverWait(driver, )
key_world_url_encoded = urllib.parse.quote(key_world)
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,
: key_world,
: t1 - t0,
: driver.current_url,
: driver.title
}
driver.quit()
output_data
():
:
data = request.get_json()
data:
jsonify({: , : }),
key_world = data.get()
body = search_impl(key_world)
jsonify(body),
Exception e:
traceback.print_exc()
jsonify({: , : }),
__name__ == :
app.run(host=, port=, debug=)


