Mein Scraper funktioniert einwandfrei, wenn ich ihn über die Befehlszeile ausführe, aber wenn ich versuche, ihn innerhalb eines Python-Skripts auszuführen (mit der Methode here mit Twisted) Es gibt nicht die beiden CSV-Dateien aus, die es normalerweise ausführt. Ich habe eine Pipeline, die diese Dateien erstellt und auffüllt, eine davon mit CsvItemExporter() und die andere mit writeCsvFile(). Hier ist der Code:Ausführen von Scrapy aus dem Python-Skript - CSV-Export funktioniert nicht
class CsvExportPipeline(object):
def __init__(self):
self.files = {}
@classmethod
def from_crawler(cls, crawler):
pipeline = cls()
crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
return pipeline
def spider_opened(self, spider):
nodes = open('%s_nodes.csv' % spider.name, 'w+b')
self.files[spider] = nodes
self.exporter1 = CsvItemExporter(nodes, fields_to_export=['url','name','screenshot'])
self.exporter1.start_exporting()
self.edges = []
self.edges.append(['Source','Target','Type','ID','Label','Weight'])
self.num = 1
def spider_closed(self, spider):
self.exporter1.finish_exporting()
file = self.files.pop(spider)
file.close()
writeCsvFile(getcwd()+r'\edges.csv', self.edges)
def process_item(self, item, spider):
self.exporter1.export_item(item)
for url in item['links']:
self.edges.append([item['url'],url,'Directed',self.num,'',1])
self.num += 1
return item
Hier ist meine Dateistruktur:
SiteCrawler/ # the CSVs are normally created in this folder
runspider.py # this is the script that runs the scraper
scrapy.cfg
SiteCrawler/
__init__.py
items.py
pipelines.py
screenshooter.py
settings.py
spiders/
__init__.py
myfuncs.py
sitecrawler_spider.py
Der Schaber erscheint normalerweise in jeder anderen Hinsicht zu funktionieren. Die Ausgabe am Ende der Befehlszeile deutet darauf hin, dass die erwartete Anzahl von Seiten durchsucht wurde und der Spider scheinbar normal beendet wurde. Ich bekomme keine Fehlermeldungen.
---- EDIT: ----
Einfügen von print-Anweisungen und Syntaxfehler in der Pipeline hat keine Wirkung, so scheint es, dass die Pipeline wird ignoriert. Warum könnte das sein? Hier
ist der Code für das Skript, das den Schaber läuft (runspider.py):
from twisted.internet import reactor
from scrapy import log, signals
from scrapy.crawler import Crawler
from scrapy.settings import Settings
from scrapy.xlib.pydispatch import dispatcher
import logging
from SiteCrawler.spiders.sitecrawler_spider import MySpider
def stop_reactor():
reactor.stop()
dispatcher.connect(stop_reactor, signal=signals.spider_closed)
spider = MySpider()
crawler = Crawler(Settings())
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start(loglevel=logging.DEBUG)
log.msg('Running reactor...')
reactor.run() # the script will block here until the spider is closed
log.msg('Reactor stopped.')
Können die Dateien woanders geschrieben werden? können Sie Ihre Ausgabedateipfade überprüfen oder absolute Dateipfade verwenden? –
@pault. Guter Punkt. Ich habe es jetzt mit os.path.dirname (__ file__), getcwd() und dem genauen eingegebenen Dateipfad versucht. Leider haben diese keinen Unterschied gemacht. – jkdune
Ich habe versucht, print-Anweisungen hinzuzufügen, um anzuzeigen, was getcwd() und os.path.dirname (Datei) ausgegeben hat, aber sie scheinen nicht ausgeführt zu werden. Bedeutet das, dass die Pipeline ignoriert wird? Oder läuft das im Inneren des Reaktors und behindert mich beim Drucken? – jkdune