2013-07-20 11 views
6

Skrobaczka działa dobrze, gdy uruchamiam ją z wiersza poleceń, ale gdy próbuję uruchomić ją z poziomu skryptu Pythona (metoda oznaczona here za pomocą Twisted) nie wysyła dwóch plików CSV, które normalnie robi. Mam potok, który tworzy i zapełnia te pliki, jeden z nich za pomocą CsvItemExporter(), a drugi za pomocą writeCsvFile(). Oto kod:Uruchamianie scrapy z poziomu skryptu Python - eksporter CSV nie działa

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 

Oto moja struktura plików:

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 

Zgarniacz wydaje się funkcjonować normalnie we wszystkich innych sposobów. Dane wyjściowe na końcu wiersza polecenia sugerują, że oczekiwana liczba stron została przeszukana, a pająk wydaje się, że zakończył normalnie. Nie otrzymuję żadnych komunikatów o błędach.

---- EDIT: ----

Wstawianie wydruku sprawozdania i błędy składniowe w rurociągu nie ma żadnego wpływu, więc wydaje się, że rurociąg jest ignorowany. Dlaczego to możliwe?

Oto kod do skryptu, który uruchamia skrobaczki (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

Czy pliki można zapisać w innym miejscu? możesz sprawdzić ścieżki plików wyjściowych lub użyć bezwzględnych ścieżek plików? –

+0

@pault. Słuszna uwaga. Próbowałem go teraz używając os.path.dirname (__ file__), getcwd() i dokładnie wpisanej ścieżki pliku. Niestety, nie zrobiły one żadnej różnicy. – jkdune

+0

Próbowałem dodać instrukcje drukowania, aby pokazać, co getcwd() i os.path.dirname (plik), ale nie wydają się wykonywać. Czy to oznacza, że ​​potok jest ignorowany? A może to działa w reaktorze przeszkadzając mi w drukowaniu? – jkdune

Odpowiedz

1

Wymiana "from scrapy.settings import Settings" z "from scrapy.utils.project import get_project_settings as Settings" naprawił problem.

Rozwiązanie zostało znalezione here. Nie podano żadnego wyjaśnienia rozwiązania.

dostarczono an example, jak uruchomić Scrapy z wnętrza skryptu w języku Python.

EDIT:

Po przeczytaniu przez postu alecxe w sposób bardziej szczegółowy, mogę teraz zobaczyć różnicę między „od scrapy.settings zaimportować ustawienia” i „z scrapy.utils.project get_project_settings importowych Settings”. Ta ostatnia pozwala ci użyć pliku ustawień twojego projektu, w przeciwieństwie do pliku ustawień defualt. Przeczytaj post alecxe (link do powyższego), aby uzyskać więcej szczegółów.

0

W moim projekcie zgłoszę kod scrapy wewnątrz innego skrypt Pythona przy użyciu 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' 
Powiązane problemy