用Selenium实现一个免费的Web搜索API服务

用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)defget_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 inenumerate(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) combined_text="\n".join(combined_texts).replace("查看所有链接","")except:passreturn combined_text defsearch_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 inrange(30): combined_text = get_result(wait,driver)print(len(combined_text))iflen(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"])defsearch():try: data = request.get_json()ifnot data:return jsonify({"success":False,"message":"params invalid"}),400 key_world = data.get("query") body=search_impl(key_world)return jsonify(body),200except Exception as e: traceback.print_exc()return jsonify({"success":False,"message":f"服务器内部错误: {str(e)}"}),500if __name__ =="__main__": app.run(host="0.0.0.0", port=5000, debug=True)

为什么要用无头模式?

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

为什么需要等待机制?

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

2、创建客户端(client.py

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

import requests import json defsend_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:每日AI日报、热点资讯及产品数据库,内容专业全面\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 defsearch_tool(query:str)->str:"""调用我们的本地搜索服务""" result = send_search_request(query)if result.get("success"):return result.get("message","未找到相关信息")returnf"搜索失败: {result.get('error','未知错误')}"# 创建工具实例 search_tool_instance = Tool( name="Web搜索", func=search_tool, description="用于搜索最新的网络信息")# 将工具添加到你的AI智能体中

五、结语

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

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


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

Read more

Rust异步编程高级模式:并发控制、超时机制与实战架构

Rust异步编程高级模式:并发控制、超时机制与实战架构

Rust异步编程高级模式:并发控制、超时机制与实战架构 一、异步并发控制:Semaphore、Mutex、RwLock的异步版本 1.1 为什么需要异步同步原语? 💡在同步编程中,我们使用std::sync::Mutex、std::sync::RwLock、std::sync::Semaphore等同步原语来控制并发访问。这些原语在多线程场景下非常有效,但在异步编程中,它们会导致任务阻塞,影响性能。 异步同步原语通过await关键字暂停任务,而不是阻塞线程,从而提高了CPU利用率。Tokio提供了一系列异步同步原语,如tokio::sync::Mutex、tokio::sync::RwLock、tokio::sync::Semaphore。 1.2 异步Mutex(互斥锁) 异步Mutex的使用方式与标准库的类似,但需要使用await来获取锁。 usetokio::sync::Mutex;usestd::sync::Arc;

By Ne0inhk
突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案

突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案

突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案 背景 随着AI技术的飞速发展,诸如DeepSeek R1、千问QWQ32、文小言、元宝等AI大模型迅速崛起。在AI大模型训练和微调、AI知识库建设中,数据集的获取已成为不可或缺的基础。尤其是在面对各式各样的网页数据结构时,将其整理成可用的数据集是一项极具挑战的任务。开发者不仅需要付出大量的开发和人工成本,还需应对复杂的网页数据获取难题。在这种情况下,一款能够自动化解决网页数据获取问题的工具变得尤为重要。 本文将介绍网页解锁器Web Unlocker API、网页抓取Web-Scraper以及搜索引擎结果页SERP API等工具,特别适合中小企业解决商业化网页数据集问题,展示其如何解决AI数据集网页抓取的难题,提供高效、自动化的数据获取解决方案。 什么是Web Unlocker API工具? Web Unlocker API是基于Bright Data的代理基础设施开发的,具备三个关键组件:请求管理、浏览器指纹伪装和内容验证。通过这些功能,它能够自动化处理所有网页解锁操作

By Ne0inhk

Spring Boot集成WebSocket,实现后台向前端推送信息

1. 引言 随着互联网应用的不断发展,用户对实时性的要求越来越高。传统的HTTP协议是基于请求-响应模式的,客户端发起请求,服务器返回响应,连接即关闭。这种“拉取”模式在处理实时数据(如股票行情、即时消息、游戏对战、系统通知等)时显得力不从心:要么客户端频繁轮询造成资源浪费,要么服务器有新数据却无法主动通知客户端。 WebSocket协议的出现完美解决了这一难题。它允许服务器主动向客户端推送数据,实现真正的双向通信。Spring Boot作为当今最流行的Java微服务框架,对WebSocket提供了良好的支持。本文将深入浅出地讲解如何在Spring Boot中集成WebSocket,实现后台向前端推送信息,涵盖原生WebSocket、STOMP协议、安全集成、集群部署等方方面面,力求让读者能够全面掌握这一技术。 2. WebSocket基础 2.1 什么是WebSocket? WebSocket是一种在单个TCP连接上进行全双工通信的协议。它由IETF在2011年定为标准RFC 6455,并被Web API定义为W3C标准。WebSocket使得客户端和服务器之间的数据交换

By Ne0inhk
网站检测不用等! Web-Check+cpolar让异地协作查漏洞更高效

网站检测不用等! Web-Check+cpolar让异地协作查漏洞更高效

文章目录 * 前言 * 1.关于Web-Check * 2.功能特点 * 3.安装Docker * 4.创建并启动Web-Check容器 * 5.本地访问测试 * 6.公网远程访问本地Web-Check * 7.内网穿透工具安装 * 8.创建远程连接公网地址 * 9.使用固定公网地址远程访问 前言 Web-Check 是一款全方位的网站诊断工具,能检测 IP 信息、SSL 证书、DNS 记录、开放端口等关键数据,适合开发者做性能优化、运维人员做安全巡检,还能帮安全测试人员识别潜在风险。它的优点是结果可视化强,所有数据在仪表盘分类呈现,不用手动整合多工具报告,省时又清晰。 用 Web-Check 时发现,检测前最好确认目标网站能正常访问,否则可能出现数据不全;另外,生成的报告里有不少专业术语,新手可以先查基础概念(比如 SSL 链、DNS

By Ne0inhk