Najpreprostejša različica#
403 lahko označuje pravilo dostopa, ki ga drugi IP ne bo razrešil. Za 429 upoštevajte Retry-After in zmanjšajte hitrost zahteve; uporabite omejeno začasno zaustavitev za začasne povezave ali napake strežnika. Ponovno poskusite operacije spreminjanja stanja le, če lahko preprečite podvojena dejanja.
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()}Middleware za lepljive seje na element#
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 = TruePonovna uporaba povezave in dodelitev IP sta različni kontrolniki. Odjemalska seja ponovno uporablja vtičnice; samo dodeljeni prehod določa rotacijo in vedenje lepljive seje. Uporabite parametre seje, ki so priloženi vaši storitvi, in preverite izhod na več zahtevah. Zapiranje vtičnice ali pošiljanje Povezava: zaprite ne zagotavlja drugačnega IP-ja.
Znižanje računa#
- Scrapy ne nalaga slik ali skriptov; samo HTML in JSON, zato stran stane svojo velikost HTML.
- Omogoči stiskanje (privzeto) in se izogibaj
Splashali brskalnik upodabljanja, razen če podatki potrebujejo to. - Predpomnilnik z
HTTPCACHE_ENABLED = TrueMed razvojem, tako da ne plačate za ponovno pridobivanje istih strani med odpravljanjem napak selektorjev.
Vljudnost na domeno#
Bazen je način, da so številni vljudni obiskovalci, ne en nesramen. CONCURRENT_REQUESTS_PER_DOMAIN AutoThrottle ohranja vsak cilj na človeško verjetni stopnji na izhod; Politika sprejemljive uporabe Prepoveduje vse, kar izgleda kot napad.
Vprašanja, ki jih ljudje postavljajo#
Ali potrebujem scrapy-rotating-proxies?
Ne z gatewayjem: rotacija se zgodi na strani Proxy Cyber za vsako novo povezavo. Ta paket upravlja s seznamom statičnih proxyjev; z res.proxy-cyber.com je en proxy, ki ga je treba konfigurirati.
Kako lahko uporabim drugo državo za vsak zahtevek?
Nastavite request.meta["country"] v pajku in ga preberite v middleware-u, da zgradite parameter -cc-; primer uporablja eno nastavitev za kratkost.