Estoy definiendo un exportador de elementos que empuja los artículos a una cola de mensajes. A continuación está el código.Scrapy exportador personalizado
from scrapy.contrib.exporter import JsonLinesItemExporter
from scrapy.utils.serialize import ScrapyJSONEncoder
from scrapy import log
from scrapy.conf import settings
from carrot.connection import BrokerConnection, Exchange
from carrot.messaging import Publisher
log.start()
class QueueItemExporter(JsonLinesItemExporter):
def __init__(self, **kwargs):
log.msg("Initialising queue exporter", level=log.DEBUG)
self._configure(kwargs)
host_name = settings.get('BROKER_HOST', 'localhost')
port = settings.get('BROKER_PORT', 5672)
userid = settings.get('BROKER_USERID', "guest")
password = settings.get('BROKER_PASSWORD', "guest")
virtual_host = settings.get('BROKER_VIRTUAL_HOST', "/")
self.encoder = settings.get('MESSAGE_Q_SERIALIZER', ScrapyJSONEncoder)(**kwargs)
log.msg("Connecting to broker", level=log.DEBUG)
self.q_connection = BrokerConnection(hostname=host_name, port=port,
userid=userid, password=password,
virtual_host=virtual_host)
self.exchange = Exchange("scrapers", type="topic")
log.msg("Connected", level=log.DEBUG)
def start_exporting(self):
spider_name = "test"
log.msg("Initialising publisher", level=log.DEBUG)
self.publisher = Publisher(connection=self.q_connection,
exchange=self.exchange, routing_key="scrapy.spider.%s" % spider_name)
log.msg("done", level=log.DEBUG)
def finish_exporting(self):
self.publisher.close()
def export_item(self, item):
log.msg("In export item", level=log.DEBUG)
itemdict = dict(self._get_serialized_fields(item))
self.publisher.send({"scraped_data": self.encoder.encode(itemdict)})
log.msg("sent to queue - scrapy.spider.naukri", level=log.DEBUG)
Estoy teniendo algunos problemas. Los artículos no se envían a la cola. Ive añadió lo siguiente a mi configuración:
FEED_EXPORTERS = {
"queue": 'scrapers.exporters.QueueItemExporter'
}
FEED_FORMAT = "queue"
LOG_STDOUT = True
El código no plantea ningún error, y tampoco puedo ver ninguno de los mensajes de registro. Estoy en mi ingenio final sobre cómo depurar esto.
Cualquier ayuda sería muy apreciada.
Creo que escribir un ítem sería más simple para este propósito, e involucraría menos código repetitivo, que es una fuente potencial de errores. Por lo tanto, volvería a configurar el código para que funcione como una interconexión, en lugar de como un exportador de elementos personalizado. Ver [item pipeline doc] (http://doc.scrapy.org/en/latest/topics/item-pipeline.html) –
Ya he escrito una canalización, pero mi pensamiento era, ya que así es como quiero que mi salida de el raspador, el exportador sería un mejor lugar para ponerlo. – zsquare
@zsquare, ¿hay algún éxito con este problema? Sé que es una publicación anterior, pero ¿qué hiciste? – Medeiros