2013-07-20 7 views
6

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.') 
+1

Können die Dateien woanders geschrieben werden? können Sie Ihre Ausgabedateipfade überprüfen oder absolute Dateipfade verwenden? –

+0

@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

+0

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

Antwort

1

Das Ersetzen von "from scrapy.settings import Settings" mit "from scrapy.utils.project import get_project_settings als Settings" behebt das Problem.

Die Lösung wurde here gefunden. Keine Erklärung der Lösung wurde zur Verfügung gestellt.

alecxe hat an example wie Scrapy von innerhalb eines Python-Skripts ausgeführt wird, bereitgestellt.

EDIT:

genauer durch alecxe den Beitrag gelesen haben, kann ich den Unterschied nun zwischen "von scrapy.settings importieren Einstellungen" und "von scrapy.utils.project Import get_project_settings als Settings". Letzteres ermöglicht es Ihnen, die Einstellungsdatei Ihres Projekts im Gegensatz zu einer endgültigen Einstellungsdatei zu verwenden. Lesen Sie den Beitrag von alecxe (verlinkt mit oben) für weitere Details.

0

In meinem Projekt ich den scrapy Code in einem anderen Python-Skript aufrufen mit os.system

import os 
os.chdir('/home/admin/source/scrapy_test') 
command = "scrapy crawl test_spider -s FEED_URI='file:///home/admin/scrapy/data.csv' -s LOG_FILE='/home/admin/scrapy/scrapy_test.log'" 
return_code = os.system(command) 
print 'done'