Documentation has been updated: see help center and changelog in one place.

Chrome

Unblocking Browser Chrome 提供在独立服务器上运行并使用住宅代理连接的高性能远程浏览器。这些浏览器环境快速、稳定且高度可配置,可作为本地浏览器基础设施的替代方案。

主要功能

  • 快速且稳定的性能

  • 任意代理国家选择

  • 兼容 Chrome DevTools Protocol (CDP)

连接详情

使用以下 WebSocket 端点连接到 UBC:

wss://ubc.oxylabs.io

基本用法

from playwright.sync_api import sync_playwright

username = "your-username"
password = "your-password"
endpoint = "ubc.oxylabs.io"
browser_url = f"wss://{username}:{password}@{endpoint}"

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(browser_url)
    page = browser.new_page()
    page.goto('https://example.com')
    browser.close()

美国代理基础设施

主要在美国运营的用户可以通过该特殊入口点直接连接位于美国的基础设施,以确保更快的加载时间和更高的浏览效率。要建立连接,请输入以下地址:

wss://ubc-us.oxylabs.io

代码示例:

from playwright.sync_api import sync_playwright

username = "your-username"
password = "your-password"
endpoint = "ubc-us.oxylabs.io"
browser_url = f"wss://{username}:{password}@{endpoint}"

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(browser_url)
    page = browser.new_page()
    page.goto('https://example.com')
    browser.close()

注意: 该解决方案主要缩短面向美国用户的响应时间,不应与代理地理位置选择混淆。关于地理位置选择的更多内容见下节。

国家选择

您可以通过在连接 URL 中添加 ?p_cc 参数来为您的浏览器会话指定国家。示例如下:

from playwright.sync_api import sync_playwright

username = "your-username"
password = "your-password"
endpoint = "ubc.oxylabs.io"
country = "US"  # 用所需的国家/地区代码替换
browser_url = f"wss://{username}:{password}@{endpoint}?p_cc={country}"

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(browser_url)
    page = browser.new_page()
    page.goto('https://example.com')
    browser.close()

如果未指定国家,系统将根据可用性自动分配。

浏览器参数

Unblocking Browser Chrome 接受以以下格式在连接 URL 中传递的额外浏览器参数: ?bargs=这些 GET 参数指定浏览器启动时应使用的命令行参数。

  1. 如果参数应具有值,使用 bargs=argname:argvalue;

  2. 如果参数只是一个标志,使用 bargs=flagname .

目前,Oxylabs Unblocking Browser Chrome 支持以下参数:

参数
描述

force-color-profile:<profile>

强制将所有显示器视为具有指定的色彩配置文件。

window-position:X,Y

指定初始窗口位置。

hide-scrollbars

阻止为网页内容创建滚动条——有助于获取一致的屏幕截图。

enable-features:<feature1>,<feature2>,<feature3>

以逗号分隔的要启用功能名称列表。

disable-notifications

禁用 Web 通知和 Push API。

使用示例:

from playwright.sync_api import sync_playwright

username = "your-username"
password = "your-password"
endpoint = "ubc.oxylabs.io"
browser_url = f"wss://{username}:{password}@{endpoint}/?bargs=force-color-profile:srgb&bargs=window-position:100,100"

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(browser_url)
    page = browser.new_page()
    page.goto('https://example.com')
    browser.close()

设备类型

您可以使用 ?p_device 参数自定义浏览器如何模拟不同的设备类型。此功能允许您模拟所选设备类型(桌面、移动、平板)的指纹,对于抓取响应式布局、移动专用内容或受设备影响的行为(例如 CAPTCHA 或 UI 元素)尤其有用。

可用 ?p_device 参数值:

  • desktop (默认) – 模拟标准桌面浏览器,具有全尺寸视口和桌面用户代理字符串。

  • mobile – 模拟智能手机体验,具有较小的屏幕分辨率、触控能力和移动用户代理。

  • tablet – 模拟平板设备,适合抓取中等尺寸布局和混合移动/平板界面。

例如:

wss://username:[email protected]?p_device=mobile

CAPTCHA 解决事件

当检测到 CAPTCHA 并正在解决时,Oxylabs 会在控制台记录一条消息。以下消息可能会被打印到控制台日志:

oxylabs-captcha-solve-start

当系统检测到 CAPTCHA 并开始解决时触发。

oxylabs-captcha-solve-end

当自动解算器成功解决 CAPTCHA 时触发。

oxylabs-captcha-solve-error

当自动解算器未能解决 CAPTCHA 时触发。

您可以订阅这些事件以暂停您的自动化,并仅在 CAPTCHA 成功处理后恢复。通常 CAPTCHA 解决最多需要 30 秒,具体取决于 CAPTCHA 的类型和复杂性,但在某些情况下可能需要更长时间,因此请为 CAPTCHA 解决预留足够时间。

