跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI

基于 Selenium 构建免费 Web 搜索 API 服务

介绍利用 Selenium 无头浏览器模拟用户访问 Bing Copilot 搜索页面,结合 Flask 搭建免费 Web 搜索 API 服务的方法。通过 Python 脚本实现服务端自动抓取并返回搜索结果,支持集成到 LangChain 等 AI 智能体框架中,解决主流搜索 API 付费限制问题,适用于个人开发者及小型项目实时获取网络信息的需求。

蜜桃汽水发布于 2026/4/6更新于 2026/5/2431 浏览
基于 Selenium 构建免费 Web 搜索 API 服务

基于 Selenium 构建免费 Web 搜索 API 服务

一、引言:为什么我们需要这个工具?

在 AI 智能体(Agents)飞速发展的今天,让它们能够'联网思考'已成为刚需。想象一下,你的 AI 助手不仅能回答训练数据中的问题,还能实时获取最新的新闻、股价、科研成果——这就像给盲人恢复了视力。

然而,现实很骨感:主流的搜索 API 服务(如 Google Search API、Bing Search API 等)往往需要付费注册,有的还有严格的调用限制。对于个人开发者、学生或小型项目来说,这些门槛可能让人望而却步。

本文将介绍如何利用 Selenium(一个流行的浏览器自动化工具)搭建一个完全免费的 Web 搜索 API 服务,让你的 AI 智能体也能轻松获取实时网络信息。

二、核心思路:模拟人类,获取数据

我们的解决方案基于一个简单而有效的想法:如果 AI 不能直接调用搜索 API,那我们就让它'像人一样使用浏览器'。

具体流程如下:

  1. 使用 Selenium 启动一个'隐形'的浏览器(无头模式)
  2. 访问 Bing 的 Copilot 搜索页面
  3. 从页面中提取、整理搜索结果
  4. 通过一个简单的 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('--headless')  # 无头模式,可选
chrome_options.add_argument('--disable-gpu')  # 禁用 GPU 加速
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--enable-features=AllowSoftwareGLFallbackDueToCrashes,AllowSwiftShaderFallback')
chrome_options.add_argument('--enable-unsafe-swiftshader')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument('--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')
chrome_options.add_argument('--disable-extensions')  # 禁用扩展
chrome_options.add_argument('--disable-infobars')  # 禁用信息栏
prefs = {'profile.managed_default_content_settings.images': 2}  # 2 表示禁止加载图片
chrome_options.add_experimental_option('prefs', prefs)

def get_result(wait, driver):
    combined_texts = []
    combined_text = ""
    # Bing 的搜索结果放在 iframe 中,需要切换进去
    driver.switch_to.default_content()
    iframes = driver.find_elements(By.TAG_NAME, "iframe")
    try:
        for i, iframe in enumerate(iframes):
            src = iframe.get_attribute('src')
            if src.startswith("https://www.bing.com/search"):
                driver.switch_to.frame(iframe)
                wait.until(EC.presence_of_all_elements_located((By.XPATH, "//div[contains(@class, 'answer_container')]")))
                answer_elements = driver.find_elements(By.XPATH, "//div[contains(@class, 'answer_container')]")
                if answer_elements:
                    for element in answer_elements:
                        span_elements = element.find_elements(By.TAG_NAME, "span")
                        if span_elements:
                            span_texts = [span.text for span in span_elements if span.text.strip()]
                            combined_text = '\n'.join(span_texts)
                            combined_texts.append(combined_text)
    except:
        pass
    return combined_text

