Integrari · Intermediare

Rotaţii şi proxy-uri lipicioase în Scrapy cu un mijlocar de descărcare

Scrapy? HttpProxyMiddleware suportă proxy-uri HTTP autentificate prin cerere.meta["proxy"]. Configurați poarta de acces livrată efectiv, propagați setarea pentru a urmări cererile și a verifica modul de sesiune atribuit înainte de creșterea conion.

2 min citește 4 secţiuni Revizuit Echipa editorială Proxy Cyber

Cea mai simplă versiune#

Clasifică răspunsul înainte de rejudecare. O 403 poate indica o regulă de acces pe care un alt IP nu o va rezolva. Pentru 429, respectați rata de remetrie-După și reduceți rata de solicitare; utilizați backoff delimitată pentru conexiune temporară sau eșecuri ale serverului. Operațiuni de retehnologizare doar atunci când puteți preveni acțiuni duplicate.

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

Un mijloc de lucru pentru sesiuni lipicioase per element#

Middleware-uri.
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}"
setările.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

Refolosirea conexiunii și alocarea IP sunt controale diferite. O sesiune de client reutilizează prizele; numai poarta atribuită determină rotație și comportamentul lipicios-sesiune. Utilizați parametrii sesiunii furnizate cu serviciul dvs., și verificați ieșirea peste mai multe cereri. Închiderea unei prize sau trimiterea Conexiunii: închide nu garantează un IP diferit.

Păstrarea facturii în jos#

  • Scrapy nu încarcă imagini sau script-uri; HTML și JSON numai, astfel încât o pagină costă dimensiunea HTML.
  • Activează compresie (default) și evită Splash sau redarea browser-ului, cu excepția cazului în care datele au nevoie de el.
  • Cache cu HTTPCACHE_ENABLED = True în timpul dezvoltării, astfel încât să nu plătiți pentru a re-aduce aceleași pagini în timp ce depanați selectorii.

Politețe per-domeniul#

O piscină este o modalitate de a fi mulţi vizitatori politicoşi, nu unul nepoliticos. CONCURRENT_REQUESTS_PER_DOMAIN și AutoThrottle să păstreze fiecare țintă la o rată plauzibilă pentru om pe ieșire; politica de utilizare acceptabilă interzice orice pare a fi un atac.

Întrebări pe care oamenii le pun#

Am nevoie de proxietăti?

Nu cu o poartă: rotirea se întâmplă pe partea cheie Proxy pentru fiecare conexiune nouă. Acest pachet gestionează liste de proxy statice; cu res.proxy-cyber.com există un proxy pentru a configura.

Cum pot folosi o altă țară pe cerere?

Set request.meta["country"] în păianjen și citiți-l în mijlocware pentru a construi -cc- parametru; exemplul folosește un singur set pentru brevity.

Contul dumneavoastră

Administrează toate proxy-urile într-un singur cont

Comparați rețelele, plasați comenzile și urmați cererile de echilibru și suport de la un tablou de bord. Echipa noastră evaluează plățile și oferă detalii de conexiune după livrare.

Creează cont