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()import { chromium } from 'playwright';
(async () => {
const username = 'your-username';
const password = 'your-password';
const endpoint = 'ubc.oxylabs.io';
const browserUrl = `wss://${username}:${password}@${endpoint}`;
const browser = await chromium.connectOverCDP(browserUrl);
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
})();import puppeteer from 'puppeteer';
(async () => {
const username = 'your-username';
const password = 'your-password';
const endpoint = 'ubc.oxylabs.io';
const browserUrl = `wss://${username}:${password}@${endpoint}`;
const browser = await puppeteer.connect({
browserWSEndpoint: browserUrl
});
const page = await browser.newPage();
await page.goto('https://example.com');
await 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()import { chromium } from 'playwright';
(async () => {
const username = 'your-username';
const password = 'your-password';
const endpoint = 'ubc-us.oxylabs.io';
const browserUrl = `wss://${username}:${password}@${endpoint}`;
const browser = await chromium.connectOverCDP(browserUrl);
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
})();import puppeteer from 'puppeteer';
(async () => {
const username = 'your-username';
const password = 'your-password';
const endpoint = 'ubc-us.oxylabs.io';
const browserUrl = `wss://${username}:${password}@${endpoint}`;
const browser = await puppeteer.connect({
browserWSEndpoint: browserUrl
});
const page = await browser.newPage();
await page.goto('https://example.com');
await 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()import { chromium } from 'playwright';
(async () => {
const username = 'your-username';
const password = 'your-password';
const endpoint = 'ubc.oxylabs.io';
const country = 'US'; // 用所需的国家/地区代码替换
const browserUrl = `wss://${username}:${password}@${endpoint}?p_cc=${country}`;
const browser = await chromium.connectOverCDP(browserUrl);
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
})();import puppeteer from 'puppeteer';
(async () => {
const username = 'your-username';
const password = 'your-password';
const endpoint = 'ubc.oxylabs.io';
const country = 'US'; // 用所需的国家/地区代码替换
const browserUrl = `wss://${username}:${password}@${endpoint}?p_cc=${country}`;
const browser = await puppeteer.connect({
browserWSEndpoint: browserUrl
});
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
})();如果未指定国家,系统将根据可用性自动分配。
浏览器参数
Unblocking Browser Chrome 接受以以下格式在连接 URL 中传递的额外浏览器参数: ?bargs=这些 GET 参数指定浏览器启动时应使用的命令行参数。
如果参数应具有值,使用
bargs=argname:argvalue;如果参数只是一个标志,使用
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=mobileCAPTCHA 解决事件
当检测到 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))const {chromium} = require('playwright');
const sleep = require('util').promisify(setTimeout)
const
CAPTCHA_SOLVE_START = 'oxylabs-captcha-solve-start',
CAPTCHA_SOLVE_END = 'oxylabs-captcha-solve-end',
CAPTCHA_SOLVE_ERROR = 'oxylabs-captcha-solve-error',
UB_BROWSER_URL = 'wss://<username>:<password>@ubc.headlesify.io',
CAPTCHA_CHECK_INTERVAL_SEC = 1,
CAPTCHA_CHECK_TIMEOUT_SEC = 30,
TARGET_URL = 'https://www.indeed.com/cmp/Bank-of-the-West/reviews?lang=any&fcountry=ALL&sort=date';
(async () => {
console.log('Opening browser page...');
const browser = await chromium.connectOverCDP(UB_BROWSER_URL);
const ctx = browser.contexts()[0];
const page = await ctx.newPage();
// 处理 console.log 消息并查找 Oxylabs CAPTCHA 解决事件
let captchaState = null;
page.on('console', message => {
const msg = message.text().trim();
if (msg.startsWith('oxylabs-captcha-')) {
captchaState = msg;
}
});
console.log('Opening target website with CAPTCHA...');
await page.goto(TARGET_URL);
// 等待 CAPTCHA 被解决
for (let i = 0; i < CAPTCHA_CHECK_TIMEOUT_SEC; i++) {
await sleep(CAPTCHA_CHECK_INTERVAL_SEC * 1000);
// 注意:为获得更好的控制,您也可以仅在一定时间内等待 CAPTCHA_SOLVE_START 事件。
if (captchaState === CAPTCHA_SOLVE_END) {
console.log('CAPTCHA solved successfully, continue scraping...');
break;
}
}
// 检查 CAPTCHA 是否已成功解决
if ([CAPTCHA_SOLVE_START, CAPTCHA_SOLVE_ERROR].includes(captchaState)) {
console.error('Could not solve CAPTCHA. Try increasing CAPTCHA_CHECK_TIMEOUT_SEC.');
process.exit(1);
}
await page.waitForSelector('h1[data-testid="PageHeader-title-reviews"]');
console.log('Making a screenshot...');
await page.screenshot({ path: 'page_screenshot.jpg' });
await page.close();
await browser.close();
console.log('Done.');
process.exit(0);
})();const puppeteer = require('puppeteer');
const sleep = require('util').promisify(setTimeout);
const
CAPTCHA_SOLVE_START = 'oxylabs-captcha-solve-start',
CAPTCHA_SOLVE_END = 'oxylabs-captcha-solve-end',
CAPTCHA_SOLVE_ERROR = 'oxylabs-captcha-solve-error',
UB_BROWSER_URL = 'wss://<username>:<password>@ubc.headlesify.io',
CAPTCHA_CHECK_INTERVAL_SEC = 1,
CAPTCHA_CHECK_TIMEOUT_SEC = 30,
TARGET_URL = 'https://www.indeed.com/cmp/Bank-of-the-West/reviews?lang=any&fcountry=ALL&sort=date';
(async () => {
console.log('Opening browser page...');
const browser = await puppeteer.connect({
browserWSEndpoint: UB_BROWSER_URL,
defaultViewport: null
});
const pages = await browser.pages();
const page = pages.length > 0 ? pages[0] : await browser.newPage();
// 处理 console.log 消息并查找 Oxylabs CAPTCHA 解决事件
let captchaState = null;
page.on('console', msg => {
const text = msg.text().trim();
if (text.startsWith('oxylabs-captcha-')) {
captchaState = text;
}
});
console.log('Opening target website with CAPTCHA...');
await page.goto(TARGET_URL, { waitUntil: 'domcontentloaded' });
for (let i = 0; i < CAPTCHA_CHECK_TIMEOUT_SEC; i++) {
await sleep(CAPTCHA_CHECK_INTERVAL_SEC * 1000);
if (captchaState === CAPTCHA_SOLVE_END) {
console.log('CAPTCHA solved successfully, continue scraping...');
break;
}
}
if ([CAPTCHA_SOLVE_START, CAPTCHA_SOLVE_ERROR].includes(captchaState)) {
console.error('Could not solve CAPTCHA. Try increasing CAPTCHA_CHECK_TIMEOUT_SEC.');
process.exit(1);
}
await page.waitForSelector('h1[data-testid="PageHeader-title-reviews"]');
console.log('Making a screenshot...');
await page.screenshot({ path: 'page_screenshot.jpg' });
await page.close();
await browser.disconnect(); // 对远程会话使用 disconnect
console.log('Done.');
process.exit(0);
})();动态 CAPTCHA 解决
默认情况下,Unblocking Browser 会在页面加载时自动检测并立即解决 CAPTCHA。但有些网站会在后期阶段显示 CAPTCHA,例如提交表单时的弹出窗口或特定用户交互之后。
Unblocking Browser 允许您在会话中的任何时刻手动触发 CAPTCHA 检测和解决。要手动触发 CAPTCHA 解决,请执行以下代码向 window 对象发送一条消息:
window.postMessage({action: 'solve_captcha', type: '<captcha type>'}, '*')支持的 CAPTCHA 类型包括:
hcaptcharecaptchaturnstile(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` 事件
// ...最后更新于
这有帮助吗?

