在做爬虫的时候,我们往往可能这些情况:
-
网站比较复杂,会碰到很多重复请求。
-
有时候爬虫意外中断了,但我们没有保存爬取状态,再次运行就需要重新爬取。
还有诸如此类的问题。
那怎么解决这些重复爬取的问题呢?大家很可能都想到了“缓存”,也就是说,爬取过一遍就直接跳过爬取。
那一般怎么做呢?
比如我写一个逻辑,把已经爬取过的 URL 保存到文件或者数据库里面,每次爬取之前检查一下是不是在列表或数据库里面就好了。
是的,这个思路没问题,但有没有想过这些问题:
-
写入到文件或者数据库可能是永久性的,如果我想控制缓存的有效时间,那就还得有个过期时间控制。
-
这个缓存根据什么来判断?如果仅仅是 URL 本身够吗?还有 Request Method、Request Headers 呢,如果它们不一样了,那还要不要用缓存?
-
如果我们有好多项目,难道都没有一个通用的解决方案吗?
的确是些问题,实现起来确实要考虑很多问题。
不过不用担心,今天给大家介绍一个神器,可以帮助我们通通解决如上的问题。
介绍
它就是 requests-cache,是 requests 库的一个扩展包,利用它我们可以非常方便地实现请求的缓存,直接得到对应的爬取结果。
-
GitHub:https://github.com/reclosedev/requests-cache
-
PyPi:https://pypi.org/project/requests-cache/
-
官方文档:https://requests-cache.readthedocs.io/en/stable/index.html
下面我们来介绍下它的使用。
安装
安装非常简单,使用 pip3 即可:
pip3 install requests-cache
安装完毕之后我们来了解下它的基本用法。
基本用法
下面我们首先来看一个基础实例:
import requests
import time
start = time.time()
session = requests.Session()
for i in range(10):
session.get('http://httpbin.org/delay/1')
print(f'Finished {i + 1} requests')
end = time.time()
print('Cost time', end - start)
这里我们请求了一个网站,是 http://httpbin.org/delay/1,这个网站模拟了一秒延迟,也就是请求之后它会在 1 秒之后才会返回响应。
这里请求了 10 次,那就至少得需要 10 秒才能完全运行完毕。
运行结果如下:
Finished 1 requests
Finished 2 requests
Finished 3 requests
Finished 4 requests
Finished 5 requests
Finished 6 requests
Finished 7 requests
Finished 8 requests
Finished 9 requests
Finished 10 requests
Cost time 13.17966604232788
可以看到,这里一共用了13 秒。
那如果我们用上 requests-cache 呢?结果会怎样?
代码改写如下&#