查看下面示例,了解如何处理这些事件。

import asyncio
import time
from typing import Any

from playwright.async_api import async_playwright


# 填写用户名和密码
UB_USERNAME: str = ""
UB_PASSWORD: str = ""
UB_BROWSER_URL: str = f"wss://{UB_USERNAME}:{UB_PASSWORD}@ubc-us.oxylabs.io"


class UBScraper:
    def __init__(self) -> None:
        self.OXYLABS_CAPTCHA_START_MESSAGE: str = "oxylabs-captcha-solve-start"
        self.OXYLABS_CAPTCHA_DONE_MESSAGE: str = "oxylabs-captcha-solve-end"

        self.CAPTCHA_STARTED: bool = True
        self.CAPTCHA_SOLVED: bool = False

    async def handle_console(self, msg: Any) -> None:
        msg_args = msg.args

        for arg in msg_args:
            log_message = str(arg)
            print(log_message)

            if log_message.strip() == self.OXYLABS_CAPTCHA_START_MESSAGE:
                print("Captcha started to solve!")
                self.CAPTCHA_STARTED = True
            if log_message.strip() == self.OXYLABS_CAPTCHA_DONE_MESSAGE:
                print("Captcha finished solving!")
                self.CAPTCHA_SOLVED = True

    async def wait_for_captcha_completion(self, timeout_seconds: int = 20) -> bool:
        start_time = time.time()
        check_interval = 1

        print(f"Waiting for captcha to complete (timeout: {timeout_seconds}s)")

        while not self.CAPTCHA_SOLVED:
            elapsed = time.time() - start_time

            if elapsed > timeout_seconds:
                print(f"Timeout after {elapsed:.1f}s waiting for captcha")
                return False

            if int(elapsed) % 5 == 0:
                print(f"Still waiting for captcha... ({int(elapsed)}s)")

            await asyncio.sleep(check_interval)

        completion_time = time.time() - start_time
        print(f"Captcha completed after {completion_time:.1f}s")
        return True

    async def scrape(self, url: str) -> None:
        async with async_playwright() as playwright:
            start = time.time()

            browser = await playwright.chromium.connect_over_cdp(
                UB_BROWSER_URL,
            )

            print(f"Connecting to browser took {time.time() - start:.2f} seconds")
            context = browser.contexts[0]
            page = await context.new_page()

            page.on("console", self.handle_console)

            await page.goto(url)

            captcha_completed = await self.wait_for_captcha_completion(
                timeout_seconds=30
            )

            if not captcha_completed:
                raise Exception("Failed to solve")

            await page.screenshot(path="cf_captcha_check_.png")
            print("done")

            input("Enter to close")


if __name__ == "__main__":
    import asyncio

    # 用您选择的 URL 替换
    URL = "https://www.indeed.com/cmp/Bank-of-the-West/reviews?lang=any&fcountry=ALL&sort=date"

    asyncio.run(UBScraper().scrape(URL))

动态 CAPTCHA 解决

默认情况下,Unblocking Browser 会在页面加载时自动检测并立即解决 CAPTCHA。但有些网站会在后期阶段显示 CAPTCHA,例如提交表单时的弹出窗口或特定用户交互之后。

Unblocking Browser 允许您在会话中的任何时刻手动触发 CAPTCHA 检测和解决。要手动触发 CAPTCHA 解决,请执行以下代码向 window 对象发送一条消息:

window.postMessage({action: 'solve_captcha', type: '<captcha type>'}, '*')

支持的 CAPTCHA 类型包括:

  • hcaptcha

  • recaptcha

  • turnstile (Cloudflare CAPTCHA)

用法示例(Playwright / Puppeteer JavaScript):

// ...
await page.click('#form-submit');
// 现在我们知道应该出现 CAPTCHA
await page.evaluate(() => {
  window.postMessage({action: 'solve_captcha', type: 'recaptcha'}, '*')
});
// 像常规情况一样关注 `oxylabs-captcha-start` 和 `oxylabs-captcha-end` 事件
// ...

Turnstile Turnstile CAPTCHA 需要不同的方法,因为必须在其出现在屏幕上之前进行拦截。为此,先启动 CAPTCHA 检测,然后执行会触发 CAPTCHA 的操作:

// 我们知道下一步操作可能会触发 Turnstile CAPTCHA
await page.evaluate(() => {
  window.postMessage({action: 'solve_captcha', type: 'turnstile'}, '*')
});
await page.click('#form-submit');
// 像常规情况一样关注 `oxylabs-captcha-start` 和 `oxylabs-captcha-end` 事件
// ...

最后更新于

这有帮助吗?