Інтеграція проксі в Scrapy-Splash дозволяє маршрутизувати запити, що надходять від служби рендерингу Splash, через проміжний сервер, забезпечуючи ротацію IP-адрес, георозблокування та анонімність для веб-сторінок, відрендерених за допомогою JavaScript.
Розуміння інтеграції проксі зі Scrapy-Splash
Scrapy-Splash поєднує фреймворк для скрапінгу Scrapy з можливостями рендерингу безголового браузера Splash. Коли проксі налаштовано в цій конфігурації, це означає, що веб-запити, зроблені екземпляром браузера всередині Splash, направляються через вказаний проксі-сервер. Це стосується початкового завантаження сторінки, подальших AJAX-запитів та будь-якої іншої мережевої активності, ініційованої JavaScript на сторінці.
Навіщо використовувати проксі зі Scrapy-Splash?
Проксі виконують кілька критично важливих функцій при скрапінгу динамічного контенту за допомогою Scrapy-Splash:
* Обхід обмежень швидкості та блокувань на основі IP: Веб-сайти часто обмежують доступ на основі вихідної IP-адреси. Проксі дозволяють розподіляти запити між кількома IP-адресами, пом'якшуючи такі обмеження.
* Доступ до геообмеженого контенту: Проксі, розташовані в певних географічних регіонах, можуть отримувати доступ до контенту, недоступного у фізичному місцезнаходженні скрапера.
* Підтримка анонімності: Проксі приховують справжню IP-адресу скрапера, підвищуючи операційну безпеку.
* Розподіл навантаження: Для великомасштабних операцій проксі можуть допомогти розподілити мережеве навантаження та зменшити ймовірність перевантаження або позначення однієї IP-адреси.
Як Scrapy-Splash обробляє проксі-запити
- Scrapy надсилає
SplashRequestдо демона Splash. - Splash отримує запит і, якщо присутній аргумент
proxy, налаштовує свій внутрішній екземпляр браузера (наприклад, Chromium) для маршрутизації всього мережевого трафіку через цей проксі. - Екземпляр браузера переходить до цільової URL-адреси, рендерить JavaScript і виконує будь-які необхідні мережеві виклики (наприклад, XHR, отримання ресурсів) через налаштований проксі.
- Splash повертає повністю відрендерений HTML, знімок екрана або інші запитувані дані назад до Scrapy.
Налаштування проксі в Scrapy-Splash
Основний метод інтеграції проксі – це використання аргументу proxy у SplashRequest.
Базова конфігурація проксі
Щоб використовувати проксі для конкретного запиту, передайте аргумент proxy у словнику args об'єкта SplashRequest. Формат URL-адреси проксі: [protocol://][user:password@]host:port.
import scrapy
from scrapy_splash import SplashRequest
class BasicProxySpider(scrapy.Spider):
name = 'basic_proxy_spider'
start_urls = ['http://quotes.toscrape.com/js/']
def start_requests(self):
# Приклад використання базового HTTP-проксі
# Замініть на вашу фактичну IP-адресу та порт проксі
yield SplashRequest(
url=self.start_urls[0],
callback=self.parse,
args={
'wait': 0.5,
'proxy': 'http://your_proxy_ip:port'
}
)
def parse(self, response):
title = response.css('title::text').get()
yield {
'title': title,
'url': response.url,
'proxy_used': response.request.meta.get('splash', {}).get('args', {}).get('proxy')
}
Аутентифіковані проксі
Для проксі, що вимагають аутентифікації, вбудуйте ім'я користувача та пароль безпосередньо в рядок URL-адреси проксі.
import scrapy
from scrapy_splash import SplashRequest
class AuthenticatedProxySpider(scrapy.Spider):
name = 'auth_proxy_spider'
start_urls = ['http://quotes.toscrape.com/js/']
def start_requests(self):
# Замініть на ваші фактичні дані проксі
proxy_user = 'your_username'
proxy_pass = 'your_password'
proxy_host = 'your_proxy_ip'
proxy_port = 'port'
authenticated_proxy_url = f'http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}'
yield SplashRequest(
url=self.start_urls[0],
callback=self.parse,
args={
'wait': 0.5,
'proxy': authenticated_proxy_url
}
)
def parse(self, response):
title = response.css('title::text').get()
yield {
'title': title,
'url': response.url,
'proxy_used': response.request.meta.get('splash', {}).get('args', {}).get('proxy')
}
Динамічний вибір та ротація проксі
Для сценаріїв, що вимагають різних проксі для кожного запиту або схеми ротації, керуйте списком проксі у вашому павуку та вибирайте один динамічно.
import scrapy
from scrapy_splash import SplashRequest
import random
class RotatingProxySpider(scrapy.Spider):
name = 'rotating_proxy_spider'
start_urls = ['http://quotes.toscrape.com/js/', 'http://toscrape.com/']
# Визначте список проксі (замініть на ваші фактичні проксі)
# Включіть аутентифіковані проксі як 'http://user:pass@host:port'
proxy_list = [
'http://proxy1_ip:port1',
'http://user:pass@proxy2_ip:port2',
'http://proxy3_ip:port3',
]
def start_requests(self):
for url in self.start_urls:
selected_proxy = random.choice(self.proxy_list)
yield SplashRequest(
url=url,
callback=self.parse,
args={
'wait': 0.5,
'proxy': selected_proxy
},
# Ви також можете передати власні метадані для відстеження використаного проксі
meta={'proxy_selected': selected_proxy}
)
def parse(self, response):
title = response.css('title::text').get()
yield {
'title': title,
'url': response.url,
'proxy_used': response.request.meta.get('proxy_selected') # Доступ до власних метаданих
}
Глобальна конфігурація проксі (демон Splash)
Splash можна налаштувати на використання проксі за замовчуванням для всіх вихідних запитів. Це зазвичай досягається шляхом встановлення змінних середовища HTTP_PROXY та HTTPS_PROXY перед запуском демона Splash. Хоча це забезпечує глобальний стандарт, воно пропонує менше контролю, ніж специфікація проксі для кожного запиту для динамічних завдань скрапінгу.
Типи проксі та їх вплив
Вибір типу проксі впливає на анонімність, продуктивність та ризик виявлення.
| Особливість | Проксі дата-центрів | Резидентні проксі |
|---|---|---|
| Джерело IP | Комерційні дата-центри | Реальні провайдери домашнього інтернету |
| Анонімність | Помірна (IP-адреси часто належать до відомих підмереж) | Висока (IP-адреси виглядають як звичайні користувачі інтернету) |
| Швидкість | Зазвичай швидші завдяки виділеній інфраструктурі | Можуть бути повільнішими через маршрутизацію через домашні мережі |
| Вартість | Нижча за IP-адресу | Вища за IP-адресу або пропускну здатність |
| Виявлення | Більш схильні до виявлення та блокування складними антиботами | Менш схильні до виявлення; важче заблокувати |
| Випадки використання | Загальний скрапінг, високооб'ємні завдання на менш захищених сайтах | Високочутливий скрапінг, обхід просунутих антибот-систем |
Протоколи проксі
- HTTP/HTTPS Проксі: Обробляють стандартний веб-трафік. Splash повністю підтримує обидва протоколи.
- SOCKS Проксі: SOCKS (SOCKS4, SOCKS5) проксі працюють на нижчому рівні, здатні обробляти різні мережеві протоколи, а не тільки HTTP/HTTPS. Щоб використовувати SOCKS проксі зі Splash, вкажіть протокол в URL-адресі
proxy(наприклад,socks5://user:pass@host:port).
"Липкі" проти ротуючих проксі
- "Липкі" проксі: Зберігають ту саму IP-адресу протягом визначеного часу (наприклад, від кількох хвилин до годин) або протягом життєвого циклу сесії. Корисні для підтримки стану сесії на цільових веб-сайтах, які вимагають послідовних IP-адрес.
- Ротуючі проксі: Призначають нову IP-адресу з кожним запитом або через регулярні, короткі інтервали. Ідеально підходять для високооб'ємного скрапінгу, де уникнення блокування IP-адрес шляхом частої зміни вихідної IP-адреси є критично важливим.
Усунення несправностей та найкращі практики
Перевірка підключення до проксі
Перед широкомасштабним розгортанням протестуйте ваш проксі незалежно. Проста команда curl або скрипт Python requests можуть підтвердити функціональність та доступність проксі.
curl --proxy http://your_proxy_ip:port http://httpbin.org/ip
Перевірка журналів Splash
Проблеми, пов'язані з підключенням до проксі або аутентифікацією всередині Splash, зазвичай реєструються демоном Splash. Перегляньте вивід консолі Splash або файли журналів на наявність помилок під час налагодження.
Грамотне оброблення помилок проксі
Впроваджуйте механізми повторних спроб або логіку ротації проксі для обробки невдалих запитів. Якщо проксі постійно виходить з ладу, видаліть його з активного пулу або позначте як непрацездатний на певний період. Проміжне програмне забезпечення Scrapy для повторних спроб може бути адаптоване, але обробка збоїв, специфічних для проксі, часто вимагає власної логіки павука.
Міркування щодо продуктивності
Проксі додають додатковий мережевий стрибок, збільшуючи затримку.
* Управління пулом проксі: Впровадьте систему для відстеження стану проксі, часу відповіді та використання. Пріоритизуйте швидші, надійні проксі.
* Використання ресурсів: Сам Splash є ресурсоємним. Використання проксі додає навантаження. Переконайтеся, що демон Splash має достатньо CPU та RAM для обробки комбінованого навантаження.
Заходи проти ботів, специфічні для веб-сайтів
Просунуті системи проти ботів виявляють шаблони, що виходять за рамки простих IP-адрес. Навіть з резидентними проксі сайти можуть ідентифікувати автоматизований перегляд. Точно налаштуйте аргументи Splash, такі як user-agent, viewport, browser_params, і використовуйте власні скрипти Lua для більш людиноподібних взаємодій, щоб протидіяти цим заходам.
Витік IP-адреси
Переконайтеся, що проксі ефективно маскує справжню IP-адресу скрапера. Використовуйте такі сервіси, як http://httpbin.org/ip або https://ipleak.net/ всередині Splash, щоб перевірити видиму IP-адресу.
# Скрипт Lua для перевірки видимої IP-адреси всередині Splash
lua_script = """
function main(splash)
splash:set_proxy_auto() -- Забезпечує використання проксі, якщо встановлено через аргумент 'proxy'
splash:go("http://httpbin.org/ip")
splash:wait(0.5)
return splash:html()
end
"""
# Приклад SplashRequest з використанням скрипта Lua
yield SplashRequest(
url="about:blank", # URL тут не має значення, оскільки Lua обробляє навігацію
callback=self.parse_ip_check,
endpoint='execute',
args={
'lua_source': lua_script,
'proxy': 'http://your_proxy_ip:port',
'timeout': 90 # Збільшити тайм-аут для скриптів Lua
}
)
def parse_ip_check(self, response):
# Розбір HTML-відповіді від httpbin.org/ip для вилучення IP-адреси
ip_address = response.css('pre::text').get() # Налаштуйте селектор, якщо httpbin зміниться
self.logger.info(f"Видима IP-адреса зі Splash через проксі: {ip_address}")
# Подальша обробка...