2017-07-11 2 views
1

Je veux un middleware qui va prendre une seule demande et le transformer en un générateur de deux demandes différentes. Pour autant que je sache, la méthode middleware downloader process_request() ne peut renvoyer qu'une seule requête, pas un générateur d'entre eux. Existe-t-il un bon moyen de diviser une requête arbitraire en plusieurs requêtes?Middleware Scrapy pour remplacer une requête unique avec plusieurs demandes

Il semble que le middleware spider process_start_requests se produit réellement après les start_requests Les demandes sont envoyées via le téléchargeur. Par exemple, si je mets start_urls = ['https://localhost/'] et

def process_start_requests(self, start_requests, spider): 
    yield Request('https://stackoverflow.com') 

il échouera avec ConnectionRefusedError, après avoir essayé et échoué la demande localhost.

+1

Je ne peux pas reproduire votre erreur. Définir 'process_start_requests' dans un middleware spider, cédant' scrapy.Request ('http://www.stackoverflow.com') 'fonctionne pour moi –

+0

@paultrmbrth Vous avez raison; ce n'était pas la source de mon problème. [Cette question] (https://stackoverflow.com/questions/45026532/async-query-database-for-keys-to-use-in-multiple-requests) explique mieux ma situation. – Hatshepsut

Répondre

2

Je ne sais pas quelle serait la logique derrière la transformation d'une demande (avant d'être envoyé) en plusieurs demandes, mais vous pouvez toujours générer plusieurs demandes (ou même des articles) à partir d'un middleware, avec ceci:

def process_request(self, request, spider): 
    for a in range(10): 
     spider.crawler.engine.crawl(
      Request(url='myurl', callback=callback_method), 
      spider) 
+0

Est-ce que ceux-ci vont encore passer par les middlewares de téléchargement ultérieurs? – Hatshepsut

+0

Pas tout à fait sûr, mais oui je pense qu'il devrait. – eLRuLL

+0

Existe-t-il un moyen d'envoyer ceci différé au lieu de demander? Il semble que les middlewares du planificateur n'acceptent pas les arguments différés. – Hatshepsut