CrawlerProcess结束后转换结果

时间:2018-04-18 03:28:21

标签: python scrapy web-crawler

我刚用scrapy完成了一个项目。 我的客户希望结果为 xlsx ,因为我没有找到导出结果的方法,我导出到 csv 然后转换xlxs(如果此代码可以改进,让我知道:)。

我的问题是当python执行csv_2_xlsx(FILE_NAME)结果文件尚不存在时。我试着加入睡眠但是没有用。

欢迎任何帮助:)

我的主文件是这样的:

# main.py
from scrapy.crawler import CrawlerProcess
from spiders import my_spider
from exporter import csv_2_xlsx

FILE_NAME = 'result.csv'

process = CrawlerProcess({
    'FEED_FORMAT': 'csv',
    'FEED_URI': FILE_NAME,
    'FEED_EXPORTERS' : {
        'csv': 'exporter.FixLineCsvItemExporter',
    }
})

process.crawl(my_spider.MySpider)

# I think python should stop until
# this process ends
process.start()

# this line is not working cause
# result.csv doest not exist yet
csv_2_xlsx(FILE_NAME)

1 个答案:

答案 0 :(得分:1)

已修改版本

我将代码重新排列为以下方式,以解决csv文件未被关闭的问题。

main.py

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings


process = CrawlerProcess(get_project_settings())

process.crawl('spider_name')
process.start()

Pipeline.py

from scrapy.exporters import CsvItemExporter
from exporter import csv_2_xlsx


FILE_NAME = 'result.csv'
class TutorialPipeline(object):
    def __init__(self):
        self.file = open(FILE_NAME, 'wb')
        self.exporter = CsvItemExporter(self.file)
        self.exporter.start_exporting()

    def close_spider(self, spider):
        self.exporter.finish_exporting()
        self.file.close()
        csv_2_xlsx(FILE_NAME)

    def process_item(self, item, spider):
        self.exporter.export_item(item)
        return item

您是否尝试将csv_2_xlsx(FILE_NAME)添加到pipeline.py文件中?在pipeline.py文件的类定义中,添加close_spider()函数并将csv_2_xlsx(FILE_NAME)放入函数中。

def close_spider(self, spider):
    csv_2_xlsx(FILE_NAME)