def search_impl(key_world="介绍一下中国的首都"):
    driver = webdriver.Chrome(options=chrome_options)
    wait = WebDriverWait(driver, 5)
    key_world_url_encoded = urllib.parse.quote(key_world)
    url = f"https://www.bing.com/copilotsearch?q={key_world_url_encoded}"
    t0 = time.time()
    driver.delete_all_cookies()
    driver.get(url)
    for i in range(30):
        combined_text = get_result(wait, driver)
        print(len(combined_text))
        if len(combined_text) > 4:
            break
        time.sleep(1)
    t1 = time.time()
    output_data = {"success": True, "message": combined_text, "query": key_world, "duration": t1 - t0, "url": driver.current_url, "page_title": driver.title}
    driver.quit()
    return output_data

@app.route("/search", methods=["POST"])
def search():
    try:
        data = request.get_json()
        if not data:
            return jsonify({"success": False, "message": "params invalid"}), 400
        key_world = data.get("query")
        body = search_impl(key_world)
        return jsonify(body), 200
    except Exception as e:
        traceback.print_exc()
        return jsonify({"success": False, "message": f"服务器内部错误:{str(e)}"}), 500

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

为什么要用无头模式?

  • 服务器通常没有图形界面
  • 减少资源消耗,运行更高效
  • 避免弹出浏览器窗口干扰其他进程

为什么需要等待机制?

  • 网络速度和服务器响应时间不确定
  • 页面元素需要时间加载完成
  • 避免在内容加载前就尝试提取(会导致空结果)

2、创建客户端(client.py)

客户端是一个简单的 Python 脚本,用于测试我们的搜索服务。

import requests
import json

def send_search_request(query, timeout=30):
    """ 发送搜索请求
    Args:
        query: 查询字符串
        timeout: 超时时间(秒)
    Returns:
        响应结果或错误信息
    """
    url = "http://localhost:5000/search"
    try:
        response = requests.post(
            url,
            json={"query": query},
            headers={"Content-Type": "application/json"},
            timeout=timeout
        )
        response.raise_for_status()
        # 如果状态码不是 200,抛出异常
        # 尝试解析 JSON 响应
        try:
            return response.json()
        except json.JSONDecodeError:
            return {"text": response.text, "status_code": response.status_code}
    except requests.exceptions.Timeout:
        return {"error": "请求超时"}
    except requests.exceptions.ConnectionError:
        return {"error": "连接失败,请检查服务是否启动"}
    except requests.exceptions.RequestException as e:
        return {"error": f"请求异常:{str(e)}"}

# 使用示例
if __name__ == "__main__":
    result = send_search_request("获取最新的 AI 咨询")
    print(json.dumps(result, indent=2, ensure_ascii=False))

四、如何运行?

1. 启动服务端

打开终端,运行:

python server.py 

如果一切正常,你会看到类似下面的输出:

 * Serving Flask app 'server'
 * Debug mode: on
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://[你的 IP 地址]:5000

2. 测试客户端

在另一个终端中,运行:

python client.py 

输出

