Гайд зі Scrapy · 1 хв читання

Як використовувати проксі у Scrapy

Scrapy пускає запити через проксі трьома способами: ключ meta на запит, змінна оточення або ротаційний downloader middleware. Розбираємо кожен, із робочим кодом для проксі s4m з автентифікацією.

Три способи, якими Scrapy говорить із проксі

Scrapy постачається з HttpProxyMiddleware, увімкненим за замовчуванням. Він бере проксі з одного з двох місць: ключа proxy у словнику meta запиту або стандартних змінних середовища http_proxy / https_proxy. Якщо потрібен один фіксований проксі на весь обхід, найшвидший шлях — змінна середовища; якщо ж потрібне керування й ротація на рівні запиту, виставляйте request.meta["proxy"] самі, зазвичай із власного downloader-мідлварю.

Автентифікація — саме те, що зазвичай пропускають. Scrapy не витягує USER:PASS@ з URL проксі так, як це робить curl, — він чекає на заголовок Proxy-Authorization. Чистий підхід — зібрати цей заголовок один раз і додавати його у своєму мідлварі. Проксі s4m автентифікуються парою USER:PASS на proxy.s4m.online, HTTP — на порту 3128 (природний варіант для HTTP-мідлварю Scrapy). Для SOCKS5 довелося б поставити перед обходом локальний міст SOCKS-у-HTTP, але для більшості скрапінгу простіше взяти HTTP-ендпоінт. Докладніше — на сторінці проксі, а також в інших посібниках зі скрапінгу.

Мідлварь з ротацією проксі

Покладіть це в middlewares.py, увімкніть у settings.py — і кожен запит братиме проксі з вашого пулу разом із правильним заголовком автентифікації.

python
# middlewares.py
import base64
import random

USER, PASS, HOST = "USER", "PASS", "proxy.s4m.online"
PROXIES = [f"http://{HOST}:3128"]  # add more endpoints/ports to rotate

class S4mProxyMiddleware:
    def _auth_header(self):
        raw = f"{USER}:{PASS}".encode()
        return b"Basic " + base64.b64encode(raw)

    def process_request(self, request, spider):
        request.meta["proxy"] = random.choice(PROXIES)
        # Scrapy needs the Proxy-Authorization header explicitly:
        request.headers[b"Proxy-Authorization"] = self._auth_header()

# settings.py
DOWNLOADER_MIDDLEWARES = {
    # keep Scrapy's built-in proxy middleware after ours
    "myproject.middlewares.S4mProxyMiddleware": 350,
    "scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 400,
}
CONCURRENT_REQUESTS = 8
DOWNLOAD_DELAY = 0.5
RETRY_ENABLED = True
RETRY_TIMES = 3
RETRY_HTTP_CODES = [429, 500, 502, 503, 504]

Складаємо все докупи

Від чистого проєкту до обходу крізь проксі.

Додайте мідлварь

Вставте клас S4mProxyMiddleware у middlewares.py свого проєкту й замініть USER, PASS і HOST на свої облікові дані та ендпоінт s4m.

Увімкніть його в налаштуваннях

Зареєструйте його в DOWNLOADER_MIDDLEWARES з пріоритетом нижче за HttpProxyMiddleware від Scrapy (менше число спрацьовує раніше), щоб ваш проксі й заголовок були виставлені до запуску вбудованого мідлварю.

Налаштуйте ввічливість

Виставте DOWNLOAD_DELAY і CONCURRENT_REQUESTS так, щоб не впиратися в ліміт швидкості цілі, та увімкніть RETRY_HTTP_CODES для 429 і 5xx — тоді тимчасові блокування повторюватимуться автоматично.

Перевірте вихідний IP

Додайте перший запит до сервісу, що повертає IP, наприклад https://api.ipify.org, і залогуйте відповідь — так ви переконаєтеся, що обхід справді виходить крізь проксі.

Ротація, повтори і чесність

Для справжньої ротації покладіть кілька ендпоінтів у PROXIES і нехай process_request обирає по одному на запит; поєднайте це з вбудованим мідлварем повторів Scrapy, щоб 429 чи 503 повторювалися вже з новим вибором. Тримайте DOWNLOAD_DELAY ненульовим, а паралельність — помірною: краулер, який відступає, заблокувати значно важче, ніж того, що біжить спринт.

Два чесні застереження. Перше: проксі s4m — серверні, а не резидентські: чудові для API, тестування й помірно захищених сайтів, але агресивні антибот-системи можуть позначати серверні діапазони. Друге: ротація не є дозволом ігнорувати правила сайту — читайте robots.txt і умови використання. Коли потрібен один сталий вихід для білого списку, візьміть краще виділену персональну IP, ніж ротацію. Перевіряйте виходи й порти в інструментах, а прототипуйте на безкоштовному списку проксі, перш ніж пускати справжній трафік.

FAQ

Відповіді на питання

Чому Scrapy не бере USER:PASS з URL проксі?

На відміну від curl, HttpProxyMiddleware у Scrapy не розбирає облікові дані з URL. Заголовок Proxy-Authorization треба виставити самому — зібрати Basic-заголовок з USER:PASS, як показано у прикладі мідлварю.

Чи може Scrapy працювати з проксі SOCKS5?

Не напряму через HttpProxyMiddleware — він орієнтований на HTTP. Для Scrapy використовуйте HTTP-ендпоінт на порту 3128 або підніміть локальний міст SOCKS-у-HTTP, якщо SOCKS5 потрібен принципово.

Як ротувати проксі на кожен запит?

Складіть кілька ендпоінтів проксі у список і обирайте один у process_request, щоразу виставляючи request.meta["proxy"]. Поєднайте це з мідлварем повторів Scrapy, щоб заблокований запит повторювався вже з новим вибором.

Це резидентні проксі?

Ні. Проксі s4m — це серверні SOCKS5 і HTTP з автентифікацією та оплатою за фактом використання. Вони підходять для більшості завдань скрапінгу, хоча добре захищені цілі можуть позначати серверні діапазони IP.

Масштабуйте свої обходи на Scrapy

Серверні проксі з автентифікацією на proxy.s4m.online, оплата за фактом використання, готові до ротації в мідлварі Scrapy. Додайте виділену IP, коли ціль очікує один сталий вихід.

Цю сторінку знаходять за запитами

Реальні пошукові фрази, на які відповідає ця сторінка — за посиланнями відкриються матеріали, що розкривають тему глибше.