Ho un problema. Devo interrompere l'esecuzione di una funzione per un po ', ma non interrompere l'implementazione del parsing nel suo complesso. Cioè, ho bisogno di una pausa non bloccante.Scrapy: pausa non bloccante
E 'assomiglia:
class ScrapySpider(Spider):
name = 'live_function'
def start_requests(self):
yield Request('some url', callback=self.non_stop_function)
def non_stop_function(self, response):
for url in ['url1', 'url2', 'url3', 'more urls']:
yield Request(url, callback=self.second_parse_function)
# Here I need some function for sleep only this function like time.sleep(10)
yield Request('some url', callback=self.non_stop_function) # Call itself
def second_parse_function(self, response):
pass
Funzione non_stop_function deve essere fermato per un po', ma non dovrebbe bloccare il resto della produzione.
Se inserisco time.sleep()
- interromperà l'intero parser, ma non ne ho bisogno. È possibile interrompere una funzione utilizzando twisted
o qualcos'altro?
Motivo: È necessario creare una funzione non bloccante che analizzerà la pagina del sito Web ogni n secondi. Lì riceverà url e riempirà per 10 secondi. Gli URL che sono stati ottenuti continueranno a funzionare, ma la funzionalità principale deve essere interrotta.
UPDATE:
Grazie a TkTech e viach. Una risposta mi ha aiutato a capire come effettuare una sospensione Request
, e la seconda è come attivarla. Entrambe le risposte si completano a vicenda e io abbiamo fatto un ottimo pausa non-blocking per Scrapy:
def call_after_pause(self, response):
d = Deferred()
reactor.callLater(10.0, d.callback, Request(
'https://example.com/',
callback=self.non_stop_function,
dont_filter=True))
return d
E utilizzare questa funzione per la mia richiesta:
yield Request('https://example.com/', callback=self.call_after_pause, dont_filter=True)
Questo approccio può aiutare? http://stackoverflow.com/questions/37002742/calling-the-same-spider-programmatically/37007619#37007619 –
@RafaelAlmeida Non è un modo molto conveniente. Voglio usare questa pausa in futuro senza compromettere l'architettura del parser. – JRazor
vuoi metterlo in pausa per non fare una richiesta? o semplicemente mettere in pausa all'interno del metodo? sarebbe molto utile se potessi specificare una ragione di questa pausa. – eLRuLL