Den enkleste version#
Klassificer svaret, før du forsøger igen. En 403 kan angive en adgangsregel, som en anden IP ikke vil løse. For 429 skal du respektere Retry-After og reducere anmodningsfrekvensen. Brug begrænset tilbagetrækning til midlertidige forbindelser eller serverfejl.
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 til klæbrige sessioner pr. emne#
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}"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 = TrueGenbrug af forbindelse og IP-tildeling er forskellige kontrolelementer. En klientsession genbruger sockets, kun den tildelte gateway bestemmer rotation og funktionsmåde for fastlåst session. Brug de sessionsparametre, der leveres med din tjeneste, og bekræft exit over flere anmodninger. Lukning af en socket eller afsendelse af Connection: close garanterer ikke en anden IP.
Hold regningen nede#
- Scrapy indlæser ikke billeder eller scripts; HTML og JSON kun, så en side koster sin HTML-størrelse.
- Aktiver komprimering (standard) og undgå
Splasheller browser rendering, medmindre dataene har brug for det. - Cache med
HTTPCACHE_ENABLED = Trueunder udvikling, så du ikke betaler for at hente de samme sider igen, mens du fejlsøger vælgere.
Høflighed pr. domæne#
En pool er en måde at være mange høflige besøgende, ikke én uhøflig. CONCURRENT_REQUESTS_PER_DOMAIN og AutoThrottle holder hvert mål på en menneskelig-plausibel hastighed pr exit; Politik for acceptabel brug forbyder alt, der ligner et angreb.
Spørgsmål folk stiller#
Har jeg brug for scrapy-rotating-proxies?
Ikke med en gateway: rotation sker på Proxy Cyber-siden for hver ny forbindelse.Den pakke håndterer lister over statiske proxyer; med res.proxy-cyber.com er der én proxy at konfigurere.
Hvordan bruger jeg et andet land pr. anmodning?
Sæt request.meta ["land"] i spider og læse det i middleware til at bygge -cc- parameter; eksemplet bruger en enkelt indstilling for kortfattethed.