example español crawlspider crawler crawl python scrapy web-crawler twisted scrapy-spider

crawlspider - scrapy python español



Obtenga resultados/resultados del rastreador de Scrapy en la función de archivo de script (2)

Estoy usando un archivo de script para ejecutar una araña dentro del proyecto de scrapy y araña está registrando los resultados / resultados del rastreador. Pero quiero usar los resultados / resultados de spider en ese archivo de script en alguna función. No quería guardar los resultados en ningún archivo o base de datos. Aquí está el código de Script get from https://doc.scrapy.org/en/latest/topics/practices.html#run-from-script

from twisted.internet import reactor from scrapy.crawler import CrawlerRunner from scrapy.utils.log import configure_logging from scrapy.utils.project import get_project_settings configure_logging({''LOG_FORMAT'': ''%(levelname)s: %(message)s''}) runner = CrawlerRunner(get_project_settings()) d = runner.crawl(''my_spider'') d.addBoth(lambda _: reactor.stop()) reactor.run() def spider_output(output): # do something to that output

¿Cómo puedo obtener spider en el método ''spider_output''? Es posible obtener resultados / resultados.


AFAIK no hay forma de hacer esto, ya que crawl () :

Devuelve un diferido que se activa cuando finaliza el rastreo.

Y el rastreador no almacena resultados en ninguna otra parte que no sea enviarlos al registrador.

Sin embargo, devolver la salida entra en conflicto con toda la naturaleza asincrónica y la estructura de scrapy, por lo que guardarlo en un archivo y luego leerlo es un enfoque preferido aquí.
Simplemente puede diseñar una tubería que guarde sus artículos en un archivo y simplemente lea el archivo en su spider_output . Recibirá sus resultados ya que reactor.run() está bloqueando su script hasta que el archivo de salida esté completo de todos modos.


Aquí está la solución que obtiene todos los resultados en una lista

from twisted.internet import reactor from scrapy.crawler import CrawlerRunner from scrapy.utils.project import get_project_settings from scrapy.xlib.pydispatch import dispatcher from scrapy import signals def spider_results(): results = [] def crawler_results(parse_result): results.append(parse_result) dispatcher.connect(crawler_results, signal=signals.item_passed) runner = CrawlerRunner(get_project_settings()) running_crawler = runner.crawl(''my_spider'') running_crawler.addBoth(lambda _: reactor.stop()) reactor.run() spider_results()