{"duration":4.231590747833252, "message":"。GPT Image 1.5 在图像生成中实现详细特征保留与光线精准渲染\n。GPT\nImage\n1.5\n在图像生成中实现详细特征保留与光线精准渲染\n。\nAnthropic Claude 系列:发布 Claude Opus 4.6 与 Claude Cowork,支持百万 token 上下文、代码编译及零日漏洞自发现能力\nAnthropic\nClaude 系列\n:发布 Claude\nOpus\n4.6 与 Claude\nCowork,支持百万 token 上下文、代码编译及零日漏洞自发现能力\n。\n通义千问 Qwen 系列:开源 Qwen3-TTS、Qwen3-Coder-Next、Qwen3-VL-Embedding,覆盖语音生成、编程与多模态检索场景\n通义千问\nQwen\n系列\n:开源\nQwen3-TTS、Qwen3-Coder-Next、Qwen3-VL-Embedding,覆盖语音生成、编程与多模态检索场景\n。\n多模态与视频 AI:可灵 AI 3.0 和 2.6 版本实现音画同步、自动分镜控制,PixVerse V5.5 可在几秒内生成导演级多镜头短片\n多模态与视频 AI\n:可灵 AI\n3.0 和 2.6 版本实现音画同步、自动分镜控制,PixVerse\nV5.5 可在几秒内生成导演级多镜头短片\n。美团 LongCat 系列与 Vidi2 显著提升视频编辑和理解能力\n。美团 LongCat 系列与 Vidi2 显著提升视频编辑和理解能力\n。\n端侧与嵌入式 AI:MiniMax、智谱 GLM 系列、阿里通义 Fun-Audio-Chat、腾讯混元 3D Studio 支持本地计算,提升端侧推理效率,支持音乐、语音、文本、图像等多模态任务\n端侧与嵌入式 AI\n:MiniMax、智谱 GLM 系列、阿里通义 Fun-Audio-Chat、腾讯混元 3D\nStudio\n支持本地计算,提升端侧推理效率,支持音乐、语音、文本、图像等多模态任务\n。\n行业企业与融资动态\n港股上市与融资:MiniMax、智谱 AI 纷纷启动或完成港股 IPO,融资数额达数十亿港元,推动全球化布局与算力扩展\n港股上市与融资\n:MiniMax、智谱 AI 纷纷启动或完成港股 IPO,融资数额达数十亿港元,推动全球化布局与算力扩展\n。\nAI 创业与投资:xAI 完成 200 亿美元 E 轮融资,Meta、迪士尼、亚马逊、英伟达等加码投入 AI 应用及硬件\nAI 创业与投资\n:xAI 完成 200 亿美元 E 轮融资,Meta、迪士尼、亚马逊、英伟达等加码投入 AI 应用及硬件\n。国内新型 AI 公司如 DeepWisdom、Vidu、Kimi、Luma AI、RockFlow 等也完成战略融资\n。国内新型 AI 公司如 DeepWisdom、Vidu、Kimi、Luma\nAI、RockFlow 等也完成战略融资\n。\n开源社区发展:面壁智能、Mistral AI、阿里 Qwen、谷歌 Gemini 3 Flash 等项目开源,推动算法、模型和工具的全民可用性\n开源社区发展\n:面壁智能、Mistral\nAI、阿里 Qwen、谷歌 Gemini\n3\nFlash 等项目开源,推动算法、模型和工具的全民可用性\n。\nAI 应用趋势\n办公与生产力:AgentOS、扣子 2.0、MiniMax Agent 2.0、ChatExcel 等智能体平台,实现办公自动化、代码协作和科研辅助\n办公与生产力\n:AgentOS、扣子 2.0、MiniMax\nAgent\n2.0、ChatExcel 等智能体平台,实现办公自动化、代码协作和科研辅助\n。\n多模态交互与智能助手:蚂蚁'灵光'、京东 AI 购、Meta WorldGen、OpenAI 购物研究等,推动 AI 在现实生活场景的便利化应用\n多模态交互与智能助手\n:蚂蚁'灵光'、京东 AI 购、Meta\nWorldGen、OpenAI 购物研究等,推动 AI 在现实生活场景的便利化应用\n。\n个性化与自动化生成:AI 视频、音乐、图像、3D 内容生成实现自动化与定制化生产,支持多语言、角色扮演及场景复现\n个性化与自动化生成\n:AI 视频、音乐、图像、3D 内容生成实现自动化与定制化生产,支持多语言、角色扮演及场景复现\n。\n推荐获取平台\nAI 工具集:实时更新产业新闻、融资动态、产品发布,覆盖多模态、智能体及工具类 AI 应用\nAI 工具集\n:实时更新产业新闻、融资动态、产品发布,覆盖多模态、智能体及工具类 AI 应用\n。\nAIbase.cn\n:每日 AI 日报、热点资讯及产品数据库,内容专业全面\n。\nAI 日报:每天 3 分钟掌握最新 AI 模型、行业动态及前沿技术\nAI 日报\n:每天 3 分钟掌握最新 AI 模型、行业动态及前沿技术\n。\n用户可根据兴趣选择平台,结合社群或订阅功能获取\n实时资讯与深度分析\n。这些平台适用于技术研究、行业分析、投资决策及产品应用探索。", "page_title":"获取最新的 AI 咨询", "query":"获取最新的 AI 咨询", "success": true, "url":"https://www.bing.com/copilotsearch?q=%E8%8E%B7%E5%8F%96%E6%9C%80%E6%96%B0%E7%9A%84AI%E5%92%A8%E8%AF%A2"}

