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.')
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? –
@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
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