Sto definendo un esportatore di elementi che spinge gli oggetti in una coda di messaggi. Di seguito è riportato il codice.Esportatore personalizzato di scrapy
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)
Ho qualche problema. Gli articoli non vengono inviati alla coda. Ive ha aggiunto quanto segue per le mie impostazioni:
FEED_EXPORTERS = {
"queue": 'scrapers.exporters.QueueItemExporter'
}
FEED_FORMAT = "queue"
LOG_STDOUT = True
Il codice non solleva eventuali errori, e non posso vedere uno dei messaggi di registrazione. Sono alla mia intelligenza fine su come eseguire il debug di questo.
Qualsiasi aiuto sarebbe molto apprezzato.
Penso che scrivere una pipeline di articoli sia più semplice per questo scopo e coinvolgere meno codice di codice, che è una potenziale fonte di errori. Quindi vorrei refactoring il tuo codice per funzionare come una pipeline, invece di un esportatore di articoli personalizzati. Vedi [item pipeline doc] (http://doc.scrapy.org/en/latest/topics/item-pipeline.html) –
Ive ha già scritto una pipeline, ma il mio pensiero è stato, poiché è così che voglio il mio output da il raschietto, l'esportatore sarebbe un posto migliore per metterlo. – zsquare
@zsquare, qualsiasi successo in questo problema? So che è un vecchio post ma cosa hai fatto? – Medeiros