Scrapyd: Как сохранять элементы в отдельные файлы и папки? - PullRequest
0 голосов
/ 09 мая 2020

Я разработал проект краулера с scrapy 2.1.0, который запускает 20 пауков со следующим потоком данных:

  • запись элементов в настраиваемый файл с именем json для каждого паука
  • сохранить изображения на диск c с папкой с индивидуальным именем, например / data / spider_name
  • создать zip-архив с json и изображениями в нем
  • загрузить zip-архив на удаленный FTP-сервер
  • удалить zip, json, изображения на локальном сервере

Теперь это работает с использованием scrapy crawl spider_name, но не при развертывании на scrapyd

Причина в том, что scrapyd хранит свои файлы в / tmp и большинство используемых мной операционных команд dis c, похоже, приводят к ошибкам. Например:

def open_spider(self, spider):
    self.file = open('data/'+  datetime.datetime.now().strftime ("%Y%m%d") + '_' + spider.name + '.json', 'wb')
    self.exporter = JsonItemExporter(self.file)
    self.exporter.start_exporting()

ошибка:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/scrapy/crawler.py", line 91, in crawl
    yield self.engine.open_spider(self.spider, start_requests)
FileNotFoundError: [Errno 2] No such file or directory: 'data/20200509_myspider.json'

Процесс создания образа и zip-архива выглядит примерно одинаково:

def cleanup(spider):
    name = spider.name
    # create zip archive with all images inside
    filename = datetime.datetime.now().strftime ("%Y%m%d-%H%M") + '_' + name
    imagefolder = 'full'

    script_dir = os.path.dirname(__file__) #<-- absolute dir the script is in
    rel_path = "../images/"+name
    imagepath = os.path.join(script_dir, rel_path)
    # imagepath = '/Users/andy/test_crawl/bid/images'

    try:
        shutil.make_archive(
            'zip/' + filename,  # base name
            'zip',              # format
            imagepath,          # root dir
            imagefolder         # base dir
        ) 
        # delete images
        shutil.rmtree(imagepath)
    except:
        logging.info('ZipFile creation failure')
        pass


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

    # send file to importer
    ftp_send(filename_zip, spider)

    # delete file from crawler
    os.remove('zip/' + filename_zip)

Как я могу преобразовать эту функциональность для совместимости с scrapyd ?

...