Отсутствуют данные с Экспорт CSV для нескольких пауков / Scrapy / Pipeline - PullRequest
0 голосов
/ 09 ноября 2018

Я реализовал конвейер на основе некоторого примера здесь. Я пытаюсь экспортировать всю информацию для нескольких пауков (запускаемых одним файлом, а не в командной строке) в один файл CSV.

Однако, похоже, что некоторые данные (около 10%), показанные в оболочке, не записываются в CSV. Это потому, что пауки пишут одновременно?

Как я могу исправить это в моем скрипте, чтобы собрать все данные в одном CSV? Я использую CrawlerProcess для запуска пауков.

from scrapy import signals
from scrapy.contrib.exporter import CsvItemExporter


class ScrapybotPipeline(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):
    file = open('result_extract.csv', 'w+b')
    self.files[spider] = file
    self.exporter = CsvItemExporter(file)
    self.exporter.fields_to_export = ['ean', 'price', 'desc', 'company']
    self.exporter.start_exporting()

def spider_closed(self, spider):
    self.exporter.finish_exporting()
    file = self.files.pop(spider)
    file.close()

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

1 Ответ

0 голосов
/ 09 ноября 2018

Я знаю из вашего описания, что вы работаете с несколькими пауками. Просто чтобы подтвердить: вы обрабатываете их одновременно ? (в пределах тот же процесс сканирования )?

В соответствии с кодом, которым вы поделились. Вы пытаетесь сохранить один объект выходного файла для каждого паука, но пишете по одному и тому же пути. В spider_opened:

file = open('result_extract.csv', 'w+b')
self.files[spider] = file

Это считается основной причиной проблемы.

Поскольку у вас есть только один файл (как в вашей файловой системе) для записи, вы можете сделать это, открыв его только один раз. Модифицированная версия вашего кода:

class ScrapybotPipeline(object):

    def __init__(self):
        self.file = None

    @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):
        self.file = open('result_extract.csv', 'w+b')
        self.exporter = CsvItemExporter(self.file)
        self.exporter.fields_to_export = ['ean', 'price', 'desc', 'company']
        self.exporter.start_exporting()

    def spider_closed(self, spider):
        self.exporter.finish_exporting()
        self.file.close()

    def process_item(self, item, spider):
        self.exporter.export_item(item)
        return item
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...