सरलतम संस्करण#
पुन: प्रयास करने से पहले प्रतिक्रिया को वर्गीकृत करें। एक 403 एक एक्सेस नियम इंगित कर सकता है कि दूसरा आईपी हल नहीं करेगा। 429 के लिए, रिट्री-अप का सम्मान करें और अनुरोध दर को कम करें; अस्थायी कनेक्शन या सर्वर विफलताओं के लिए बाध्य बैकऑफ का उपयोग करें। केवल जब आप डुप्लिकेट कार्यों को रोक सकते हैं तो रीट्री स्टेट-बदलते ऑपरेशन।
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()}प्रति आइटम स्टिकी सत्रों के लिए एक मिडलवेयर#
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 = Trueकनेक्शन का पुन: उपयोग और आईपी असाइनमेंट अलग-अलग नियंत्रण हैं। एक ग्राहक सत्र सॉकेट का पुन: उपयोग करता है; केवल निर्दिष्ट गेटवे घूर्णन और चिपचिपा सत्र व्यवहार को निर्धारित करता है। अपनी सेवा के साथ आपूर्ति किए गए सत्र मापदंडों का उपयोग करें, और कई अनुरोधों पर निकास को सत्यापित करें। एक सॉकेट को बंद करना या कनेक्शन भेजना: बंद एक अलग आईपी की गारंटी नहीं देता है।
बिल को नीचे रखना#
- स्क्रैपी छवियों या स्क्रिप्ट को लोड नहीं करता है; एचटीएमएल और जेएसओएन केवल, इसलिए एक पृष्ठ अपने एचटीएमएल आकार की लागत रखता है।
- संपीड़न (डिफ़ॉल्ट) सक्षम करें और बचें
Splashजब तक डेटा को इसकी आवश्यकता नहीं होती तब तक ब्राउज़र को प्रदान करना। - कैश के साथ
HTTPCACHE_ENABLED = Trueविकास के दौरान इसलिए आप चयनकर्ताओं को डिबगिंग करते समय उसी पृष्ठ को फिर से प्राप्त करने के लिए भुगतान नहीं करते।
प्रति डोमेन विनम्रता#
एक पूल कई विनम्र आगंतुकों होने का एक तरीका है, एक निर्दोष नहीं है। CONCURRENT_REQUESTS_PER_DOMAIN और AutoThrottle प्रत्येक लक्ष्य को प्रति निकास मानव-चूक दर पर रखता है; स्वीकार्य उपयोग नीति कुछ भी है कि एक हमले की तरह लग रहा है मना करता है।
सवाल पूछो#
क्या मुझे scrapy-rotating-proxies की आवश्यकता है?
एक प्रवेश द्वार के साथ नहीं: रोटेशन हर नए कनेक्शन के लिए Proxy Cyber पक्ष पर होता है। वह पैकेज स्थिर प्रॉक्सी की सूची का प्रबंधन करता है; res.proxy-cyber.com के साथ कॉन्फ़िगर करने के लिए एक प्रॉक्सी है।
मैं प्रति अनुरोध एक अलग देश का उपयोग कैसे करूं?
सेट अनुरोध.meta["country"] मकड़ी में और इसे मध्यवेयर में -cc- पैरामीटर बनाने के लिए पढ़ा; उदाहरण ब्रीविटी के लिए एक सेटिंग का उपयोग करता है।