JSON файл получает поврежден при помещении его в ZIP-архив с Python - PullRequest
0 голосов
/ 04 декабря 2018

После сканирования сайта с помощью scrapy я создаю zip-архив в рамках метода закрытия, вытягивая в него изображения.Затем я добавляю действительный файл JSON в архив.

После распаковки (на Mac OS X или Ubuntu) файл JSON будет обнаружен поврежденным.Последний элемент отсутствует.

Конец распакованного файла:

..a46.jpg"]},

Исходный файл:

a46.jpg"]}]

Код:

# create zip archive with all images inside
filename = '../zip/' + datetime.datetime.now().strftime ("%Y%m%d-%H%M") + '_' + name
imagefolder = 'full'
imagepath = '/Users/user/test_crawl/bid/images'
shutil.make_archive(
    filename, 
    'zip', 
    imagepath,
    imagefolder
) 

# add json file to zip archive
filename_zip = filename + '.zip'
zip = zipfile.ZipFile(filename_zip,'a') 
path_to_file = '/Users/user/test_crawl/bid/data/'+  
datetime.datetime.now().strftime ("%Y%m%d") + '_' + name + '.json'
zip.write(path_to_file, os.path.basename(path_to_file)) 
zip.close()

Я мог воспроизвести эту ошибку несколько раза все остальное выглядит нормально.

1 Ответ

0 голосов
/ 04 декабря 2018

Решение состоит в том, чтобы использовать scrapy jsonitemexporter вместо fead exporter, так как экспортер лент будет записывать в файл во время close_spider (), что слишком поздно.

Это делается довольно просто.

загрузите JsonItemExporter внутри файла pipelines.py

from scrapy.exporters import JsonItemExporter

Измените ваш конвейер следующим образом:

class MyPipeline(object):

    file = None

    def open_spider(self, spider):
        self.file = open('data/test.json', 'wb')
        self.exporter = JsonItemExporter(self.file)
        self.exporter.start_exporting()

    def close_spider(self, spider):
        self.exporter.finish_exporting()
        self.file.close()
        cleanup('zip_method')

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

zip_method содержит почтовый индекс, упомянутый в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...