Scrapling DynamicFetcher 如何通过 cdp_url 连接远程或已运行的浏览器
2026/9/9 22:54:22 网站建设 项目流程

Scrapling DynamicFetcher 如何通过 cdp_url 连接远程或已运行的浏览器

【免费下载链接】Scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!项目地址: https://gitcode.com/GitHub_Trending/sc/Scrapling

当你要抓取的动态页面需要借助一个已经跑起来的浏览器——比如本机带着调试端口启动的 Chrome,或者托管浏览器服务商提供的远程实例——而不是让 Scrapling 在本地再拉起一个 Chromium 时,DynamicFetchercdp_url参数就是完成这件事的入口。指定该参数后,Scrapling 不再启动新的浏览器实例,而是通过 Chrome DevTools Protocol(CDP)连接并控制这个已有的浏览器。本文覆盖从环境准备、本地/远程两种连接方式,到会话复用与结果验证的完整操作路径。

准备条件

Scrapling 要求 Python 3.10 或更高版本。使用DynamicFetcher需要先安装 fetchers 扩展,再安装浏览器依赖:

pip install "scrapling[fetchers]" scrapling install # normal install scrapling install --force # force reinstall

scrapling install会下载所有浏览器以及它们的系统依赖项和 fingerprint 处理依赖。

连接方式本身没有额外的本地浏览器要求:既然浏览器已经在运行,cdp_url指向它即可。cdp_url的取值必须满足 CDP URL 校验规则——必须以ws://wss://http://https://开头,且必须包含有效主机名,否则抛出ValueError,具体校验逻辑见 scrapling/engines/_browsers/_validators.py。

连接自启动的本地浏览器

在终端中用远程调试端口启动 Chrome:

chrome --remote-debugging-port=9222

该端口的 HTTP 地址就是cdp_url的取值。若浏览器在另一台机器上运行,则换成对应主机的地址:

from scrapling.fetchers import DynamicFetcher page = DynamicFetcher.fetch('https://example.com', cdp_url='http://localhost:9222')

异步版本同理,将fetch换成async_fetch并用await调用。

连接托管服务商的 WebSocket 端点

如果浏览器由托管服务商管理,服务商提供的是 WebSocket 端点(ws:///wss://),直接把它传给cdp_url

page = DynamicFetcher.fetch('https://example.com', cdp_url='ws://localhost:9222')

两种端点形态(ws:///wss://http:///https://)均可使用,区别只在于浏览器的来源:前者是服务商分配的端点,后者通常是你自己带调试端口启动的浏览器。

用会话复用同一个远程浏览器

需要连续抓取多个页面时,把cdp_url放到会话级配置,DynamicSession/AsyncDynamicSession接受与fetch相同的全部参数,所有请求会在远程浏览器上复用同一配置:

from scrapling.fetchers import DynamicSession with DynamicSession(cdp_url='http://localhost:9222') as session: page1 = session.fetch('https://example1.com') page2 = session.fetch('https://example2.com') page3 = session.fetch('https://dynamic-site.com') # 所有请求复用同一浏览器实例

如果远程页面依赖 JavaScript 渲染,可以在会话或单次请求上叠加network_idle=True(网络空闲至少 500 ms 才视为完成)、wait_selector='.quote'等等待参数,用法与本地模式完全一致,参数含义参考 docs/fetching/dynamic.md 的完整参数表。

验证连接是否成功

请求返回的是一个Response对象,与本地模式没有区别。判断连接成功的路径是:fetch未抛出异常并返回页面后,按常规方式提取内容。例如下载文件时body属性总是返回bytes

page = DynamicFetcher.fetch('https://raw.githubusercontent.com/D4Vinci/Scrapling/main/docs/assets/main_cover.png', cdp_url='http://localhost:9222') with open(file='main_cover.png', mode='wb') as f: f.write(page.body)

或者用 CSS 选择器确认动态内容已加载:

page = DynamicFetcher.fetch( 'https://example.com/dynamic', cdp_url='http://localhost:9222', network_idle=True, wait_selector='.content' ) content = page.css('.content')

提取到目标内容,即说明 CDP 连接与页面抓取均正常。

哪些参数在 CDP 模式下不生效

由于浏览器已经在运行,只在启动浏览器时才生效的选项会被忽略:headlessreal_chromeexecutable_path(文档在 docs/ai/mcp-server.md 的 Connecting to Remote Browsers 一节对此有说明,且底层实现中启动参数也仅在未设置cdp_url时才拼接,见 scrapling/engines/_browsers/_base.py)。其余参数仍然有效,例如localeuseragentproxycookiestimezone_id,因为每个会话会在远程浏览器上创建自己的浏览器上下文。

可选分支:MCP Server 的 open_session

如果你通过 Scrapling 的 MCP Server 使用浏览器工具,open_session同样接受 CDP 地址,支持dynamicstealthy两种会话类型,返回的session_id再传给 fetch 和 screenshot 工具使用;wss://服务商端点与http://localhost:9222自启动端点的用法和上文一致,详见 docs/ai/mcp-server.md。

相关文档

  • docs/fetching/dynamic.md:DynamicFetcher全部参数与示例
  • docs/fetching/stealthy.md:StealthyFetcher同样支持cdp_url,并在此之外提供反检测选项
  • docs/ai/mcp-server.md:MCP Server 连接远程浏览器的说明

【免费下载链接】Scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!项目地址: https://gitcode.com/GitHub_Trending/sc/Scrapling

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询