10 votes

Comment ajouter des en-têtes aux requêtes de Scrapy CrawlSpider ?

Je travaille avec la classe CrawlSpider pour explorer un site Web et je voudrais modifier les en-têtes qui sont envoyés dans chaque requête. Plus précisément, je voudrais ajouter le référent à la requête.

Conformément à cette question J'ai vérifié.

response.request.headers.get('Referer', None)

dans ma fonction d'analyse de la réponse et le Referer n'est pas présent. Je suppose que cela signifie que le Referer n'est pas soumis dans la requête (à moins que le site web ne le renvoie pas, je n'en suis pas sûr).

Je n'ai pas réussi à trouver comment modifier les en-têtes d'une requête. Encore une fois, mon araignée est dérivée de CrawlSpider. En surchargeant la méthode de CrawlSpider _requests_to_follow ou en spécifiant un process_request pour une règle ne fonctionnera pas car le référent n'est pas dans la portée à ces moments-là.

Quelqu'un sait-il comment modifier les en-têtes de demande de manière dynamique ?

21voto

warvariuc Points 11787

Vous pouvez passer REFERER manuellement à chaque demande en utilisant headers argument :

yield Request(parse=..., headers={'referer':...})

RefererMiddleware fait la même chose en prenant automatiquement l'url de référence de la réponse précédente.

16voto

CatShoes Points 1390

Je déteste répondre à ma propre question, mais j'ai trouvé comment faire. Vous devez activer le SpiderMiddleware qui va remplir le referer pour les réponses. Voir le documentation para scrapy.contrib.spidermiddleware.referer.RefererMiddleware

En bref, vous devez ajouter cet intergiciel au fichier de paramètres de votre projet.

SPIDER_MIDDLEWARES = {
'scrapy.contrib.spidermiddleware.referer.RefererMiddleware': True,
}

Ensuite, dans votre méthode d'analyse de la réponse, vous pouvez utiliser, response.request.headers.get('Referrer', None) pour obtenir le référent.

Si vous comprenez tout de suite ces logiciels intermédiaires, relisez-les, faites une pause, puis relisez-les à nouveau. Je les ai trouvés très déroutants.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X