爬虫_20251211Browser-Use

发布时间:2026/7/1 6:42:42
爬虫_20251211Browser-Use 检查 Windows 中是否已经安装uv:uv --version升级uv版本:uv self update安装方法:用pip安装uv:pip install uv用官方脚本安装:powershell -ExecutionPolicy ByPass -c irm https://astral.sh/uv/install.ps1 | iex通过检查uv的安装路径来判断自己的安装方式。在 PowerShell 里运行:Get-Command uv如果是用pip安装的uvPython 包路径通常是:C:\Users\yuanz\AppData\Local\Programs\Python\Python311\Scripts\uv.exe C:\Users\yuanz\AppData\Roaming\Python\Python311\Scripts\uv.exe如果是用官方脚本安装的 uv独立可执行文件路径通常是C:\Users\yuanz\.local\bin\uv.exe C:\Users\yuanz\AppData\Local\uv\bin\uv.exe检查是否是pip管理的版本:pip list | findstr uv解除 PowerShell.ps1执行禁令:# 在 PowerShell 以管理员身份运行的情况下执行以解禁 PowerShell 的默认禁止执行 .ps1 脚本禁令 # 这条命令的意思是允许当前用户运行本地的 PowerShell 脚本如 .venv\Scripts\activate.ps1但仍阻止来自互联网且未签名的脚本。 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser创建并激活虚拟环境:cd 项目路径 uv venv .venv\Scripts\activate命令行前多出(.venv)说明虚拟环境激活成功。安装 Browser-Use:uv init uv add browser-use uv sync uvx browser-use install安装dotenv:uv pip install python-dotenv创建.env文件注意事项:不要加引号不要加空格。.env文件名一定要以点开头。确保它和你的 Python 脚本在同一文件夹下。Browser-Use 使用示例:# run_agent.py # -*- coding: utf-8 -*- 一个开箱即用的 browser-use 示例 - 读取 .env 里的 GEMINI_API_KEY - 默认用【本机浏览器】需要可一键切换到云端浏览器 - 支持为网页流量设置“本地代理”同时保证本地 CDP (127.0.0.1) 不走代理 - 兼容 browser-use 0.8.xBrowser() 只支持 use_cloud/headless/proxy import os import sys import traceback from dotenv import load_dotenv # 1) 载入 .env放在项目根目录内容GEMINI_API_KEY你的key load_dotenv() # 2) —— 关键保证本地调试端口不走代理否则会 JSONDecodeError os.environ[NO_PROXY] localhost,127.0.0.1 os.environ[no_proxy] localhost,127.0.0.1 # 如果之前在系统/终端里设置过以下代理变量这里强制清理仅当前进程 for k in (HTTP_PROXY, HTTPS_PROXY, http_proxy, https_proxy): os.environ.pop(k, None) # 3) 根据你的代理情况配置网页访问代理如果需要 # 例如你的本地 VPN 端口是 25378则设为 PROXY_SERVER os.getenv(PROXY_SERVER, http://127.0.0.1:25378) USE_PROXY os.getenv(USE_PROXY, false).lower() in (1, true, yes) # 4) 是否使用云端浏览器本机不稳定时可切换为 True需先执行 browser-use auth 完成登录 USE_CLOUD os.getenv(USE_CLOUD, false).lower() in (1, true, yes) # 5) 其余参数 HEADLESS os.getenv(HEADLESS, false).lower() in (1, true, yes) MODEL_ID os.getenv(GEMINI_MODEL, gemini-2.5-flash) # 6) 导入 browser-use放到 NO_PROXY 设置之后 from browser_use import Agent, ChatGoogle, Browser def make_browser(): 兼容 browser-use 0.7.x Browser() 支持的参数有限use_cloud、headless、proxy、profile_name 其中 proxy 传递为 playwright 兼容的 dict {server: http://host:port, username: ..., password: ...} kwargs { use_cloud: USE_CLOUD, headless: HEADLESS, } if (not USE_CLOUD) and USE_PROXY: kwargs[proxy] {server: PROXY_SERVER} # 如需账号密码改成 # kwargs[proxy] {server: PROXY_SERVER, username: your_user, password: your_pass} return Browser(**kwargs) # 不再需要文件解析和 CSV 生成功能数据直接输出到 terminal def main(): # 小检查API Key key os.getenv(GEMINI_API_KEY) if not key: print(❌ 未检测到 GEMINI_API_KEY请在项目根目录创建 .env 并写入) print(GEMINI_API_KEY你的key) sys.exit(1) print( Config ) print(fUSE_CLOUD : {USE_CLOUD}) print(fHEADLESS : {HEADLESS}) print(fUSE_PROXY : {USE_PROXY} ({PROXY_SERVER if USE_PROXY else no proxy})) print(fMODEL_ID : {MODEL_ID}) print(NO_PROXY :, os.environ.get(NO_PROXY)) browser make_browser() agent Agent( task 【严格动作协议】 - 你是浏览器自动化 Agent。你每一步“必须”返回一个且仅一个动作action动作必须是下列之一 navigate / click / input / send_keys / wait / scroll / find_text / extract / evaluate / read_file / replace_file / done - 除最终 done 外不要输出任何自然语言或总结若需要记录进度使用 replace_file。 - 如不确定也必须给出一个动作例如 wait。绝不能只输出思考thinking。 【任务】 1) 打开 https://www.cn-healthcare.com/ 。 2) 点击顶栏“搜索/放大镜”图标 div classni_head_search_wrap先等待url变为 https://www.cn-healthcare.com/search/再等待输入框出现 3) 然后在顶部的 input classsearch-input 的输入框中输入公立医院并按 Enter等待 10 秒若无明显结果再按一次 Enter 或再点搜索按钮。 4) 滚动到底部等待 5 秒只执行这一次操作。 4) 从当前页抽取文章卡片仅 cn-healthcare.com 域 - 每个卡片元素div classsearch-item - 标题div classsearch-item 内的 h5 classtit/h5 下的 a 文本 - 网址h5 classtit/h5 内的 a 标签内的 href 参数内容 - 作者div classfooter 下的 a 标签内的 span.author 的所有文本内容 - 发布日期div classfooter 下的 span classdate/span 内的所有文本内容格式 yyyy/mm/dd 5) 过滤 - 仅保留 URL 含 /article /content /articlewm且不是图片/视频/PDF 等后缀 - 日期在 2023-05-01 至 2025-10-31含端点相对时间如“刚刚/几天前”跳过 - URL 去重 【抽取与落地必须】 - 完成搜索与滚动后执行一次 extract - 每个卡片元素div classsearch-item - 标题div classsearch-item 内的 h5 classtit/h5 下的 a 文本 - 网址h5 classtit/h5 内的 a 标签内的 href 参数内容 - 作者div classfooter 下的 a 标签内的 span.author 的所有文本内容 - 发布日期div classfooter 下的 span classdate/span 内的所有文本内容格式 yyyy/mm/dd - 执行完 evaluate 后Agent 立即结束调用 done。 - 数据会直接显示在 terminal 中无需写入文件。 【禁止事项】 - 除最终 done 外任何步骤禁止输出自然语言文本、代码块或截图。 , llmChatGoogle(modelMODEL_ID), browserbrowser, ) # 运行 Agent数据会直接输出到 terminal try: print( 开始爬取数据...) agent.run_sync() # 关键同步执行 print(✅ 数据提取完成) except Exception: print(❌ Agent 运行失败堆栈如下) traceback.print_exc() print(\n常见修复) print(1) 若开启了系统全局代理请关闭或确保排除 127.0.0.1) print(2) 若本机仍不稳设置环境变量 USE_CLOUDtrue 后再跑先 browser-use auth) print(3) 升级到新版uv pip install -U browser-use[cli]) print(4) 以有头模式调试设 HEADLESSfalse。) if __name__ __main__: main()命令行指令查看 Windows 系统层面的 WinHTTP 代理设置:PS C:\Users\yuanz\Desktop\scraper-wjw netsh winhttp show proxy 当前的 WinHTTP 代理服务器设置: 直接访问(没有代理服务器)。查看网络端口占用:PS C:\Users\yuanz\Desktop\scraper-wjw netstat -ano | findstr 25378 TCP 127.0.0.1:25378 0.0.0.0:0 LISTENING 82344netstat -ano列出所有端口a 所有连接和监听端口n 以数字格式显示不反查域名o 显示 PID哪个程序占用| findstr 25378过滤包含 “25378” 的行TCP: 协议类型127.0.0.1:23578: 本机监听端口253780.0.0.0:0: 无特定远端连接表示监听状态LISTENING: 端口正在被程序监听82344: 占用这个端口的进程 PIDtasklist用于列出当前所有运行中的程序任务管理器的命令行版本:PS C:\Users\yuanz\Desktop\scraper-wjw tasklist | findstr 82344 SSTap.exe 82344 Console 2 25,892 KPID 82344的进程是SSTap.exe端口 25378 是 SSTap 提供的本地代理端口HTTP/SOCKS 本地监听大模型 APIAIIAI: https://api.aiiai.top/GalaAPI: https://www.galaapi.com/MCP (Model Context Protocol)MCP 是 OpenAI 在 2024 年提出的一个 标准化协议主要用来让 AI 模型如 ChatGPT、Gemini 等和外部工具 / 数据源 / 插件 进行交互。Cursor / Claude Desktop MCP Client自己编写的 Python FastMCP 程序 MCP Server用 Python 写 MCP Server 时想触发 Cursor 调用 (Call) 至少需要完成两件事写一个 MCP Server (Python / FastMCP)# server_fastmcp.py from mcp.server.fastmcp import FastMCP import httpx app FastMCP(BAS Security Platform) app.tool() async def create_attack_task(...): ... return 任务创建成功启动 server:uv run server_fastmcp.py让 Cursor 识别这个 MCP ServerCursor 支持 MCP需要在 Cursor 里创建一个 MCP 配置文件.cursor/mcp.json:{ servers: [ { name: bas-mcp, command: [python, server_fastmcp.py], type: stdio } ] }MCP Client 的职责就是负责调用call/invoke MCP Server 暴露出来的工具tools、资源resources、提示模板prompts等能力。换句话说MCP Server 工具提供者提供能力MCP Client 调用者消费能力LLMChatGPT、Claude、Cursor 内置模型则是运行在 MCP Client 里的一部分它会根据对话推理出“需要调用哪个 tool”然后由 MCP Client 发起调用。┌───────────────────────────────┐ │ MCP Client │ │ (Cursor / Claude / VSCode) │ │ │ │ - 解析用户输入 │ │ - 判断是否要调用 tool │ │ - 发送 MCP Request → │ └──────────────┬────────────────┘ │ (MCP Protocol) ▼ ┌───────────────────────────────┐ │ MCP Server │ │ (你写的 server.py / Node.js) │ │ │ │ - mcp.tool() 暴露工具 │ │ - 执行业务逻辑 │ │ - 返回结果给 Client │ └───────────────────────────────┘一个完整的 BAS MCP 示例:假设MCP Server 文件名为bas_server.pybas_server.py中有一个 tool:app.tool() async def start_attack(type: str, target: str) - str: return bas.start(type, target)还有更多 tool比如get_status(task_id)那么 Cursor 的 MCP 配置文件 (mcp.json) 应该是:{ servers: [ { name: bas-mcp, // MCP Server 在 Cursor 左侧面板中的名字自定义即可 type: command, // 告诉 Cursor这个 MCP server 是通过子进程stdio启动的 command: python, // Cursor 会用这个命令启动 server args: [bas_server.py], // 代表 MCP Server 执行python bas_server.py env: { BAS_API_URL: http://localhost:8080, BAS_TOKEN: your-secret-token } } ] }当我在 Cursor 对话框中输入“请帮我对 192.168.0.5 发起 SQL 注入攻击”工具触发流程是:CursorMCP Client内置的 LLM 自动生成 MCP 调用call tool start_attack({type:sql_injection,target:192.168.0.5})