Η απλούστερη έκδοση#
Κατηγοριοποιήστε την απόκριση πριν προσπαθήσετε ξανά. Ένα σφάλμα 403 μπορεί να υποδεικνύει έναν κανόνα πρόσβασης που δεν θα επιλύσει μια άλλη διεύθυνση IP Για το σφάλμα του 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Η επαναχρησιμοποίηση σύνδεσης και η εκχώρηση είναι διαφορετικά στοιχεία ελέγχου. Μια περίοδος λειτουργίας υπολογιστή-πελάτη χρησιμοποιεί ξανά τις υποδοχές, μόνο η πύλη που έχει ανατεθεί καθορίζει την περιστροφή και τη συμπεριφορά της συνεδρίας Χρησιμοποιήστε τις παραμέτρους περιόδου λειτουργίας που παρέχονται με την υπηρεσία σας και επιβεβαιώστε την έξοδο σε πολλά αιτήματα. Το κλείσιμο μιας υποδοχής ή η αποστολή του μηνύματος δεν εγγυάται διαφορετική διεύθυνση IP Ο χρήστης μπορεί να επιλέξει ένα από τα δύο παρακάτω:
Κρατώντας το λογαριασμό χαμηλά#
- Το Scrapy δεν φορτώνει εικόνες ή σενάρια, μόνο HTML και JSON, έτσι μια σελίδα κοστίζει το μέγεθός της.
- Ενεργοποίηση συμπίεσης (προεπιλογή) και αποφυγή
Splashή απόδοση προγράμματος περιήγησης εκτός αν τα δεδομένα το χρειάζονται. - Κρύψτε με
HTTPCACHE_ENABLED = Trueκατά τη διάρκεια της ανάπτυξης, έτσι ώστε να μην πληρώνουν για να ξαναπάρει τις ίδιες σελίδες κατά την αποσφαλμάτωση των επιλογέων.
Ευγένεια ανά τομέα#
Μια δεξαμενή διευθύνσεων IP είναι ένας τρόπος για να είναι πολλοί ευγενικοί επισκέπτες, όχι ένα αγενές. CONCURRENT_REQUESTS_PER_DOMAIN και κρατούν κάθε στόχο σε ένα ανθρώπινος-ευχάριστο ποσοστό ανά έξοδο ο Πολιτική αποδεκτής χρήσης απαγορεύει οτιδήποτε μοιάζει με επίθεση.
Ερωτήσεις που κάνουν οι χρήστες#
Χρειάζομαι γραφικά-περιστρεφόμενα-διαμεσολαβητές;
Not with a gateway: rotation happens on the Proxy Cyber side for every new connection. That package manages lists of static proxies; with res.proxy-cyber.com there is one proxy to configure.
Πώς μπορώ να χρησιμοποιήσω διαφορετική χώρα ανά αίτημα;
Ορίστε το στην αράχνη και διαβάστε το στο μεσαίο λογισμικό για να δημιουργήσετε την παράμετρο -το παράδειγμα χρησιμοποιεί μια ενιαία ρύθμιση για τη συντομία.