0

如果 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

在这种特定情况下,使用限制为 128 MB 的 ramdisk/tmpfs 作为缓存磁盘,在 httpcache.FilesystemCacheStorage 上设置HTTPCACHE_EXPIRATION_SECS = 300

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'

我可能错了,但我觉得 Scrapy 的FilesystemCacheStorage可能无法很好地管理它的缓存(存储限制)(?)

使用 LevelDB 会更好吗?

4

1 回答 1

0

你说的对。缓存过期后不会删除任何内容。HTTPCACHE_EXPIRATION_SECS设置只决定是使用缓存响应还是重新下载,对于所有HTTPCACHE_STORAGE.

如果你的缓存数据非常大,你应该考虑使用DB来存储而不是本地文件系统。或者您可以扩展后端存储以添加 LoopingCall 任务以连续删除过期缓存。

为什么scrapy会保留被忽略的数据?

我认为有两点:

  • HTTPCACHE_EXPIRATION_SECS控制是否使用缓存响应或重新下载,它只保证您使用无过期缓存。不同的蜘蛛可能会设置不同的expiration_secs,删除缓存会使缓存混乱。

  • 如果要删除过期缓存,需要一个 LoopingCall 任务来不断检查过期缓存,这使得 scrapy 扩展更加复杂,这不是 scrapy 想要的。

于 2018-04-08T09:26:24.670 回答