Как правильно хранить очищенные данные в объекте item и сохранять каждый набор в 1 CSV-файл? - PullRequest
0 голосов
/ 22 апреля 2019

Итак, мой маленький паук отлично работает.Я получаю все свои данные, как ожидалось.Я воспользовался настройкой файла items.py для захвата 7 нужных нам данных.И я могу записать эти данные в файлы. НО проблема, с которой я столкнулся сейчас, заключается в том, что мне нужно записать данные в 1 выходной файл в том порядке, в котором у нас есть настройка items.py.Не могу понять, как создать файл, если он не существует (sitename и date, чтобы сделать его уникальным именем файла)

это то, что у меня есть в настоящее время, но это создает 1 файл для каждой страницы / URL, которыйя хочу объединить все это в 1 файл для каждого сайта, который мы очищаем.

Мне не нравится способ форматирования данных itmDetails2, если только это не единственный способ, но я решил, что детс []мой список items.py, в котором я мог бы просто сохранить каждый набор в нем, а затем записать dets [] в CSV.

Может ли кто-нибудь указать на хороший пример выполнения того, что я пытаюсь сделать?Я нашел шпаргалку Python / Web Scraping и попробовал примеры для сохранения данных, но это не сработало

https://blog.hartleybrody.com/web-scraping-cheat-sheet/

            itmDetails2 = dets['sku'] +","+ dets['description']+","+ dets['price']+","+ dets['brand']+","+ dets['compurl']+","+ dets['reviewcount']+","+ dets['reviewrating']

            filename = 'dsg-%s.txt' % dets['description']

            with open(filename, 'w') as f:
                for its in itmDetails2:
                    f.write(str(its))

Это мой файл items.py, так как я собираю всю или большую часть этой даты в цикле утилизацииКак я могу записать каждый набор в CSV в виде строки с разделителями-запятыми?

import scrapy

class Dsg2Item(scrapy.Item):
description = scrapy.Field()
sku = scrapy.Field()
price = scrapy.Field()
brand = scrapy.Field()
compurl = scrapy.Field()
reviewcount = scrapy.Field()
reviewrating = scrapy.Field()

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Вы можете использовать csvwriter или использовать режим добавления при записи файла.есть также tinydb для локального хранения json

0 голосов
/ 22 апреля 2019

Проблема в том, что вы используете аргумент w при открытии файла. Это приведет к тому, что файл будет обрезаться до нуля каждый раз (содержимое удаляется). В Python атрибуты такие же, как у стандартной библиотечной функции C fopen () .

w Сокращение до нулевой длины или создание текстового файла для записи. Поток располагается в начале файла.

Вместо этого следует использовать a+, который откроет файл и добавит содержимое в конец, а не обрезает существующее содержимое:

a+ Открыт для чтения и письма. Файл создается, если это не так существовать. Поток располагается в конце файла. Последовавшие Квант пишет в файл всегда будет в то время текущим Конец файла, независимо от того, какой fseek (3) или что-то подобное.

Пример:

itmDetails2 = dets['sku'] +","+ dets['description']+","+ dets['price']+","+ dets['brand']+","+ dets['compurl']+","+ dets['reviewcount']+","+ dets['reviewrating']

filename = 'dsg-%s.txt' % dets['description']

localLog = open(filename,"a+")
localLog.write(itmDetails2+"\r\n")
localLog.close()

Далее я отмечу, что причина, по которой он каждый раз создает новый файл, в том, что вы создаете свое имя файла на основе описания. Просто не включайте описание, если вы хотите одно имя файла.

Пример:

itmDetails2 = dets['sku'] +","+ dets['description']+","+ dets['price']+","+ dets['brand']+","+ dets['compurl']+","+ dets['reviewcount']+","+ dets['reviewrating']

localLog = open("dsg-all.txt","a+")
localLog.write(itmDetails2+"\r\n")
localLog.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...