Επανάληψη GET του Scrapy μέσω άλλου διαμεσολαβητή
Χρησιμοποιήστε τον βοηθό επανάληψης του Scrapy για να προγραμματίσετε νέο αίτημα με νέο διαμεσολαβητή, σεβόμενοι τον προϋπολογισμό επαναλήψεων.
Η αλλαγή του response.request.meta αλλάζει ένα αντικείμενο Python. Για άλλη λήψη, πρέπει να δώσετε στο Scrapy άλλο Request για προγραμματισμό.
Για ένα GET που το callback σας αποφασίζει ρητά να επαναλάβει, ο δημόσιος βοηθός επανάληψης του Scrapy μπορεί να κρατήσει τη λογιστική επαναλήψεων με το νέο αίτημα:
from scrapy.downloadermiddlewares.retry import get_retry_request
def retry_through(self, response, proxy_url):
retry = get_retry_request(
response.request,
spider=self,
reason='choose_another_proxy',
)
if retry is None:
return None
retry.meta['proxy'] = proxy_url
retry.headers.pop('Proxy-Authorization', None)
return retry
Αυτός είναι βοηθός spider. Ο καλών πρέπει να επιστρέψει ή να κάνει yield το Request που προκύπτει όταν υπάρχει. Το None σημαίνει ότι ο βοηθός αρνήθηκε άλλη επανάληψη εντός του ισχύοντος ορίου.
Ο βοηθός επανάληψης αντιγράφει το αίτημα, ενημερώνει τον μετρητή επαναλήψεών του και παρέχει τη συμπεριφορά προγραμματιστή που αρμόζει σε επανάληψη. Το να κάνετε απλώς yield το ίδιο URL ως συνηθισμένο νέο αίτημα μπορεί αντ' αυτού να συναντήσει φιλτράρισμα διπλοτύπων.
Χρησιμοποιήστε ένα URL διαμεσολαβητή που υποστηρίζει το ενεργό HttpProxyMiddleware. Για επαναλήψεις επιτρεπόμενων δημόσιων GET αιτημάτων, ένα μη πιστοποιημένο HTTP υποψήφιο από τη λίστα διαμεσολαβητών HTTP μπορεί να παρέχει proxy_url. Η εκκαθάριση ενός προηγουμένως συνημμένου πεδίου proxy-authorization αποφεύγει τη μεταφορά κεφαλίδας παλιού μεσάζοντα σε αυτή την επιλογή· αφήστε το middleware να εξαγάγει τον νέο λογαριασμό από το νέο URL διαμεσολαβητή όταν ισχύει.
Κρατήστε αυτή την επιλογή σε επίπεδο callback ξεχωριστή από τον αυτόματο χειρισμό των ρυθμισμένων αποτυχιών από το RetryMiddleware. Αποφασίστε ποιο επίπεδο κατέχει την επανάληψη ώστε η λειτουργία να μην καταναλώνει δύο ανεξάρτητους προϋπολογισμούς. Το παράδειγμα αφορά επαναλήψιμη εργασία GET, όχι υπόσχεση ότι η επανάληψη μιας αυθαίρετης υποβληθείσας συναλλαγής είναι ασφαλής.