浏览器自动化通过 MCP:使用 Scrapeless 驱动云浏览器
Advanced Bot Mitigation Engineer
TL;DR:
- Scrapeless MCP 服务器暴露了 16 个
browser_*工具,这些工具驱动一个托管的云浏览器,因此脚本可以点击、滚动、导航并读取渲染的页面,而无需本地的 Chromium。 browser_create返回一个会话 ID,并且后续的每一个调用,如browser_goto、browser_get_text、browser_close,都携带该 ID 以对同一个浏览器进行操作。- 这些工具可以渲染 JavaScript:导航到一个客户端渲染的报价页面并读取会返回 10 个渲染的报价。
- 这是
scrape_markdown的对应功能:对于一个能在一次调用中获取的页面,使用内容工具;而当页面需要交互或等待时,则使用浏览器工具。 - 不涉及模型提供者密钥,因为浏览器工具是通过 MCP 会话直接调用的。
- 从 Scrapeless 免费计划 开始,驱动你的第一个云浏览器。
某些页面不会在单个请求中返回其内容。数据在点击、滚动或等待脚本运行后出现,而一次性获取在这些事件发生之前返回了外壳。Scrapeless MCP 服务器通过一组浏览器工具来应对这一挑战,这些工具通过模型上下文协议驱动一个真实的云浏览器,因此你的代码发出高层次的操作,而浏览器在 Scrapeless 基础设施上运行。
本指南连接到服务器,列出浏览器工具,并从创建到渲染读取再到清理关闭驱动一个会话,所有步骤都经过与实时服务器和实时浏览器的验证。此过程中没有模型参与,因此这里没有任何缺口。
为什么选择 Scrapeless 浏览器工具
Scrapeless MCP 服务器提供 21 个工具,其中 16 个是浏览器控制工具:创建和拆除、导航、点击、输入、滚动、按键、截图和等待。它们驱动一个托管的 Scrapeless 云浏览器,这类似于本地自动化栈从 Chrome DevTools 协议 获取的编程控制,只不过浏览器是远程的,并且没有任何安装需求。有关该云浏览器及其并发模型的详细信息,请参见 Scrapeless 抓取浏览器 文章。
这些工具与内容工具并列。scrape_markdown 在一次调用中返回一个页面,当仅仅获取一次就足够时,它是正确的选择。browser_* 工具适用于需要会话的页面:交互、等待,然后读取。
前提条件
- Python 3.10 或更高版本。
- 来自仪表板的 Scrapeless API 密钥,导出为
SCRAPELESS_API_KEY。 - 不需要本地浏览器。这些工具驱动 Scrapeless 上的云浏览器。
安装
安装 MCP 客户端库。
bash
pip install mcp
在 shell 中设置你的 Scrapeless 密钥。在运行时使用真实密钥,并将占位符排除在源代码之外。
bash
export SCRAPELESS_API_KEY="sk_your_key_here"
连接并列出浏览器工具
打开与服务器的可流式 HTTP 连接,初始化会话并列出工具。筛选 browser_ 前缀显示云浏览器提供的交互词汇。
python
import asyncio
import os
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def main() -> None:
async with streamablehttp_client(
"https://api.scrapeless.com/mcp", headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]}
) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
names = sorted(tool.name for tool in (await session.list_tools()).tools)
browser_tools = [name for name in names if name.startswith("browser_")]
print("工具总数:", len(names))
print("浏览器工具总数:", len(browser_tools))
print(", ".join(browser_tools))
asyncio.run(main())
服务器报告 21 个工具,其中 16 个是浏览器控制工具。
text
工具总数: 21
浏览器工具总数: 16
browser_click, browser_close, browser_create, browser_get_html, browser_get_text, browser_go_back, browser_go_forward, browser_goto, browser_press_key, browser_screenshot, browser_scroll, browser_scroll_to, browser_snapshot, browser_type, browser_wait, browser_wait_for
传输和消息层遵循 模型上下文协议规范,该协议以 JSON-RPC 2.0 规范 为基础。
驱动浏览器会话
浏览器工具是有状态的,所以模式是创建、操作、读取、关闭。browser_create在其文本中返回一个会话ID;捕获它并传递给每个后续调用。示例导航到一个由JavaScript渲染的报价页面并读取渲染的文本。
python
import asyncio
import os
import re
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
def text_of(result) -> str:
return "\n".join(block.text for block in result.content if getattr(block, "type", None) == "text")
async def main() -> None:
async with streamablehttp_client(
"https://api.scrapeless.com/mcp", headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"]}
) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
created = text_of(await session.call_tool("browser_create", {}))
session_id = re.search(r"ID:\s*([a-z0-9-]+)", created).group(1)
print("session created:", bool(session_id))
await session.call_tool("browser_goto", {"sessionId": session_id, "url": "https://quotes.toscrape.com/js/"})
text = text_of(await session.call_tool("browser_get_text", {"sessionId": session_id}))
print("quotes rendered:", text.count("Tags:"))
print("contains a quote:", "The world as we have created it" in text)
await session.call_tool("browser_close", {"sessionId": session_id})
print("session closed: True")
asyncio.run(main())
报价页面通过JavaScript绘制其内容,云浏览器运行它,因此browser_get_text返回渲染的报价,而不是一个空壳。
text
session created: True
quotes rendered: 10
contains a quote: True
session closed: True
这10个渲染的报价证明浏览器执行了页面的JavaScript;对同一URL的普通获取返回零。从这里开始,browser_click、browser_type和browser_scroll扩展了会话,以便在内容出现之前与需要交互的页面进行交互,而browser_close在工作完成时释放云浏览器。
结论
Scrapeless MCP浏览器工具将云浏览器转变为任何MCP客户端可以调用的一组高级操作。连接、列出16个浏览器工具、创建会话、导航、读取渲染文本和关闭,所有这些都不需要本地浏览器,也不需要模型介入。当一次调用获取页面时,可以使用scrape_markdown,而当页面需要会话释放其内容时,则使用浏览器工具。从上面的脚本出发,添加目标所需的点击、输入和滚动。
创建一个免费的Scrapeless账户以获取API密钥,并在计划定期任务时查看Scrapeless定价。
常见问题
问:Scrapeless MCP浏览器工具需要本地浏览器吗?
不需要。browser_*工具驱动Scrapeless上的托管云浏览器,因此脚本控制真实浏览器,而无需本地安装Chromium。这与本地自动化堆栈的区别在于:浏览器在远程运行,您通过MCP会话发出操作。
问:浏览器工具如何在调用之间保持状态?
browser_create返回会话ID,所有后续调用都会在其sessionId参数中传递该ID。该ID将browser_goto、browser_get_text和交互工具绑定到同一个浏览器,这就是如何使多步骤流程在一个页面上操作,而不是在每次调用时重新开始的方法。
问:这与scrape_markdown有什么不同?
scrape_markdown一次获取并返回一个页面,这在内容可以读取时是理想的。浏览器工具为需要点击、输入、滚动或在内容存在之前等待的页面打开有状态的会话,并返回内容工具无法在这些页面上访问的渲染结果。
问:浏览器工具能渲染JavaScript吗?
可以。云浏览器执行页面的脚本,因此导航到客户端渲染的页面并调用browser_get_text将返回渲染的内容,在验证运行中是JavaScript报价页面的10个报价。对同一页面的普通获取返回其中没有任何内容。
问:有哪些浏览器工具可用?
服务器暴露了16个工具:browser_create、browser_close、browser_goto、browser_go_back、browser_go_forward、browser_get_text、browser_get_html、browser_click、browser_type、browser_press_key、browser_scroll、browser_scroll_to、browser_screenshot、browser_snapshot、browser_wait和browser_wait_for。它们共同覆盖导航、互动、等待和读取。
问:使用浏览器工具需要模型提供者密钥吗?
不。浏览器工具是通过 MCP 会话直接调用的,只需要 Scrapeless API 密钥,因为没有模型决定调用哪个工具。如果将这些工具交给一个代理框架并让模型驱动它们,那么模型提供者密钥才会有意义。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



