Как лучше всего обрабатывать кэш Scrapy при ошибке "OSError: [Errno 28] Нет свободного места на устройстве"?

Какие действия следует предпринять в случае неудачи Scrapy:

OSError: [Errno 28] На устройстве не осталось места

Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/twisted/internet/defer.py", line 1386, in _inlineCallbacks
    result = g.send(result)
  File "/usr/lib/python3.6/site-packages/scrapy/core/downloader/middleware.py", line 53, in process_response
    spider=spider)
  File "/usr/lib/python3.6/site-packages/scrapy/downloadermiddlewares/httpcache.py", line 86, in process_response
    self._cache_response(spider, response, request, cachedresponse)
  File "/usr/lib/python3.6/site-packages/scrapy/downloadermiddlewares/httpcache.py", line 106, in _cache_response
    self.storage.store_response(spider, request, response)
  File "/usr/lib/python3.6/site-packages/scrapy/extensions/httpcache.py", line 317, in store_response
    f.write(to_bytes(repr(metadata)))
OSError: [Errno 28] No space left on device

В этом конкретном случае в качестве кэш-диска использовался ramdisk/tmpfs, ограниченный 128 МБ, с параметром scrapy HTTPCACHE_EXPIRATION_SECS = 300 на httpcache.FilesystemCacheStorage.

HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 300
HTTPCACHE_DIR = '/tmp/ramdisk/scrapycache' # (tmpfs on /tmp/ramdisk type tmpfs (rw,relatime,size=131072k))
HTTPCACHE_IGNORE_HTTP_CODES = ['400','401','403','404','500','504']
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

Возможно, я ошибаюсь, но у меня складывается впечатление, что ScystemSys FilesCacheStorage может не так хорошо управлять своим кешем (ограничением хранилища) (?).

Может быть, лучше использовать LevelDB?

1 ответ

Решение

Вы правы. Ничто не будет удалено после истечения срока действия кэша. HTTPCACHE_EXPIRATION_SECS настройки только решают, использовать ли ответ кэша или повторно загрузить, для всех HTTPCACHE_STORAGE,

Если данные вашего кеша очень велики, вы должны использовать БД для хранения вместо локальной файловой системы. Или вы можете расширить внутреннее хранилище, добавив задачу LoopingCall для постоянного удаления устаревшего кэша.

Почему скраперы хранят данные, которые игнорируются?

Я думаю, что есть два момента:

  • HTTPCACHE_EXPIRATION_SECS контролировать, использовать ли ответ кэша или повторно загрузить, он только гарантирует, что вы используете кэш без истечения срока действия. Разные пауки могут устанавливать разные expiration_secs, удаление кеша приведет к путанице в кеше.

  • Если вы хотите удалить просроченный кеш, потребуется LoopingCall Task, чтобы непрерывно проверять просроченный кеш, это усложняет расширение scrapy, что нежелательно для scrapy.

Другие вопросы по тегам