Integrationer · Mellanliggande nivå

Roterande och klibbiga proxies i Scrapy med en nedladdare middleware

Scrapys HttpProxyMiddleware stöder autentiserade HTTP-proxies genom Konfigurera den faktiska levererade gatewayen, sprid inställningen till uppföljningsbegäranden och verifiera det tilldelade sessionsläget innan du ökar samtidigheten.

2 min lästid 4 sektioner Granskad Redaktionsteamet Proxy Cyber

Den enklaste versionen#

Klassificera svaret innan du försöker igen. Ett 403-fel kan indikera en åtkomstregel som inte kommer att lösas av en annan IP-adress. För 429, respektera Retry-After och minska begäranshastigheten; använd begränsad backoff för tillfälliga anslutningar eller serverfel.

spider.py
import scrapy

PROXY = "http://USER-cc-us:PASS@res.proxy-cyber.com:9000"

class PricesSpider(scrapy.Spider):
    name = "prices"
    start_urls = ["https://example.com/catalog"]

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, meta={"proxy": PROXY})

    def parse(self, response):
        for href in response.css("a.product::attr(href)").getall():
            yield response.follow(href, callback=self.parse_product, meta={"proxy": PROXY})

    def parse_product(self, response):
        yield {"url": response.url, "price": response.css(".price::text").get()}

En middleware för sticky sessioner per objekt#

Sök efter middlewares.py
import hashlib

class Proxy CyberMiddleware:
    GATEWAY = "res.proxy-cyber.com:9000"

    def __init__(self, user, password, country):
        self.user, self.password, self.country = user, password, country

    @classmethod
    def from_crawler(cls, crawler):
        s = crawler.settings
        return cls(s.get("KEY_PROXY_USER"), s.get("KEY_PROXY_PASS"), s.get("KEY_PROXY_COUNTRY", "us"))

    def process_request(self, request, spider):
        # Sticky when the request carries a session key (e.g. one per product flow), rotating otherwise
        key = request.meta.get("session_key")
        user = f"{self.user}-cc-{self.country}"
        if key:
            sid = hashlib.sha1(key.encode()).hexdigest()[:12]
            user += f"-sid-{sid}-ttl-10m"
        request.meta["proxy"] = f"http://{user}:{self.password}@{self.GATEWAY}"
settings.py
DOWNLOADER_MIDDLEWARES = {
    "myproject.middlewares.Proxy CyberMiddleware": 350,   # before HttpProxyMiddleware (750)
}
KEY_PROXY_USER = "USER"
KEY_PROXY_PASS = "PASS"
KEY_PROXY_COUNTRY = "de"

CONCURRENT_REQUESTS = 32
CONCURRENT_REQUESTS_PER_DOMAIN = 8
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_TARGET_CONCURRENCY = 4.0
DOWNLOAD_TIMEOUT = 45
RETRY_ENABLED = True
RETRY_TIMES = 2
RETRY_HTTP_CODES = [408, 429, 500, 502, 503, 504, 522, 524]
COMPRESSION_ENABLED = True

Återanvändning av anslutning och IP-tilldelning är olika kontroller. En klientsession återanvänder sockets; endast den tilldelade gatewayen bestämmer rotation och sessionsbeteendet för fasta sessioner. Använd sessionsparametrarna som medföljer tjänsten och verifiera utgången över flera begäranden. Att stänga en socket eller skicka Connection: close garanterar inte en annan IP.

Håller räkningen nere#

  • Scrapy laddar inte bilder eller skript; HTML och JSON bara, så en sida kostar sin HTML-storlek.
  • Aktivera komprimering (standard) och undvik Splash eller webbläsare rendering om inte data behöver det.
  • Cache med HTTPCACHE_ENABLED = True under utvecklingen så att du inte betalar för att hämta samma sidor igen när du felsöker väljare.

Hövlighet per domän#

En pool är ett sätt att vara många artiga besökare, inte en oförskämd en. CONCURRENT_REQUESTS_PER_DOMAIN och AutoThrottle håller varje mål på en mänsklig-plausibel hastighet per utgång; Policy för godtagbar användning förbjuder allt som ser ut som en attack.

Frågor som folk ställer#

Behöver jag scrapy-rotating-proxies?

Inte med en gateway: rotation sker på Proxy Cyber-sidan för varje ny anslutning.Det paketet hanterar listor över statiska proxyserver; med res.proxy-cyber.com finns det en proxy att konfigurera.

Hur använder jag ett annat land per förfrågan?

Ställ in request.meta["country"] i spindeln och läs den i mellanprogrammet för att bygga -cc-parametern; exemplet använder en enda inställning för korthet.

Ditt konto -

Hantera alla dina proxyer på ett konto

Jämför nätverk, placera beställningar och följ ditt saldo och supportbegäranden från en enda kontrollpanel.Vårt team granskar betalningar och ger anslutningsuppgifter efter leverans.

Skapa konto