Scraper của tôi hoạt động tốt khi tôi chạy nó từ dòng lệnh, nhưng khi tôi cố gắng chạy nó từ bên trong một kịch bản python (với phương pháp được phác thảo here sử dụng Twisted) nó không xuất ra hai tệp CSV mà nó thường làm. Tôi có một đường dẫn tạo và điền các tệp này, một trong số chúng sử dụng CsvItemExporter() và một tệp khác sử dụng writeCsvFile(). Đây là mã:Chạy scrapy từ bên trong Python script - CSV xuất khẩu không hoạt động
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
Dưới đây là cấu trúc tập tin của tôi:
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
Các scraper dường như hoạt động bình thường trong tất cả các cách khác. Đầu ra ở cuối dòng lệnh cho thấy số trang dự kiến được thu thập thông tin và con nhện dường như đã hoàn thành bình thường. Tôi không nhận được bất kỳ thông báo lỗi nào.
---- EDIT: ----
Chèn báo cáo in ấn và lỗi cú pháp vào đường ống không có tác dụng, vì vậy có vẻ như các đường ống dẫn đã được bỏ qua. Tại sao điều này có thể?
Đây là mã cho kịch bản chạy các scraper (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.')
Các tệp có thể được viết ở một nơi khác không? bạn có thể kiểm tra đường dẫn tệp đầu ra của mình hoặc sử dụng đường dẫn tệp tuyệt đối không? –
@pault. Điểm tốt. Bây giờ tôi đã thử nó bằng cách sử dụng os.path.dirname (__ file__), getcwd() và đường dẫn tệp chính xác được nhập vào. Thật không may, chúng không tạo ra bất kỳ sự khác biệt nào. – jkdune
Tôi đã thử thêm các câu lệnh in để hiển thị đầu ra getcwd() và os.path.dirname (tệp), nhưng chúng dường như không thực thi. Điều đó có nghĩa là đường ống đang bị bỏ qua? Hoặc đang chạy điều này bên trong lò phản ứng can thiệp vào tôi in? – jkdune