Definiuję eksportera elementów, który przesuwa elementy do kolejki komunikatów. Poniżej znajduje się kod.Niestandardowy eksporter 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)
Mam kilka problemów. Elementy nie są przesyłane do kolejki. Ive dodaje następujące do moich ustawień:
FEED_EXPORTERS = {
"queue": 'scrapers.exporters.QueueItemExporter'
}
FEED_FORMAT = "queue"
LOG_STDOUT = True
kodu nie wzbudza żadnych błędów, a nie widzę żadnej z logu. Im na mój rozum koniec, jak to debugować.
Każda pomoc będzie mile widziana.
Myślę, że napisanie rurociągu przedmiotu byłoby prostsze do tego celu i wiązałoby się z mniejszym zakresem kodu, który jest potencjalnym źródłem błędów. Tak więc chciałbym zmienić kod, aby działał jak potok, zamiast eksportera niestandardowych przedmiotów. Zobacz [item pip doc] (http://doc.scrapy.org/en/latest/topics/item-pipeline.html) –
Już napisałem potok, ale moje myślenie było, ponieważ w ten sposób chcę, aby moje wyniki z Skrobaczka, eksporter byłby lepszym miejscem do umieszczenia go. – zsquare
@zsquare, jakikolwiek sukces w tym problemie? Wiem, że to stary post, ale co zrobiłeś? – Medeiros