Integraties · Gemiddeld

Draaiende en kleverige proxies in Scrapy met een downloader middleware

Scrapy.HttpProxyMiddleware ondersteunt geauthentiseerde HTTP proxies via request.meta["proxy"]. Configureer de daadwerkelijk geleverde gateway, propageer de instelling om op te volgen verzoeken en verifieer de toegewezen sessie modus voor het verhogen van concurrency.

2 minuten lezen 4 secties Gecontroleerd Redactie Proxy Cyber

De eenvoudigste versie#

Classificeer het antwoord voordat u het opnieuw probeert. Een 403 kan een toegangsregel aangeven die een ander IP-adres niet zal oplossen. Voor 429, respecteer Retry-After en verlaag de aanvraagsnelheid; gebruik begrensde back-off voor tijdelijke verbinding of serverstoringen. Probeer state-changing operaties alleen wanneer u dubbele acties kunt voorkomen.

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()}

Een middleware voor plakkerige sessies per item#

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}"
instellingen.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

Verbindingshergebruik en IP-toewijzing zijn verschillende bedieningen. Een clientsessie gebruikt sockets; alleen de toegewezen gateway bepaalt rotatie en kleverig-sessiegedrag. Gebruik de sessieparameters die bij uw service worden geleverd, en verifieer de exit via verschillende verzoeken. Het sluiten van een socket of het verzenden van Verbinding: sluiten garandeert geen ander IP-adres.

De rekening laag houden#

  • Scrapy laadt geen afbeeldingen of scripts; alleen HTML en JSON, dus een pagina kost zijn HTML-grootte.
  • Schakel compressie in (standaard) en vermijd Splash of browser rendering tenzij de gegevens nodig hebben.
  • Cache met HTTPCACHE_ENABLED = True tijdens de ontwikkeling, zodat u niet betaalt om dezelfde pagina's opnieuw op te halen tijdens het debuggen van selecties.

Beleefdheid per domein#

Een zwembad is een manier om veel beleefde bezoekers te zijn, niet één onbeleefde. CONCURRENT_REQUESTS_PER_DOMAIN en AutoThrottle houden elk doel op een menselijk-plausibele snelheid per uitgang; de aanvaardbaar gebruiksbeleid Dat verbiedt alles wat op een aanval lijkt.

Vragen die mensen stellen#

Heb ik scrapy-roterende proxy's nodig?

Niet met een gateway: rotatie gebeurt aan de Proxy Cyber kant voor elke nieuwe verbinding. Dat pakket beheert lijsten van statische proxy's; met res.proxy-cyber.com is er één proxy om in te stellen.

Hoe gebruik ik een ander land per aanvraag?

Stel request.meta["country"] in de spin in en lees het in de middleware om de -cc- parameter te bouwen; het voorbeeld gebruikt een enkele instelling voor kortzichtigheid.

Uw rekening

Beheer uw proxy's in één account

Vergelijk netwerken, plaats bestellingen en volg uw saldo en ondersteuningsverzoeken vanaf één dashboard. Ons team beoordeelt betalingen en verstrekt verbindingsgegevens na levering.

Account aanmaken