Przewodnik po Scrapy · 1 min czytania

Jak używać proxy z Scrapy

Scrapy kieruje każde żądanie przez proxy na jeden z trzech sposobów: klucz meta per-request, zmienna środowiskowa lub rotujący middleware pobierania. Oto każdy z nich, z działającym kodem dla autoryzowanych proxy s4m.

Trzy sposoby, w jakie Scrapy komunikuje się z proxy

Scrapy dostarcza HttpProxyMiddleware, który jest domyślnie włączony. Odczytuje proxy z jednego z dwóch miejsc: klucza proxy w słowniku meta żądania lub standardowych zmiennych środowiskowych http_proxy / https_proxy. Aby ustawić stałe proxy na całej sesji, zmienna środowiskowa jest najszybszą opcją; dla kontroli i rotacji na poziomie żądania, ustaw request.meta["proxy"] samodzielnie, zazwyczaj z własnego middleware do pobierania.

Uwierzytelnienie to część, którą ludzie pomijają. Scrapy nie odczytuje USER:PASS@ z adresu URL proxy tak, jak robi to curl — oczekuje nagłówka Proxy-Authorization. Czystym podejściem jest zbudowanie tego nagłówka raz i dołączenie go w swoim middleware. Proxysy s4m uwierzytelniają się za pomocą USER:PASS w stosunku do proxy.s4m.online, HTTP na porcie 3128 (naturalne dopasowanie do middleware HTTP Scrapy). Dla SOCKS5 musiałbyś użyć lokalnego mostu SOCKS-to-HTTP, ale dla większości skanowania punkt końcowy HTTP jest prostszy. Dowiedz się więcej na stronie proxy page i zobacz inne przewodniki po skanowaniu.

Middleware rotacyjnego proxy

Wstaw to do middlewares.py, włącz w settings.py, a każde żądanie wybiera proxy z twojej puli z odpowiednim nagłówkiem autoryzacyjnym.

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]

Podłącz to

Od czystego projektu do przeszukiwania przez proxy.

Dodaj middleware

Wklej klasę S4mProxyMiddleware do pliku middlewares.py w swoim projekcie i zastąp USER, PASS oraz HOST swoimi danymi uwierzytelniającymi s4m oraz punktem końcowym.

Włącz to w ustawieniach

Zarejestruj go w DOWNLOADER_MIDDLEWARES z priorytetem poniżej HttpProxyMiddleware Scrapy (mniejsza liczba działa pierwsza), aby twój proxy i nagłówek były ustawione przed uruchomieniem wbudowanego middleware.

Dostosuj uprzejmość

Ustaw DOWNLOAD_DELAY i CONCURRENT_REQUESTS, aby pozostać poniżej limitu szybkości celu, i włącz RETRY_HTTP_CODES dla 429 i 5xx, aby tymczasowe blokady były automatycznie ponawiane.

Zweryfikuj IP wyjściowe

Dodaj pierwsze żądanie do punktu końcowego IP-echo, takiego jak https://api.ipify.org i zaloguj odpowiedź, aby potwierdzić, że Twoje skanowanie naprawdę wychodzi przez proxy.

Rotacja, ponowne próby i uczciwość

Dla prawdziwej rotacji, umieść kilka punktów końcowych w PROXIES i pozwól, aby process_request wybierał jeden na żądanie; połącz to z wbudowanym oprogramowaniem do ponawiania prób Scrapy, aby 429 lub 503 były ponawiane przy nowym wyborze. Utrzymuj DOWNLOAD_DELAY na wartości niezerowej i umiarkowanej współbieżności — crawler, który się wycofuje, jest znacznie trudniejszy do zablokowania niż ten, który pędzi.

Dwie szczere uwagi. Po pierwsze, proxy s4m są datacenter, a nie mieszkalne: doskonałe do API, testowania i umiarkowanie chronionych stron, ale agresywne systemy anty-botowe mogą oznaczać zakresy datacenter. Po drugie, rotacja nie jest licencją na ignorowanie zasad strony — przeczytaj robots.txt i jej warunki. Gdy potrzebujesz jednego spójnego wyjścia dla białej listy, dodaj dedykowany osobisty IP zamiast rotacji. Sprawdź wyjścia i porty za pomocą narzędzi i prototypuj przeciwko bezpłatnej liście proxy przed zaangażowaniem ruchu.

FAQ

Pytania, odpowiedzi

Dlaczego Scrapy nie pobiera mojego USER:PASS z adresu URL proxy?

W przeciwieństwie do curl, HttpProxyMiddleware w Scrapy nie analizuje poświadczeń z URL. Musisz samodzielnie ustawić nagłówek Proxy-Authorization — zbuduj nagłówek Basic auth z USER:PASS, jak pokazano w przykładzie middleware.

Czy Scrapy może używać proxy SOCKS5?

Nie natywnie przez HttpProxyMiddleware, które jest zorientowane na HTTP. Użyj punktu końcowego HTTP na porcie 3128 dla Scrapy lub uruchom lokalny mostek SOCKS-to-HTTP, jeśli potrzebujesz konkretnie SOCKS5.

Jak mogę rotować proxy na żądanie?

Umieść kilka punktów końcowych proxy na liście i wybierz jeden w process_request, ustawiając request.meta["proxy"] za każdym razem. Połącz to z middleware retry Scrapy, aby zablokowane żądanie próbowało ponownie z nowym wyborem.

Czy to są proxysy mieszkalne?

Nie. proxy s4m to uwierzytelnione proxy SOCKS5 i HTTP w centrach danych, rozliczane na zasadzie pay-as-you-go. Nadają się do większości skanowania, chociaż mocno bronione cele mogą oznaczyć zakresy IP centrów danych.

Skaluj swoje skrypty Scrapy

Uwierzytelnione proxy datacenter na proxy.s4m.online, płatność na zasadzie pay-as-you-go, gotowe do rotacji przez middleware Scrapy. Dodaj dedykowany IP, gdy cel oczekuje jednego spójnego wyjścia.

Ludzie znaleźli tę stronę, szukając

Rzeczywiste frazy wyszukiwania, na które ta strona odpowiada — powiązane otwierają stronę, która je szczegółowo omawia.