Я разработал проект краулера с 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 ?