Playwright дозволяє налаштовувати проксі для скриптів Python та Node.js переважно через опції browserType.launch() або browser.newContext(), дозволяючи вказувати адресу проксі-сервера, порт та облікові дані для автентифікації. Ця конфігурація спрямовує всі подальші мережеві запити від запущеного екземпляра браузера або контексту через вказаний проксі.
Огляд конфігурації проксі Playwright
Playwright підтримує конфігурації проксі на двох основних рівнях:
- На рівні запуску браузера: Застосування проксі до всього екземпляра браузера. Усі контексти та сторінки, створені в цьому браузері, використовуватимуть вказаний проксі. Це підходить, коли всі завдання автоматизації вимагають одного й того ж проксі.
- На рівні контексту браузера: Застосування проксі до певного контексту браузера. Це дозволяє різним контекстам в одному екземплярі браузера використовувати різні проксі, або деяким контекстам не використовувати проксі взагалі, що корисно для керування різноманітними сценаріями скрапінгу або тестування.
Об'єкт або словник конфігурації проксі Playwright зазвичай включає адресу server (наприклад, http://proxy.example.com:8080, socks5://localhost:9050), а також необов'язкові username та password для автентифікованих проксі.
Підтримувані типи проксі
Playwright підтримує стандартні протоколи проксі:
- HTTP-проксі: Вказуються зі схемами
http://абоhttps://. - SOCKS-проксі: Вказуються зі схемами
socks5://абоsocks4://.
Якщо схема опущена (наприклад, proxy.example.com:8080), Playwright за замовчуванням використовує HTTP-проксі. Явне вказання схеми рекомендується для ясності та забезпечення використання правильного протоколу.
Налаштування проксі Playwright для Python
У Python конфігурація проксі передається як словник до аргументу proxy функцій browser_type.launch() або browser.new_context().
Базове налаштування HTTP/HTTPS проксі
Щоб використовувати неавтентифікований HTTP або HTTPS проксі:
from playwright.sync_api import sync_playwright
# Для проксі на весь браузер
with sync_playwright() as p:
browser = p.chromium.launch(proxy={"server": "http://your.proxy.server:8080"})
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
browser.close()
# Для проксі, специфічного для контексту
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context(proxy={"server": "http://another.proxy.server:8080"})
page = context.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
context.close()
browser.close()
Налаштування автентифікованого HTTP/HTTPS проксі
Для проксі, що вимагають автентифікації, включіть ключі username та password у словник проксі:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": "http://user.proxy.server:8080",
"username": "proxy_user",
"password": "proxy_password"
}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
browser.close()
Налаштування SOCKS проксі
Вкажіть протокол SOCKS у рядку server:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={"server": "socks5://your.socks.proxy:9050"}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
browser.close()
SOCKS-проксі також підтримують автентифікацію шляхом додавання username та password до словника.
Обхід проксі для певних доменів
Ключ bypass у словнику проксі дозволяє вказати розділений комами список хостів або доменів, які не повинні використовувати проксі. Підтримуються символи узагальнення (*).
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": "http://your.proxy.server:8080",
"bypass": "*.local, .example.com, 192.168.1.1"
}
)
page = browser.new_page()
page.goto("http://example.com") # Буде обходити проксі, якщо example.com є у списку bypass
page.goto("https://google.com") # Буде використовувати проксі
browser.close()
Налаштування проксі Playwright для Node.js
У Node.js конфігурація проксі передається як об'єкт до властивості proxy функцій browserType.launch() або browser.newContext().
Базове налаштування HTTP/HTTPS проксі
Щоб використовувати неавтентифікований HTTP або HTTPS проксі:
const { chromium } = require('playwright');
(async () => {
// Для проксі на весь браузер
const browser = await chromium.launch({
proxy: {
server: 'http://your.proxy.server:8080'
}
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.content());
await browser.close();
// Для проксі, специфічного для контексту
const browser2 = await chromium.launch();
const context = await browser2.newContext({
proxy: {
server: 'http://another.proxy.server:8080'
}
});
const page2 = await context.newPage();
await page2.goto('https://httpbin.org/ip');
console.log(await page2.content());
await context.close();
await browser2.close();
})();
Налаштування автентифікованого HTTP/HTTPS проксі
Для проксі, що вимагають автентифікації, включіть властивості username та password в об'єкт проксі:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'http://user.proxy.server:8080',
username: 'proxy_user',
password: 'proxy_password'
}
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.content());
await browser.close();
})();
Налаштування SOCKS проксі
Вкажіть протокол SOCKS у рядку server:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'socks5://your.socks.proxy:9050'
}
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.content());
await browser.close();
})();
SOCKS-проксі також підтримують автентифікацію шляхом додавання username та password до об'єкта.
Обхід проксі для певних доменів
Властивість bypass в об'єкті проксі дозволяє вказати розділений комами список хостів або доменів, які не повинні використовувати проксі. Підтримуються символи узагальнення (*).
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'http://your.proxy.server:8080',
bypass: '*.local, .example.com, 192.168.1.1'
}
});
const page = await browser.newPage();
await page.goto('http://example.com'); // Буде обходити проксі, якщо example.com є у списку bypass
await page.goto('https://google.com'); // Буде використовувати проксі
await browser.close();
})();
Порівняння конфігурації проксі Playwright
| Функція/Мова | Python (dict) |
Node.js (object) |
Опис |
|---|---|---|---|
| Сервер | {"server": "http://host:port"} |
{ server: "http://host:port" } |
Обов'язково. Адреса та порт проксі, з необов'язковою схемою. |
| Ім'я користувача | {"username": "user"} |
{ username: "user" } |
Необов'язково. Для автентифікованих проксі. |
| Пароль | {"password": "pass"} |
{ password: "pass" } |
Необов'язково. Для автентифікованих проксі. |
| Обхід | {"bypass": "*.local,domain.com"} |
{ bypass: "*.local,domain.com" } |
Необов'язково. Розділений комами список хостів/доменів для обходу проксі. |
| Рівень запуску | browser_type.launch(proxy={...}) |
browserType.launch({ proxy: {...} }) |
Застосовує проксі до всього екземпляра браузера. |
| Рівень контексту | browser.new_context(proxy={...}) |
browser.newContext({ proxy: {...} }) |
Застосовує проксі до певного контексту браузера. |
Додаткові міркування щодо проксі
Проксіювання конкретних запитів за допомогою page.route()
Для дуже детального контролю page.route() може перехоплювати мережеві запити та перенаправляти їх на різні проксі на основі конкретних критеріїв. Цей метод забезпечує більшу гнучкість, ніж глобальні або контекстні налаштування проксі, але вимагає ручної обробки запитів.
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
def handle_route(route):
if "example.com" in route.request.url:
route.fulfill(status=200, body="Blocked by route handler.")
else:
# Перенаправити інші запити через конкретний проксі
# Це вимагає ручного налаштування HTTP-клієнта або може бути складним для прямого проксіювання
# Для простих випадків використання краще глобальний/контекстний проксі.
# Для складного маршрутизації проксі розгляньте використання зовнішнього менеджера проксі.
route.continue_({"url": route.request.url}) # Приклад: продовжити без модифікації
page.route("**/*", handle_route)
page.goto("https://www.google.com") # Буде маршрутизовано
page.goto("https://www.example.com") # Буде виконано
browser.close()
page.route() зазвичай використовується для імітації, модифікації запитів або блокування, а не для динамічного перенаправлення на різні проксі, якщо це не інтегровано з власною логікою обробки проксі.
Перевірка функціональності проксі
Після налаштування проксі перевірте його роботу, перейшовши до служби перевірки IP-адреси, наприклад https://httpbin.org/ip або https://whatismyipaddress.com/. Відображена IP-адреса повинна відповідати проксі-серверу, а не локальній машині.
Обробка помилок та тайм-аутів проксі
Проксі можуть створювати додаткові точки відмови. Впроваджуйте надійну обробку помилок для мережевих запитів при використанні проксі. Це включає:
- Повторні спроби: Повторна спроба запиту, якщо з'єднання з проксі не вдається або закінчується тайм-аут.
- Тайм-аути: Налаштування відповідних мережевих тайм-аутів для операцій Playwright.
- Ротація проксі: Для великомасштабних операцій обертайте пул проксі, щоб зменшити обмеження швидкості, блокування IP або збої одного проксі. Це зазвичай передбачає керування списком проксі та динамічне оновлення конфігурації
proxyдля нових контекстів або повторних спроб.
Міркування щодо безпеки
При використанні автентифікованих проксі уникайте жорсткого кодування облікових даних безпосередньо у вихідному коді. Замість цього використовуйте змінні середовища або безпечну систему керування конфігурацією для отримання username та password. Це запобігає розкриттю облікових даних та спрощує керування ними в різних середовищах.