Przewodnik po Pythonie · 2 min czytania

Web scraping z użyciem Python requests i proxy

Praktyczny proces skrobania oparty na requests i BeautifulSoup, kierowany przez uwierzytelniony proxy, aby Twój adres IP pozostał ukryty, a Twój crawler przetrwał limity prędkości. Pełny działający kod w zestawie.

Skrobak to sesja, a nie pętla pobierania

Różnica między skrobakiem, który działa przez dziesięć minut, a takim, który działa przez godziny, prawie nigdy nie polega na analizie — chodzi o to, jak wysyłasz żądania. Naiwne for url in urls: requests.get(url) otwiera nowe połączenie TCP za każdym razem, nie wysyła realistycznych nagłówków, nie przechowuje ciasteczek i atakuje cel z jednego adresu IP, aż dostanie 429 lub blokadę.

Rozwiązaniem jest requests.Session plus proxy. Sesja grupuje połączenia i przechowuje ciasteczka, więc seria stron ładowana jest szybciej i wygląda jak jeden spójny klient. uwierzytelnione proxy zastępuje twój prawdziwy adres adresem z centrum danych, więc strona nigdy nie widzi twojego oryginalnego IP, a pojedynczy zablokowany adres nie kończy całej pracy. Proxysy s4m obsługują SOCKS5 na porcie 1080 i HTTP na porcie 3128, oba uwierzytelnione za pomocą USER:PASS — użyj socks5h://, aby DNS był rozwiązywany zdalnie i nazwy hostów nigdy nie wyciekały. Do eksperymentów jednorazowych, darmowa publiczna lista proxy to osobny zbiór, używaj na własne ryzyko.

Odporna aplikacja do zbierania żądań

Sesja, realistyczne nagłówki, ponowne próby z opóźnieniem, rotacja proxy i parsowanie BeautifulSoup w jednym pliku. Zastąp USER:PASS swoimi danymi uwierzytelniającymi.

python
import random
import time
import requests
from bs4 import BeautifulSoup
from requests.exceptions import RequestException

USER, PASS, HOST = "USER", "PASS", "proxy.s4m.online"
POOL = [
    f"socks5h://{USER}:{PASS}@{HOST}:1080",  # needs requests[socks]
    f"http://{USER}:{PASS}@{HOST}:3128",
]

HEADERS = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36",
    "Accept-Language": "en-US,en;q=0.9",
}

def make_session(proxy):
    s = requests.Session()
    s.headers.update(HEADERS)
    s.proxies = {"http": proxy, "https": proxy}
    return s

def fetch(url, retries=4):
    for attempt in range(1, retries + 1):
        proxy = random.choice(POOL)
        try:
            s = make_session(proxy)
            r = s.get(url, timeout=(5, 20))
            if r.status_code == 429:
                raise RequestException("rate limited")
            r.raise_for_status()
            return r
        except RequestException as e:
            wait = 2 ** attempt + random.random()  # exponential backoff
            print(f"[{attempt}/{retries}] {proxy} -> {e}; sleeping {wait:.1f}s")
            time.sleep(wait)
    raise SystemExit(f"giving up on {url}")

html = fetch("https://quotes.toscrape.com/").text
soup = BeautifulSoup(html, "html.parser")
for q in soup.select(".quote"):
    text = q.select_one(".text").get_text(strip=True)
    who = q.select_one(".author").get_text(strip=True)
    print(f"{who}: {text}")

Co utrzymuje crawlera przy życiu

Cztery nawyki, które mają większe znaczenie niż wybór parsera.

Wyślij prawdziwego User-Agent

Domyślny UA python-requests to natychmiastowy sygnał. Ustaw normalny User-Agent przeglądarki i nagłówek Accept-Language, aby żądania wtopiły się w zwykły ruch.

Wycofaj się, nie próbuj ponownie bezmyślnie

W przypadku 429 lub przekroczenia czasu, śpij z wykładniczym opóźnieniem i jitter przed ponownym próbą. Ścisłe pętle ponownych prób tylko pogłębiają blokadę i spalają ruch proxy.

Rotuj wyjście, a nie tylko ponawiaj próbę

Wybierz świeże proxy z puli przy każdej próbie, aby jedno oznaczone IP nie zatrzymało pracy. Płatne proxy z centrów danych sprawiają, że jest to tanie do skalowania.

Szanuj cel

Przeczytaj robots.txt, ogranicz równoległość i skanuj tylko to, co jest dozwolone. Grzeczny crawler jest również trudniejszy do zablokowania.

Od jednego skryptu do prawdziwego pipeline'u

Gdy pętla pobierania jest solidna, reszta to orkiestracja. Utrzymuj małą pulę adresów URL proxy i rotuj je przy każdym żądaniu; gdy cel staje się agresywny, zwiększ pulę zamiast liczby prób. Utrzymuj wyniki na bieżąco, aby awaria w trakcie nie kosztowała cię całego skanowania, i dodaj uprzejmą zwłokę między stronami, aby pozostać poniżej limitu prędkości zamiast z nim walczyć.

Gdy wyrośniesz z ad-hoc skryptów, ten sam punkt końcowy proxy wchodzi bezpośrednio do Scrapy lub klienta asynchronicznego — zobacz rotujące proxy w Pythonie dla puli aiohttp. Wszystko jest zbudowane na tych samych blokach budowlanych s4m: uwierzytelnione proxy SOCKS5 i HTTP w centrach danych, płatne na zasadzie pay-as-you-go, z API i narzędziami do sprawdzania adresów IP i portów wyjściowych. Jeśli potrzebujesz tylko szybko zweryfikować kraj lub protokół, zacznij od darmowej listy.

FAQ

Pytania, odpowiedzi

Czy potrzebuję PySocks do przykładów SOCKS5?

Tak. Obsługa SOCKS w requests pochodzi z PySocks — zainstaluj to za pomocą pip install "requests[socks]". Punkt końcowy HTTP na porcie 3128 działa z domyślną instalacją requests i bez dodatkowych zależności.

Jak mogę uniknąć zablokowania podczas skanowania?

Wyślij realistycznego User-Agent, ogranicz swoją szybkość żądań, cofnij się przy odpowiedziach 429 i rotuj IP wyjściowe przez pulę proxy. Blokady zazwyczaj dotyczą zachowania i reputacji IP, a nie parsera, którego używasz.

Czy proxy s4m są mieszkalne?

Nie. s4m sprzedaje uwierzytelnione proksy SOCKS5 i HTTP z centrów danych, płatne na zasadzie pay-as-you-go. Oddzielna lista darmowych publicznych proksów jest stroną trzecią i korzystasz z niej na własne ryzyko, przydatna tylko do szybkich testów.

Dlaczego używać socks5h zamiast socks5?

socks5h prosi proxy o rozwiązanie DNS, więc nazwy hostów, które skrobiesz, nigdy nie wyciekają z twojego komputera. Zwykłe socks5 najpierw rozwiązuje lokalnie, co może ujawnić twoje cele.

Proxy stworzone do scrapingu

Wysyłaj żądania do proxy.s4m.online, rotuj przez uwierzytelnione wyjścia SOCKS5 i HTTP w centrum danych i płać tylko za ruch, który wykorzystujesz. Dodaj dedykowane IP, gdy cel tego oczekuje.

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.