五、实际应用:集成到 AI 智能体

现在你有了一个可用的搜索 API,可以轻松地将它集成到各种 AI 框架中:

示例:在 LangChain 中使用

from langchain.tools import Tool

def search_tool(query: str) -> str:
    """调用我们的本地搜索服务"""
    result = send_search_request(query)
    if result.get("success"):
        return result.get("message", "未找到相关信息")
    return f"搜索失败:{result.get('error', '未知错误')}"

# 创建工具实例
search_tool_instance = Tool(
    name="Web 搜索",
    func=search_tool,
    description="用于搜索最新的网络信息"
)
# 将工具添加到你的 AI 智能体中

六、结语

通过这个项目,你不仅获得了一个免费的搜索 API,更重要的是理解了如何通过自动化工具解决实际开发中的限制。这种'模拟用户行为'的思路可以应用于许多其他场景,如自动化测试、数据采集、监控报警等。

技术的本质是创造可能性。当现有方案受限时,像这样创造性地组合工具,往往能开辟出新的道路。

提示:请合理使用此工具,尊重目标网站的 robots.txt 协议,避免给服务器造成过大压力。

目录

  1. 基于 Selenium 构建免费 Web 搜索 API 服务
  2. 一、引言:为什么我们需要这个工具?
  3. 二、核心思路:模拟人类,获取数据
  4. 三、分步实现
  5. 1、搭建搜索服务端(server.py)
  6. 设置 Chrome 选项
  7. 2、创建客户端(client.py)
  8. 使用示例
  9. 四、如何运行?
  10. 1. 启动服务端
  11. 2. 测试客户端
  12. 五、实际应用:集成到 AI 智能体
  13. 示例:在 LangChain 中使用
  14. 创建工具实例
  15. 将工具添加到你的 AI 智能体中
  16. 六、结语
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 使用文心一言为智能体设计稳定调用工作流的提示词
  • C++ 毕业设计项目效率提升实战:从冗余代码到高性能架构
  • 使用 PyTorch 从零构建 Transformer 模型:原理、代码与训练预测
  • Clawdbot 在 Ubuntu 服务器上的通用部署与配置指南
  • C++ 计算给定 n 个有序顶点多边形的面积
  • OpenClaw 多端交互实测指南:Web、TUI 与钉钉集成
  • OpenCode 使用 GitHub Copilot 计费异常分析与修复
  • SQL Server 2019 安装详细教程
  • Flutter 集成 genkit 实现鸿蒙端 AI 流式响应与提示词工程
  • OpenREALM:无人机实时映射框架的技术深度解析
  • Vscode新手必看:GitHub Copilot从安装到实战的5个高效用法
  • 人工智能:自然语言处理在教育领域的应用与实战
  • 面向数据工程的 SQL 与 Python 代码自动生成:6 款大模型深度评测
  • 微搭低代码 MBA 培训管理系统:用户登录与鉴权实现
  • 基于大模型 API 的早餐自动算价器实现
  • AI Agent 持久记忆实战:Claude Code 接入 MemMachine 全流程
  • WebSocket 添加心跳机制防止连接自动断开
  • FPGA 工程最常见的 10 个玄学 BUG 与排查思路(实战踩坑总结)
  • Angular 版本升级全流程指南与核心注意事项
  • Vue 基于 Python 的高校教材管理系统设计与实现

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online