剧作家 + 无痕抓取浏览器:基于 CDP 的云 Chromium
Expert in Web Scraping Technologies
剧作家驱动一个浏览器;Scrapeless Scraping Browser 为其提供了一个已经存在于云端的浏览器,它支持 Chrome DevTools 协议并具有住宅出口。您的 connect_over_cdp 调用通过 wss://browser.scrapeless.com/api/v2/browser 连接到一个真实的 Chromium 会话,而不是一个需要您安装、打补丁并避免引人注意的 Chrome。
这一单一的交换——本地启动变成远程连接——就是整个集成。您已经熟悉的 Playwright 脚本保持不变。变化的是浏览器运行的位置和其出口的 IP。本指南将 Python Playwright 连接到 Scrapeless Scraping Browser,渲染一个 JavaScript 页面,从中读取结构化数据,并将请求固定到特定国家,所有代码路径都是在实时端点上执行的。
为什么选择 Scrapeless Scraping Browser 作为 Playwright 的浏览器
Scraping Browser 是一个通过 CDP 访问的云端 Chromium 会话,因此 Playwright 对其的处理方式与它自己启动的浏览器完全相同。不需要下载本地 Chrome,没有隐藏的标志,也没有与您机器上的内存竞争的浏览器进程。您连接后,会获得一个 Browser 对象,Playwright 的完整 API 可以在其上工作。
在抓取中,有三个属性很重要。会话在服务器端渲染 JavaScript,因此由客户端脚本完全构建的页面在送达时其 DOM 已经填充。连接具有您可以固定到某个国家的住宅出口,因此一个地理限制内容的页面看到的是您请求的地区的流量。而且因为浏览器是远程的,运行您脚本的机器从不需要 GPU、显示器或打过补丁的 Chromium 构建——本地部分只是一个通过 Chrome DevTools Protocol 进行通信的 websocket 客户端。
先决条件
您需要 Python 3.9 或更新版本,playwright 包,以及 Scrapeless API 密钥。您可以在 app.scrapeless.com 的免费计划中获取密钥;仪表板在 API 密钥页面显示它。密钥通过连接 URL 作为 token 查询参数传递,因此请将其保存在环境变量中,而不是源代码中的字面值。
您不需要本地浏览器二进制文件。connect_over_cdp 打开到已经存在于云中的浏览器的 websocket,因此通常的 playwright install chromium 步骤在这里是可选的——渲染发生在 Scrapeless 的连接端。
安装
在您的项目中安装 Playwright 客户端:
bash
pip install playwright
将您的密钥放入环境中,以便它不会出现在代码或日志中:
bash
export SCRAPELESS_API_KEY="your_scrapeless_api_key"
将 Playwright 连接到云浏览器
构建 websocket URL,然后将其传递给 connect_over_cdp。端点是 wss://browser.scrapeless.com/api/v2/browser,并且它读取三个查询参数:您的密钥的 token、浏览器保持活动的时间(单位:秒)的 sessionTTL,以及出口地区的 proxyCountry。websocket 传输本身遵循 WebSocket 协议,而 Playwright 的 浏览器类型连接 API 在其上运行 CDP:
python
import os
from urllib.parse import urlencode
from playwright.sync_api import sync_playwright
API_KEY = os.environ["SCRAPELESS_API_KEY"]
def scraping_browser_url(proxy_country="US", session_ttl=180):
params = urlencode({
"token": API_KEY,
"sessionTTL": session_ttl,
"proxyCountry": proxy_country,
})
return f"wss://browser.scrapeless.com/api/v2/browser?{params}"
sessionTTL 限制单个浏览器的存活时间;对于单个页面,短时间值很好,而较长的时间则在多个步骤流程中保持浏览器处于活动状态。proxyCountry 使用两位字母代码。其他方面都是普通的 Playwright。
渲染 JavaScript 页面并提取
将连接的浏览器指向一个在客户端构建内容的页面,当导航完成时,渲染的 DOM 已经存在。下面的演示页面发送一个空容器并用 JavaScript 填充它;普通的 HTTP 获取返回零行,而云浏览器返回所有十行,因为它首先运行了脚本——您查询的 DOM 是 HTML 解析和脚本模型 执行后生成的。
python
import os
from urllib.parse import urlencode
from playwright.sync_api import sync_playwright
API_KEY = os.environ["SCRAPELESS_API_KEY"]
def scraping_browser_url(proxy_country="US", session_ttl=180):
params = urlencode({"token": API_KEY, "sessionTTL": session_ttl, "proxyCountry": proxy_country})
return f"wss://browser.scrapeless.com/api/v2/browser?{params}"
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(scraping_browser_url())
page = browser.new_page()
page.goto("https://quotes.toscrape.com/js/", wait_until="networkidle")
quotes = page.query_selector_all(".quote")
print("quote blocks on JS-rendered page:", len(quotes))
print("first author:", quotes[0].query_selector(".author").inner_text())
browser.close()
运行时打印计数和第一个记录:
text
JS 渲染页面上的引用块数量: 10
第一个作者: 阿尔伯特·爱因斯坦
wait_until="networkidle" 的选择适合那些内容通过一系列脚本驱动请求到达的页面。在一个从不安静的分析密集型页面上,切换到 domcontentloaded 并明确等待您关心的选择器,以便运行不会因为等待一个从不闲置的网络而挂起。
在免费计划上获取您的 API 密钥: app.scrapeless.com
将出口限制到一个国家
更改一个参数,请求将从不同的国家发出。proxyCountry 代码选择居住的出口区域,这决定了网站看到的 IP 地址以及对于地理限制页面所提供的内容。从两个区域读取 IP 回显端点显示退出地址在变化,而脚本则无移动:
python
import os, json
from urllib.parse import urlencode
from playwright.sync_api import sync_playwright
API_KEY = os.environ["SCRAPELESS_API_KEY"]
def scraping_browser_url(country):
return "wss://browser.scrapeless.com/api/v2/browser?" + urlencode(
{"token": API_KEY, "sessionTTL": 180, "proxyCountry": country})
with sync_playwright() as p:
for country in ("US", "GB"):
浏览器 = p.chromium.connect_over_cdp(scraping_browser_url(country))
页面 = 浏览器.new_page()
页面.goto("https://api.ipify.org?format=json", wait_until="domcontentloaded")
ip = json.loads(页面.inner_text("pre, body"))["ip"]
print(f"proxyCountry={country} -> 云出口 IP {ip}")
浏览器.close()
这两个连接从两个不同的地址离开,均不是您机器的地址:
text
proxyCountry=US -> 云出口 IP 24.93.178.230
proxyCountry=GB -> 云出口 IP 109.149.20.197
这就是与本地 Playwright 运行的实际差异:浏览器及其出口 IP 都位于 Scrapeless 这一边,因此速率限制和地理规则附加到固定区域,而不是您的工作站。
处理会话
连接后的所有内容都是标准 Playwright,因为您持有的对象是一个普通的 Browser。页面.screenshot() 捕获云 Chromium 渲染的内容,页面.click() 和 页面.fill() 驱动表单,而 页面.evaluate() 在页面上下文中运行 JavaScript。一个连接可以打开多个页面,关闭浏览器会结束远程会话;如果您设置了很长的 sessionTTL 并在不关闭的情况下断开,则会话在时间到达时会自动过期。
保持您的自动化在网站声明的边界内。阅读目标的条款及其 机器人排除协议 文件,仅请求公共页面,并保持并发适度。在云中渲染一个页面并不会改变网站允许您收集的内容。有关发现和提取模式的更广泛的介绍,该指南 从零开始构建网络爬虫 与此指南搭配良好。
结论
将 Playwright 连接到 Scrapeless 爬虫浏览器可以保持您的脚本并更换运行时。您仍然编写 goto、query_selector_all 和 screenshot;执行这些操作的浏览器是一个具有居住出口的云 Chromium 会话,可以按国家进行固定,通过单个 CDP websocket 访问。上面的两个运行 —— 来自 JavaScript 页面的十个引用,来自两个区域的两个出口 IP —— 是整个合同:在服务器端呈现,正常提取,控制流量的离开位置。在 Scraping Browser 产品页面 上阅读当前能力,并在 定价页面 上检查会话和出口限制与您的使用量。
加入我们的社区以声明免费计划并与其他开发人员比较笔记,构建浏览器自动化:Discord · Telegram。
常见问题
问:我需要安装 Chrome 或运行 playwright install 才能使用 Scraping Browser 吗?
不。浏览器在Scrapeless的云端运行,因此connect_over_cdp只需要playwright客户端包。本地浏览器下载仅在您还在自己的机器上启动浏览器时才重要。
问:哪些Playwright绑定可以连接到它?
任何暴露了connect-over-CDP方法的Playwright绑定都可以工作,因为该端点使用Chrome DevTools协议。这里的示例使用Python的sync_playwright,相同的URL适用于异步API和Node绑定。
问:我该如何使请求来自特定国家?
在连接URL中设置proxyCountry查询参数为两个字母的国家代码。连接将从该地区的住宅出口退出,这正是地理限制页面根据其内容进行关键定位的地方。
问:这与本地运行Playwright有什么不同?
本地运行将在您的机器上启动Chrome并从您的IP退出。Scraping Browser在云中运行Chromium,并具有住宅出口,因此您完全跳过本地浏览器,并通过查询参数控制出口区域。
问:浏览器会话保持开放多长时间?
sessionTTL参数设置以秒为单位的生命周期。关闭浏览器会立即结束会话;如果您在未关闭的情况下断开连接,则会话将在TTL到期时自行结束。
问:我可以截屏和填写表单,还是只能读取DOM?
完整的Playwright API可用。由于连接的对象是普通的Browser,page.screenshot()、page.click()、page.fill()和page.evaluate()的行为与本地相同。
问:对于JavaScript页面,我应该使用哪种等待策略?
对于内容在短时间内以一阵请求到达的页面,请使用networkidle,而对于保持后台连接打开的页面,请使用domcontentloaded加上对已知选择器的显式等待。第二种模式避免了在永远不会安静的网络上等待。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



