Η αλλαγή του 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, όχι υπόσχεση ότι η επανάληψη μιας αυθαίρετης υποβληθείσας συναλλαγής είναι ασφαλής.

Σχετικά άρθρα