Skyvern + 无刮取浏览器:云中的AI代理
Advanced Bot Mitigation Engineer
Skyvern 是一个浏览器代理,通过查看页面来决定该做什么:它截取屏幕截图,视觉模型读取它,代理根据所见进行点击、输入或读取。将该代理的浏览器指向 Scrapeless Scraping Browser,通过 Chrome DevTools Protocol,它驱动一个云端的 Chromium,而不是在您自己的机器上运行和隐藏的浏览器。
这一对搭配是自然而然的。Skyvern 提供推理——将简明的目标转化为一系列浏览器操作——而 Scraping Browser 提供代理所作用的运行时环境。本指南安装了Skyvern 本地运行时,通过 CDP 连接指向 Scrapeless Scraping Browser,给出一个一句话的目标,并观察它完成任务,代理的运行通过云浏览器实时执行。
为什么在 Scrapeless Scraping Browser 上运行 Skyvern
一个视觉代理的有效性仅与其所驱动的浏览器有关。将 Skyvern 在本地的 Chromium 上运行时,您拥有整个运行时:浏览器进程、其内存、单一出口 IP 以及繁忙网站对此 IP 的任何操作。将其指向 Scraping Browser 时,这一部分将转移到云端——代理通过 CDP 连接到 Scrapeless 渲染和维护的 Chromium 会话,具有您可以绑定至某个国家的住宅出口。它附加的连接详细信息在 Scraping Browser 文档 中。
代理的功能没有改变。Skyvern 仍然截取屏幕、推理和行动;它只是通过 WebSocket 在云浏览器内行动,而不是本地浏览器。这使得推理保持在您的端,而浏览器群保持在 Scrapeless 一侧,当一个目标跨越多个页面或网站对其服务的流量有选择性时,这是您想要的分离方式。
前提条件
您需要 Python 3.11 或更新版本、Skyvern 的本地扩展、Scrapeless API 密钥用于浏览器会话,以及用于视觉模型的密钥。在 app.scrapeless.com 的免费计划中获取 Scrapeless 密钥。Skyvern 的本地模式在进程内运行代理,因此以下运行不需要单独的服务器或数据库。
安装
使用 local 扩展安装 Skyvern,该命令拉取内嵌的代理运行时:
bash
pip install "skyvern[local]"
配置
两个密钥需要放在环境变量中:用于浏览器的 Scrapeless 密钥和代理的视觉调用的模型密钥。
bash
export SCRAPELESS_API_KEY="your_scrapeless_api_key"
export OPENROUTER_API_KEY="your_model_api_key"
将 Skyvern 指向云浏览器并运行任务
Skyvern 从设置中读取其浏览器和模型配置,因此在构建客户端之前在代码中设置它们:BROWSER_TYPE=cdp-connect 告诉 Skyvern 附加到现有浏览器,BROWSER_REMOTE_DEBUGGING_URL 是 Scrapeless CDP 终端,OpenRouter 设置选择一个具有视觉能力的模型。然后 Skyvern.local() 在进程内运行代理,run_task 以句子形式接受目标。连接通过Chrome DevTools Protocol进行,路径是通过WebSocket 协议:
python
import os
from urllib.parse import urlencode
TOKEN = os.environ["SCRAPELESS_API_KEY"]
CDP_URL = "wss://browser.scrapeless.com/api/v2/browser?" + urlencode(
{"token": TOKEN, "sessionTTL": 300, "proxyCountry": "US"})
os.environ.update({
"BROWSER_TYPE": "cdp-connect",
"BROWSER_REMOTE_DEBUGGING_URL": CDP_URL,
"ENABLE_OPENROUTER": "true",
"OPENROUTER_MODEL": "google/gemini-2.5-flash-lite",
"LLM_KEY": "OPENROUTER",
"LLM_CONFIG_SUPPORT_VISION": "true",
})
import asyncio
from skyvern import Skyvern
async def main():
skyvern = Skyvern.local(use_in_memory_db=True)
task = await skyvern.run_task(
prompt="找到页面上的第一条引用并报告其作者的名字。",
url="https://quotes.toscrape.com/",
wait_for_completion=True,
max_steps=3,
)
print("任务状态:", task.status)
print("引擎:", task.run_request.engine)
asyncio.run(main())
代理连接到云浏览器,完成目标并结束:
text
任务状态: 已完成
引擎: skyvern-1.0
在免费计划中获取您的 API 密钥:app.scrapeless.com
代理实际上做了什么
在那一行状态信息之后,Skyvern 针对 Scrapeless 浏览器运行其循环。它捕获了渲染页面的屏幕截图,将图像发送给视觉模型并附带目标,模型返回了一个动作——在这里,它识别出第一个引述及其作者已在屏幕上,并标记目标完成。对于需要交互的任务,相同的循环会点击按钮、填写字段或滚动,再次截图并重新读取,直到您设置的 max_steps。每一个动作都是在云 Chrome 浏览器内执行,而不是在您的机器上,连接中的 proxyCountry 决定了流量从哪里发出。
代表您行动的代理仍然在网站的边界内工作:指向公开页面,遵守网站条款及其机器人排除协议指令,并保持步骤预算适中。分工合作是关键:Skyvern 拥有决策权,而 Scraping Browser 拥有浏览器。对于同一运行时的其他代理框架,关于在 Scrapeless 上运行浏览器使用的操作指南则从不同的代理角度涉及相同的连接。
结论
Skyvern 将句子转化为浏览器动作,而 Scrapeless Scraping Browser 为这些动作提供了云运行时。使用 Scrapeless CDP 端点设置 BROWSER_TYPE=cdp-connect,运行 Skyvern.local() 与具备视觉功能的模型,代理驱动带有住宅出口的云 Chrome 浏览器——上面的运行端到端地完成了目标,任何地方都没有本地浏览器。请在Scraping Browser 产品页面上阅读运行时提供的内容,并在扩展之前与定价页面权衡代理音量,该音量同时消耗浏览器时间和模型令牌。
加入我们的社区以申请免费计划,并与其他开发浏览器代理的开发人员交流: Discord · Telegram。
常见问题解答
问:Skyvern 做了什么是脚本无法做到的?
Skyvern 决定行动,而不是由您编写代码。它对页面进行截图,视觉模型根据您的目标读取截图,代理选择点击、输入或读取的内容——因此它适应未见过的布局,而不是遵循您硬编码的选择器。
问:Skyvern 如何连接到 Scrapeless Scraping Browser?
通过 CDP 连接。设置 BROWSER_TYPE=cdp-connect 和 BROWSER_REMOTE_DEBUGGING_URL 为 Scrapeless 端点 wss://browser.scrapeless.com/api/v2/browser?token=...,Skyvern 附加到该云 Chrome 浏览器,而不是启动本地浏览器。
问:我需要一个 Postgres 数据库或运行中的服务器吗?
不需要。Skyvern.local(use_in_memory_db=True) 在进程内运行代理,且使用内存数据库,足以驱动任务。自托管的 Skyvern 服务仅需单独的服务器和 Postgres,而不是这里展示的本地运行。
问:代理使用哪个模型?
一个具有视觉功能的模型,因为代理对截图进行推理。示例通过 OpenRouter 路由到 google/gemini-2.5-flash-lite,并设置 LLM_CONFIG_SUPPORT_VISION=true;Skyvern 还通过相同设置支持 OpenAI、Anthropic、Gemini 和其他提供者。
问:我如何防止代理运行时间过长?
在任务上设置 max_steps。每一步是一个截图-推理-行动循环,因此小预算限制了在停止之前单个任务可以执行的操作数量和模型调用次数。
问:流量来自哪里?
来自 Scrapeless 云浏览器的住宅出口,而不是您的机器。连接 URL 上的 proxyCountry 参数将该出口固定到一个国家,这是地理限制页面内容的密钥所在。
问:我可以以相同的方式运行不同的代理框架吗?
可以。任何通过 CDP 连接到浏览器的代理都可以附加到同一 Scrapeless 端点,因此运行时在框架之间共享,而每个框架都有其自己的推理。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



