Relancer un GET Scrapy via un autre proxy
Utilisez l’assistant de nouvelle tentative de Scrapy pour planifier une requête neuve avec un nouveau proxy, tout en respectant le budget de tentatives.
Modifier response.request.meta modifie un objet Python. Pour effectuer un autre téléchargement, il faut fournir à Scrapy une autre Request à planifier.
Pour un GET que votre callback décide explicitement de relancer, l’assistant public de nouvelle tentative de Scrapy peut conserver la comptabilisation des tentatives avec la requête neuve :
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
Il s’agit d’un assistant de spider. L’appelant doit renvoyer ou yield la Request obtenue lorsqu’une est disponible. None signifie que l’assistant a refusé une nouvelle tentative dans la limite applicable.
L’assistant de nouvelle tentative copie la requête, met à jour son compteur de tentatives et fournit le comportement de planificateur adapté à une nouvelle tentative. Yield la même URL comme une requête neuve ordinaire risque plutôt de heurter le filtrage des doublons.
Utilisez une URL de proxy prise en charge par l’HttpProxyMiddleware activé. Pour les nouvelles tentatives de requêtes GET publiques autorisées, un candidat HTTP non authentifié de la liste de proxys HTTP peut fournir proxy_url. Effacer un champ proxy-authorization précédemment attaché évite de reporter l’en-tête d’un ancien intermédiaire dans cette sélection ; laissez le middleware dériver le nouveau compte de la nouvelle URL de proxy le cas échéant.
Gardez ce choix au niveau du callback séparé de la gestion automatique par RetryMiddleware de ses échecs configurés. Décidez quelle couche possède la nouvelle tentative afin que l’opération ne consomme pas deux budgets indépendants. L’exemple concerne un travail GET rejouable, non la promesse que répéter une transaction soumise arbitraire est sans risque.