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 时,DynamicFetcher的cdp_url参数就是完成这件事的入口。指定该参数后,Scrapling 不再启动新的浏览器实例,而是通过 Chrome DevTools Protocol(CDP)连接并控制这个已有的浏览器。本文覆盖从环境准备、本地/远程两种连接方式,到会话复用与结果验证的完整操作路径。
准备条件
Scrapling 要求 Python 3.10 或更高版本。使用DynamicFetcher需要先安装 fetchers 扩展,再安装浏览器依赖:
pip install "scrapling[fetchers]" scrapling install # normal install scrapling install --force # force reinstallscrapling 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 模式下不生效
由于浏览器已经在运行,只在启动浏览器时才生效的选项会被忽略:headless、real_chrome、executable_path(文档在 docs/ai/mcp-server.md 的 Connecting to Remote Browsers 一节对此有说明,且底层实现中启动参数也仅在未设置cdp_url时才拼接,见 scrapling/engines/_browsers/_base.py)。其余参数仍然有效,例如locale、useragent、proxy、cookies、timezone_id,因为每个会话会在远程浏览器上创建自己的浏览器上下文。
可选分支:MCP Server 的 open_session
如果你通过 Scrapling 的 MCP Server 使用浏览器工具,open_session同样接受 CDP 地址,支持dynamic与stealthy两种会话类型,返回的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),仅供参考