python利用Selenium搭建免費Web搜索API服務(wù)的方法
一、引言:為什么我們需要這個工具?
在AI智能體(Agents)飛速發(fā)展的今天,讓它們能夠“聯(lián)網(wǎng)思考”已成為剛需。想象一下,你的AI助手不僅能回答訓(xùn)練數(shù)據(jù)中的問題,還能實時獲取最新的新聞、股價、科研成果——這就像給盲人恢復(fù)了視力。
然而,現(xiàn)實很骨感:主流的搜索API服務(wù)(如Google Search API、Bing Search API等)往往需要付費注冊,有的還有嚴格的調(diào)用限制。對于個人開發(fā)者、學(xué)生或小型項目來說,這些門檻可能讓人望而卻步。
本文將介紹如何利用 Selenium(一個流行的瀏覽器自動化工具)搭建一個完全免費的Web搜索API服務(wù),讓你的AI智能體也能輕松獲取實時網(wǎng)絡(luò)信息。
二、核心思路:模擬人類,獲取數(shù)據(jù)
我們的解決方案基于一個簡單而有效的想法:如果AI不能直接調(diào)用搜索API,那我們就讓它“像人一樣使用瀏覽器”。
具體流程如下:
- 使用Selenium啟動一個“隱形”的瀏覽器(無頭模式)
- 訪問Bing的Copilot搜索頁面
- 從頁面中提取、整理搜索結(jié)果
- 通過一個簡單的Web API將結(jié)果返回給調(diào)用者
這種方法繞過了官方API的限制,直接與搜索引擎的公開界面交互,實現(xiàn)了“曲線救國”。
三、分步實現(xiàn)
1、搭建搜索服務(wù)端(server.py)
服務(wù)端的核心是一個Flask Web應(yīng)用,它接收搜索請求,用Selenium執(zhí)行搜索,然后返回結(jié)果。
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) # 允許跨域請求
# 設(shè)置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的搜索結(jié)果放在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, "http://div[contains(@class, 'answer_container')]")))
answer_elements = driver.find_elements(By.XPATH, "http://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:
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"服務(wù)器內(nèi)部錯誤: {str(e)}"}), 500
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
為什么要用無頭模式?
- 服務(wù)器通常沒有圖形界面
- 減少資源消耗,運行更高效
- 避免彈出瀏覽器窗口干擾其他進程
為什么需要等待機制?
- 網(wǎng)絡(luò)速度和服務(wù)器響應(yīng)時間不確定
- 頁面元素需要時間加載完成
- 避免在內(nèi)容加載前就嘗試提?。〞?dǎo)致空結(jié)果)
2、創(chuàng)建客戶端(client.py)
客戶端是一個簡單的Python腳本,用于測試我們的搜索服務(wù)。
import requests
import json
def send_search_request(query, timeout=30):
"""
發(fā)送搜索請求
Args:
query: 查詢字符串
timeout: 超時時間(秒)
Returns:
響應(yīng)結(jié)果或錯誤信息
"""
url = "http://localhost:5000/search"
try:
response = requests.post(
url,
json={"query": query},
headers={"Content-Type": "application/json"},
timeout=timeout
)
response.raise_for_status() # 如果狀態(tài)碼不是200,拋出異常
# 嘗試解析JSON響應(yīng)
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": "連接失敗,請檢查服務(wù)是否啟動"}
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. 啟動服務(wù)端
打開終端,運行:
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 在圖像生成中實現(xiàn)詳細特征保留與光線精準(zhǔn)渲染\n。GPT\nImage\n1.5\n在圖像生成中實現(xiàn)詳細特征保留與光線精準(zhǔn)渲染\n。\nAnthropic Claude系列:發(fā)布Claude Opus 4.6與Claude Cowork,支持百萬token上下文、代碼編譯及零日漏洞自發(fā)現(xiàn)能力\nAnthropic\nClaude系列\(zhòng)n:發(fā)布Claude\nOpus\n4.6與Claude\nCowork,支持百萬token上下文、代碼編譯及零日漏洞自發(fā)現(xiàn)能力\n。\n通義千問 Qwen 系列:開源 Qwen3-TTS、Qwen3-Coder-Next、Qwen3-VL-Embedding,覆蓋語音生成、編程與多模態(tài)檢索場景\n通義千問\nQwen\n系列\(zhòng)n:開源\nQwen3-TTS、Qwen3-Coder-Next、Qwen3-VL-Embedding,覆蓋語音生成、編程與多模態(tài)檢索場景\n。\n多模態(tài)與視頻AI:可靈AI 3.0和2.6版本實現(xiàn)音畫同步、自動分鏡控制,PixVerse V5.5可在幾秒內(nèi)生成導(dǎo)演級多鏡頭短片\n多模態(tài)與視頻AI\n:可靈AI\n3.0和2.6版本實現(xiàn)音畫同步、自動分鏡控制,PixVerse\nV5.5可在幾秒內(nèi)生成導(dǎo)演級多鏡頭短片\n。美團LongCat系列與Vidi2顯著提升視頻編輯和理解能力\n。美團LongCat系列與Vidi2顯著提升視頻編輯和理解能力\n。\n端側(cè)與嵌入式AI:MiniMax、智譜GLM系列、阿里通義Fun-Audio-Chat、騰訊混元3D Studio 支持本地計算,提升端側(cè)推理效率,支持音樂、語音、文本、圖像等多模態(tài)任務(wù)\n端側(cè)與嵌入式AI\n:MiniMax、智譜GLM系列、阿里通義Fun-Audio-Chat、騰訊混元3D\nStudio\n支持本地計算,提升端側(cè)推理效率,支持音樂、語音、文本、圖像等多模態(tài)任務(wù)\n。\n行業(yè)企業(yè)與融資動態(tài)\n港股上市與融資:MiniMax、智譜AI紛紛啟動或完成港股IPO,融資數(shù)額達數(shù)十億港元,推動全球化布局與算力擴展\n港股上市與融資\n:MiniMax、智譜AI紛紛啟動或完成港股IPO,融資數(shù)額達數(shù)十億港元,推動全球化布局與算力擴展\n。\nAI創(chuàng)業(yè)與投資:xAI完成200億美元E輪融資,Meta、迪士尼、亞馬遜、英偉達等加碼投入AI應(yīng)用及硬件\nAI創(chuàng)業(yè)與投資\n:xAI完成200億美元E輪融資,Meta、迪士尼、亞馬遜、英偉達等加碼投入AI應(yīng)用及硬件\n。國內(nèi)新型AI公司如DeepWisdom、Vidu、Kimi、Luma AI、RockFlow等也完成戰(zhàn)略融資\n。國內(nèi)新型AI公司如DeepWisdom、Vidu、Kimi、Luma\nAI、RockFlow等也完成戰(zhàn)略融資\n。\n開源社區(qū)發(fā)展:面壁智能、Mistral AI、阿里Qwen、谷歌Gemini 3 Flash等項目開源,推動算法、模型和工具的全民可用性\n開源社區(qū)發(fā)展\n:面壁智能、Mistral\nAI、阿里Qwen、谷歌Gemini\n3\nFlash等項目開源,推動算法、模型和工具的全民可用性\n。\nAI應(yīng)用趨勢\n辦公與生產(chǎn)力:AgentOS、扣子2.0、MiniMax Agent 2.0、ChatExcel等智能體平臺,實現(xiàn)辦公自動化、代碼協(xié)作和科研輔助\n辦公與生產(chǎn)力\n:AgentOS、扣子2.0、MiniMax\nAgent\n2.0、ChatExcel等智能體平臺,實現(xiàn)辦公自動化、代碼協(xié)作和科研輔助\n。\n多模態(tài)交互與智能助手:螞蟻“靈光”、京東AI購、Meta WorldGen、OpenAI購物研究等,推動AI在現(xiàn)實生活場景的便利化應(yīng)用\n多模態(tài)交互與智能助手\n:螞蟻“靈光”、京東AI購、Meta\nWorldGen、OpenAI購物研究等,推動AI在現(xiàn)實生活場景的便利化應(yīng)用\n。\n個性化與自動化生成:AI視頻、音樂、圖像、3D內(nèi)容生成實現(xiàn)自動化與定制化生產(chǎn),支持多語言、角色扮演及場景復(fù)現(xiàn)\n個性化與自動化生成\n:AI視頻、音樂、圖像、3D內(nèi)容生成實現(xiàn)自動化與定制化生產(chǎn),支持多語言、角色扮演及場景復(fù)現(xiàn)\n。\n推薦獲取平臺\nAI工具集:實時更新產(chǎn)業(yè)新聞、融資動態(tài)、產(chǎn)品發(fā)布,覆蓋多模態(tài)、智能體及工具類AI應(yīng)用\nAI工具集\n:實時更新產(chǎn)業(yè)新聞、融資動態(tài)、產(chǎn)品發(fā)布,覆蓋多模態(tài)、智能體及工具類AI應(yīng)用\n。\nAIbase.cn:每日AI日報、熱點資訊及產(chǎn)品數(shù)據(jù)庫,內(nèi)容專業(yè)全面\nAIbase.cn\n:每日AI日報、熱點資訊及產(chǎn)品數(shù)據(jù)庫,內(nèi)容專業(yè)全面\n。\nAI日報:每天3分鐘掌握最新AI模型、行業(yè)動態(tài)及前沿技術(shù)\nAI日報\n:每天3分鐘掌握最新AI模型、行業(yè)動態(tài)及前沿技術(shù)\n。\n用戶可根據(jù)興趣選擇平臺,結(jié)合社群或訂閱功能獲取\n實時資訊與深度分析\n。這些平臺適用于技術(shù)研究、行業(yè)分析、投資決策及產(chǎn)品應(yīng)用探索。",
"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"
}
五、實際應(yīng)用:集成到AI智能體
現(xiàn)在你有了一個可用的搜索API,可以輕松地將它集成到各種AI框架中:
示例:在LangChain中使用
from langchain.tools import Tool
def search_tool(query: str) -> str:
"""調(diào)用我們的本地搜索服務(wù)"""
result = send_search_request(query)
if result.get("success"):
return result.get("message", "未找到相關(guān)信息")
return f"搜索失敗: {result.get('error', '未知錯誤')}"
# 創(chuàng)建工具實例
search_tool_instance = Tool(
name="Web搜索",
func=search_tool,
description="用于搜索最新的網(wǎng)絡(luò)信息"
)
# 將工具添加到你的AI智能體中
五、結(jié)語
通過這個項目,你不僅獲得了一個免費的搜索API,更重要的是理解了如何通過自動化工具解決實際開發(fā)中的限制。這種"模擬用戶行為"的思路可以應(yīng)用于許多其他場景,如自動化測試、數(shù)據(jù)采集、監(jiān)控報警等。
技術(shù)的本質(zhì)是創(chuàng)造可能性。當(dāng)現(xiàn)有方案受限時,像這樣創(chuàng)造性地組合工具,往往能開辟出新的道路。
提示:請合理使用此工具,尊重目標(biāo)網(wǎng)站的robots.txt協(xié)議,避免給服務(wù)器造成過大壓力。本文僅供學(xué)習(xí)交流使用。
到此這篇關(guān)于python利用Selenium搭建免費Web搜索API服務(wù)的方法的文章就介紹到這了,更多相關(guān)python免費Web搜索API服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python+Selenium瀏覽器自動化測試與網(wǎng)頁自動登錄
- Python自動化測試框架:unittest、pytest、Selenium、requests和Pytest-BDD
- Python使用Selenium實現(xiàn)Web自動化的完整指南
- 從零開始學(xué)習(xí)Python Selenium瀏覽器元素定位與實戰(zhàn)技巧
- Python使用Selenium將網(wǎng)頁保存為圖片或PDF
- 從入門到精通解析Python Selenium如何模擬瀏覽器操作
- Python使用Selenium實現(xiàn)自動化網(wǎng)頁批量錄入
- Python Selenium 滾動到特定元素的幾種實現(xiàn)方法
- python中selenium安裝配置與使用示例
- Python使用Selenium檢查元素是否存在的方法
相關(guān)文章
Python實現(xiàn)批量將符合要求的文件自動復(fù)制到新文件夾
這篇文章主要為大家詳細介紹了如何使用Python實現(xiàn)批量將文件名稱符合要求的文件自動復(fù)制到新文件夾,文中的示例代碼講解詳細,有需要的小伙伴可以參考下2023-10-10
利用Hyperic調(diào)用Python實現(xiàn)進程守護
這篇文章主要為大家詳細介紹了利用Hyperic調(diào)用Python實現(xiàn)進程守護,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
python: line=f.readlines()消除line中\(zhòng)n的方法
這篇文章主要介紹了python: line=f.readlines()消除line中\(zhòng)n的方法,需要的朋友可以參考下2018-03-03
Python+wxPython實現(xiàn)一個簡單的音樂播放器
這篇文章主要為大家詳細介紹了如何使用Python編程語言和wxPython模塊創(chuàng)建一個簡單的音樂播放器,文中的示例代碼講解詳細,感興趣的可以了解下2023-09-09

