CodeGym /课程 /Python SELF ZH /数据保存与缓存

数据保存与缓存

Python SELF ZH
第 34 级 , 课程 4
可用

1. 为什么需要缓存?

好了,小伙伴们,我们来到了网页爬取中最酷的一部分 —— 数据缓存。为啥要缓存呢?因为它就像让你的脚本“百米加速破纪录”一样!咱们来看看为啥需要缓存以及它是咋运作的。放轻松,这里面没啥绕脑子的东西。

想象一下:你爬了个网站,得到了所有需要的数据,第二天你想更新这些数据。难道你非得再来一次无限循环的请求吗?不需要!咱们可以通过缓存来避免重复的工作。

缓存的好处:

  • 速度快: 缓存好的数据获取起来比重新从服务器加载要快。就像你最爱的蛋糕放在冰箱里一样,不用再跑去蛋糕店买了,直接拿出来吃!
  • 省钱: 不仅减轻服务器的负担,也节省你自己的流量。双赢!
  • 稳定性: 缓存能应对临时的网络问题。如果网站突然挂了,你手上还是有数据的。就像有个备用降落伞。

2. 数据缓存的基础

缓存是什么?

缓存是种临时存储,可以重复利用之前获取的数据。在编程中,缓存可以避免重复请求同一批数据。想象下,缓存就是你随手可以翻阅的私人信息库。

缓存的类型:

  • 内存缓存: 很快,但断电就没了,类似于RAM的工作方式。
  • 文件缓存: 数据保存在磁盘上,更持久且可靠。

3. 在Python中实践缓存

想在Python中缓存数据?可以用requests库。不过requests本身不支持缓存。这时候requests-cache就派上用场啦,它可以让你的请求加上缓存功能,简单又方便。

安装库

Bash

pip install requests-cache

配置缓存

咱们在脚本中设置一下缓存:

Python

import requests_cache

# 设置SQLite缓存
requests_cache.install_cache('demo_cache', expire_after=180)

import requests

# 发送请求
response = requests.get('https://jsonplaceholder.typicode.com/todos/1')

# 检查数据的来源
print(f'From cache: {response.from_cache}')

# 输出数据
print(response.json())

首先,我们调用requests_cache.install_cache来设置缓存。这会新建一个SQLite数据库来存放缓存数据。参数expire_after指定了缓存数据过期的时间(单位是秒)。这里我们设置成了三分钟。

缓存的特点

当你再次运行这段代码时,注意response.from_cache的值。对于头三分钟内的后续调用,这个变量会是True

删除缓存

删除缓存非常简单:直接删掉缓存文件,或者用requests_cache.clear()方法来清空缓存里的所有记录。

4. 缓存的高级功能

有条件的缓存

有时候你可能需要更灵活的缓存逻辑。比如说,你不想缓存过期的数据,或者请求参数变了也不缓存。

这种情况下,可以在requests-cache里添加额外的参数:

Python

requests_cache.install_cache('custom_cache',
             allowable_methods=['GET', 'POST'],
             allowable_codes=[200, 404],
             ignored_parameters=['timestamp'])

在这里我们允许对GETPOST方法进行缓存,只缓存200和404状态码的响应。同时忽略参数timestamp,这样带不同时间戳的请求不会被视为不同请求。

使用Redis

如果你需要更强大的解决方案,比如支持分布式缓存,可以用redis。这是一个基于内存的缓存系统,在大数据领域很受欢迎。

操作步骤:

  1. 安装Redis和它对应的Python库:
    Bash
    
    brew install redis  # macOS 用户
    pip install redis
    
  2. 在项目中配置Redis:
    Python
    
    import redis
    import requests
    
    r = redis.Redis(host='localhost', port=6379, db=0)
    
    def get_cached_response(url):
        if r.get(url):
            return r.get(url).decode('utf-8')
        else:
            response = requests.get(url)
            r.setex(url, 3600, response.text)  # 缓存1小时
            return response.text
    
    print(get_cached_response('https://jsonplaceholder.typicode.com/todos/1'))
    

这个例子用Redis把响应数据缓存1小时。我们首先检查数据是否已经在缓存中,只有在缓存中没有数据的情况下才会发送HTTP请求。

5. 错误处理

使用缓存时,有时可能会遇到数据库损坏或者缓存数据未更新的情况。为了应对这种情况,记录日志并定期检查数据是个好习惯。

记录日志的示例代码:

Python

import logging

logging.basicConfig(level=logging.INFO)

try:
    response = get_cached_response('https://jsonplaceholder.typicode.com/todos/1')
    logging.info("数据成功从缓存中提取")
except Exception as e:
    logging.error("提取数据时出错: %s", str(e))

最后的思考

缓存不仅是个提升性能的工具,也是让你的应用更可靠、更能应对网络问题或服务器过载的好帮手。使用requests-cacheredis这样的工具可以高效地管理请求并保存数据供以后使用。成为缓存大师,不要让你的脚本被多余的请求拖慢!就像老程序员说的那句话:“缓存一次,比重复问一百次强”。

1
Опрос
解析限制绕过,  34 уровень,  4 лекция
недоступен
解析限制绕过
解析限制绕过
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION