`BrowserFetchHttpClient`: 使用已登录的页面作为 HTTP 客户端
作者: janbuchar创建于 2026年9月18日更新于 2026年9月18日
标签t-tooling
- 与 #3040、#3283 以及讨论 #3217 有关; crawlee-Python 中的先进技术:
PlaywrightHttpClient(apify/crawlee-Python#1134) - 重复的模式: 在浏览器中打开一个网站(登录、防止机器人),然后从该页面使用内页fetch()获取许多 API/HTML URL,因为CheerioCrawler被阻止,而浏览器的 TLS/HTTP2 指纹、Cookie 和服务工作者却没有。今天人们在PlaywrightCrawler处理器中手动实现爬虫循环(fetchNextRequest、reclaimRequest/重试计数)。 - 使用 v4BaseHttpClient协议,这是一个约 50 行的客户端:fetch()运行page.evaluate(fetch(...)), 重建ResponseWithUrl, 并在 401 时重新运行login回调。插入到CheerioCrawler中作为httpClient后,它返回队列、重试、统计数据、事务、$/json和真正的并发性(在同一页面上同时调用evaluate(fetch)都没有问题,没有任何导航)。使用重试、四路并发和中途重新登录进行了本地验证。 - 值得记录的约束: 与登录留下的页面共享同源(或 CORS); 禁止的头部(Cookie、User-Agent)和Set-Cookie是不可见的,因此浏览器容器具有权威性;CustomFetchOptions中的proxyUrl/fingerprint被忽略(浏览器上下文决定)。 - Python 已经具备一半的功能:PlaywrightHttpClient是PlaywrightCrawler中send_request的默认http_client,通过上下文变量绑定到当前页面,并调用browser_context.request.fetch()(APIRequestContext)。它共享上下文的 Cookie 和代理,没有同源限制,但它是 Playwright 自己的 HTTP 堆栈,而不是浏览器的(指纹 TODO: apify/crawlee-Python#1055),而crawl()/stream()为NotImplementedError,因此无法驱动爬虫。这里有两种值得区分的风格: 以APIRequestContext为基础(与 Python 保持一致,对于在浏览器爬虫中使用sendRequest来说是一个很好的默认值)和以内页fetch()为基础(浏览器 TLS、源绑定) - 第二种是取代手动编写的循环的方式。 - 将其放在FetchHttpClient旁边,或者在 HTTP 客户端指南中记录此模式;它更直接地回答了"在登录后进行抓取"的问题,而不是页面级登录辅助程序。
内容来源: apify/crawlee