ヘッドレスブラウザは JavaScript をレンダリングできるため、素の HTTP クライアントでは扱えない最近のサイトにも対応できます。しかし、ブラウザであっても、すべてのリクエストは 1 つの IP から送信されており、サイトがそのアドレスにレート制限をかけたりフィンガープリントを取ったりした瞬間に自動化は検知されます。Playwright と Puppeteer でプロキシを使うことで、トラフィックを複数の IP に分散させ、正しく行えば自動化を通常のユーザーのように見せられます。以下が、Python と Node の両方における、実際に動く設定です。
プロキシはブラウザ起動時に設定します。認証情報は username と password という別々のフィールドとして渡してください — サーバー URL に認証情報をインラインで埋め込んではいけません。
from playwright.sync_api import sync_playwright
PROXY = {
"server": "http://gate.jibaoproxy.com:10001",
"username": "USERNAME",
"password": "PASSWORD",
}
with sync_playwright() as p:
browser = p.chromium.launch(proxy=PROXY, headless=True)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.inner_text("body"))
browser.close()
JIBAO はゲートウェイで HTTP と SOCKS5 の両方を提供しています。ブラウザ自動化には HTTP エンドポイントを使ってください。Playwright と Puppeteer は認証付きの SOCKS5 プロキシをサポートしていないため、認証付き HTTP が確実な選択肢です。
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
headless: true,
proxy: {
server: 'http://gate.jibaoproxy.com:10001',
username: 'USERNAME',
password: 'PASSWORD',
},
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.innerText('body'));
await browser.close();
})();
Playwright で最もきれいにローテーションする方法は、BrowserContext ごとに 1 つの IP を割り当てることです。各コンテキストは独立したセッション(独自の Cookie とキャッシュを持つ)なので、それぞれを異なる出口 IP に紐付ければ、1 つのブラウザプロセスから並列の複数アイデンティティを得られます。
from playwright.sync_api import sync_playwright
def ctx_proxy(session_id):
return {
"server": "http://gate.jibaoproxy.com:10001",
"username": f"USERNAME-session-{session_id}",
"password": "PASSWORD",
}
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
for i in range(3):
context = browser.new_context(proxy=ctx_proxy(f"ctx{i}"))
page = context.new_page()
page.goto("https://httpbin.org/ip")
print(i, page.inner_text("body"))
context.close()
browser.close()
各コンテキストは異なるスティッキーセッショントークンを使うため、IP はコンテキスト内では安定し(ログインフローに適しています)、コンテキスト間では異なります(多数のアカウントを並列で動かすのに適しています)。これは GoLogin や Dolphin Anty のようなアンチディテクトブラウザが自動化しているパターンです — 当社のアンチディテクトプロキシ設定ガイドを参照してください。
Puppeteer はプロキシサーバーを Chromium の起動フラグとして設定し、その後 page オブジェクト上で認証します。
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: 'new',
args: ['--proxy-server=http://gate.jibaoproxy.com:10001'],
});
const page = await browser.newPage();
await page.authenticate({ username: 'USERNAME', password: 'PASSWORD' });
await page.goto('https://httpbin.org/ip');
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();
})();
プロキシはプロセスレベルのフラグなので、1 つの Puppeteer ブラウザは 1 つの IP を使います。ローテーションするには、アイデンティティごとに新しいブラウザを起動する(重い)か、接続ごとに IP を変えるゲートウェイ経由でローテーションを行います。
セッション Cookie を生成するフローは、その全期間を通じて同じ IP を維持しなければなりません。IP-A で発行された Cookie が突然 IP-B から現れると、セッションハイジャックと判定され、再認証やバンを引き起こします。ログイン済みのアカウントごとに 1 つのコンテキスト(または 1 つのブラウザ)を、1 つのスティッキーセッショントークンに固定したまま、セッション全体にわたって保ってください。
住宅用 IP は必要ですが、それだけでは不十分です。サイトはあなたのブラウザの TLS/JA4 ハンドシェイク、HTTP/2 のフレーム順序、canvas、WebGL、navigator プロパティも読み取ります。素のヘッドレス Chromium は navigator.webdriver = true と、最高の IP すら台無しにするヘッドレスのフィンガープリントを漏らします。ステルスプラグインと現実的な起動フラグで対策しましょう。
// Node: puppeteer-extra + stealth
const puppeteer = require('puppeteer-extra');
const Stealth = require('puppeteer-extra-plugin-stealth');
puppeteer.use(Stealth());
// Realistic launch flags
const browser = await puppeteer.launch({
headless: 'new',
args: [
'--proxy-server=http://gate.jibaoproxy.com:10001',
'--disable-blink-features=AutomationControlled',
'--window-size=1920,1080',
],
});
自分がどのシグナルを漏らしているかを正確に確認するには、自動化したブラウザを JIBAO の無料の JA3/JA4 フィンガープリントチェッカーにかけてみてください。ハンドシェイクがなぜフラグ付けされるのか、より深い仕組みについては、TLS フィンガープリンティングの回避と、完全版の Cloudflare バイパスレシピをお読みください。
headless=False を設定して、ターゲットがボットに実際に何を見せているかを確認しましょう。新規ユーザーは登録時に500MBを獲得、さらに初回チャージにボーナスが付きます。期間限定オファーです。