Scrapy设置之HTTP缓存与离线工作

Scrapy的HttpCacheMiddleware组件(默认情况下没有启用)提供了一个底层(low-level)的对HTTP请求和响应的缓存。如果启用的话(把HTTPCACHE_ENABLED设置为True),它会缓存每个请求和对应的响应。

这个组件有两个可选项:缓存策略和存储位置。

缓存策略:

  • Dummy policy(默认):这种策略不考虑服务器返回的HTTP Cache-Control指示,它会缓存所有的请求和响应。当遇到相同的请求时,它会直接从缓存中获得响应。要使用这种缓存策略,可以把HTTPCACHE_POLICY设置成scrapy.extensions.httpcache.DummyPolicy
  • RFC2616Policy:这种缓存策略会考虑服务器返回的缓存指令,大概类似于浏览器的行为。可以参考Scrapy文档。

存储位置:

  • 用本地文件系统存储(默认):可以设置HTTPCACHE_DIR指定存储的位置。要使用这种方式,需要把HTTPCACHE_STORAGE设置成scrapy.extensions.httpcache.FilesystemCacheStorage。每对请求/响应都会被存储在不同的目录里,里面有一些与此相关的文件(参考Scrapy文档)。目录的名字是由请求对应的fingerprint确定的(scrapy.utils.request.fingerprint)。
  • DBM存储:要使用这种存储方式,需要把HTTPCACHE_STORAGE设置成scrapy.extensions.httpcache.DbmCacheStorage。默认情况下使用anydbm模块,需要修改模块的时候,可以设置HTTPCACHE_DBM_MODULE选项。

来看一个例子。
运行以下代码:

$ scrapy crawl fast -s LOG_LEVEL=INFO -s CLOSESPIDER_ITEMCOUNT=5000

可能一分钟之后程序运行完毕,如果在没有网络的情况下,根本抓取不到任何东西。试一下如下代码:

$ scrapy crawl fast -s LOG_LEVEL=INFO -s CLOSESPIDER_ITEMCOUNT=5000 -s HTTPCACHE_ENABLED=1
...
INFO: Enabled downloader middlewares:...*HttpCacheMiddleware*

可以看到HttpCacheMiddleware已经被启用了,如果此时查看一下当前目录,可以发现有一个新的目录叫做.scrapy,结构如下:

$  tree    .scrapy |   head
.scrapy
└── httpcache
    └── easy
        ├── 00
        │   ├── 002054968919f13763a7292c1907caf06d5a4810
        │   │   ├── meta
        │   │   ├── pickled_meta
        │   │   ├── request_body
        │   │   ├── request_headers
        │   │   ├── response_body
...

现在重新运行上面的命令:

$  scrapy  crawl   fast    -s  LOG_LEVEL=INFO  -s  CLOSESPIDER_ITEMCOUNT=4500  -s  
HTTPCACHE_ENABLED=1

这时发现程序运行地更快了。至于为什么把Item的数目上限设置得更少了,是因为在使用CLOSESPIDER_ITEMCOUNT使程序终止的时候,在程序完全终止之前,还会发出稍多一些的请求(因为处理响应以生成Item的同时也会发出请求)。因此,为了避免这次的运行时发出比上次运行更多的请求,以至于有些请求不在缓存中,所以这次把CLOSESPIDER_ITEMCOUNT设置得较小了一些。

清理缓存的时候只需要把缓存目录删除即可:

$ rm -rf .scrapy

你可能感兴趣的:(scrapy)