Python与Amazon DynamoDB:构建高效爬虫数据存储解决方案

欢迎访问个人博客地址https://blog.jiumoz.top/archives/pythonyu-amazon-dynamodb-gou-jian-gao-xiao-pa-chong-shu-ju-cun-chu-jie-jue-fang-an

1. 引言

1.1. 爬虫与NoSQL

Python爬虫是一种通过模拟浏览器行为,从互联网上自动抓取数据的工具。它利用 Python 的多种网络请求库(如 requestsurllib 等)和 HTML 解析工具(如 BeautifulSouplxmlScrapy 等)对网页内容进行访问和解析,将所需信息提取为结构化数据。

NoSQL(Not Only SQL)是一类不同于传统关系型数据库(RDBMS)管理系统的数据存储技术的统称。它主要的特点是具有灵活的架构、高性能和易扩展性;非常适合处理大规模的非结构化或半结构化的数据。

通俗解释:NoSQL 和 MySQL 的区别

如果把数据库比作仓库,MySQL 就像一个整齐划一的大型货架,每件商品(数据)都必须分类放在固定的格子里,存进去之前要先规划好架子怎么摆、格子多大、每个格子装什么。如果商品不符合规则,可能还要重新整理才能存进去。

而 NoSQL 就像一个杂物间,虽然没有固定的架子和分类,但只要有地方,就能随时放东西,而且你可以把东西装在各种不同大小的盒子里,甚至直接堆起来。这让它特别适合存储种类繁多、形状不一的东西,比如图片、文字、视频等,或者需要快速放进去、快速取出来的情况。

简单说,区别是:

  • **MySQL(传统关系型数据库):**有严格的规则,需要提前设计好表格(类似架子),适合整理整齐的结构化数据,比如用户表、订单表。
  • **NoSQL(非关系型数据库):**规则很灵活,没有固定表格,适合存储多样化、不固定的数据,比如社交网络的动态、实时传感器数据等。

如果你的数据像“表格”一样整齐有序,用 MySQL;如果你的数据更像“杂货”或者需要快速扩展,用 NoSQL。

Python爬虫为什么使用 NoSQL
爬取的数据往往结构不一致。例如,不同网页中的字段可能有所不同。NoSQL 数据库支持 JSON 或类似的文档格式存储数据(如 MongoDB),使得存储非结构化和半结构化数据变得简单,无需频繁更改数据库的模式。另外就是 NoSQL 数据库设计为分布式系统,支持大规模数据的高效读写操作。某些爬虫任务可能会产生海量数据。NoSQL 数据库通常支持水平扩展(Scale-out),通过增加节点扩展存储和处理能力,而传统关系型数据库的扩展则较为复杂。
当然,不同的业务场景也要选择不同类型的 NoSQL 数据库,例如:

  • MongoDB:适合存储和查询 JSON 文档数据。
  • Redis:适合缓存和实时数据处理。
  • Elasticsearch:适合全文检索和分析爬取的数据。

1.2. Amazon DynamoDB简介

Amazon DynamoDB亚马逊云科技提供的一种完全托管型的 NoSQL 数据库服务,属于 键值存储和文档数据库 类型的组合。它被设计用于高吞吐量和低延迟的应用场景,支持水平扩展,是 NoSQL 数据库的一个典型实现。

【官方地址】什么是 Amazon DynamoDB?

  • 怎么理解键值存储和文档数据库

    **键值存储(Key-Value Store)**可以理解为一个“超级词典”或者“超级储物柜”,通过“键”(Key)快速找到对应的“值”(Value)。

    Key:是唯一的标识,类似于储物柜的编号。

    Value:是与 Key 关联的数据,类型可以是字符串、数字、JSON 对象,甚至是图片等文件。

    键值存储中没有复杂的结构,也没有表格的概念,所有数据以“键值对”的形式存储。

    假设要存储一个用户的名字和年龄:

    • 键值存储的方式:

      Key: "user:001:name", Value: "张三"
      Key: "user:001:age", Value: 25
      

      只要知道键(比如 "user:001:name"),就能直接获取对应的值(“张三”)。

    • 传统数据库的方式:
      必须用表格形式存储:

      | 用户ID | 姓名     | 年龄 |
      |--------|----------|------|
      | 001    | 张三     | 25   |
      

      然后写 SQL 查询语句 SELECT 姓名 FROM 用户表 WHERE 用户ID='001' 才能找到值。


    如果把传统数据库比作“Excel 表格”,文档数据库就像一个“文件夹”,里面装的是类似 Word 文档的结构化内容,比如一个产品的详细信息、一个用户的个人资料等。这些内容以 JSON 或 XML 格式存储,就像一篇篇灵活的电子文档。

    • 传统数据库(比如 MySQL):
      数据是“表格状”的,每一行是一个记录,每一列代表固定的字段(比如用户的姓名、邮箱)。需要提前设计表格格式(叫做“表结构”)。比如一个用户表,需要先定义一个表格(比如叫 users),然后每条数据都必须按照同样的字段存储:

      | 用户ID | 姓名     | 年龄 | 兴趣爱好   |
      |--------|---------|-----|-----------|
      | 001    | 张三     | 25  | 看书, 旅行 |
      | 002    | 李四     | 30  | 跑步      |
      

      如果有个用户没有“兴趣爱好”信息,可能要留空(NULL)。

    • 文档数据库(比如 MongoDB、DynamoDB):
      数据像“电子文档”一样,存储在类似 JSON 的结构里。每条记录可以有不同的字段和格式,不需要提前设计表格,灵活性更高。同样的用户信息,每条记录是一个独立的“文档”,没有固定格式。比如:

      {
              
        "用户ID": "001",
        "姓名": "张三",
        "年龄": 25,
        "兴趣爱好": ["看书", "旅行"]
      }
      

      或者:

      {
              
        "用户ID": "002",
        "姓名": "李四",
        "年龄": 30
      }
      

      不需要存空字段,数据结构可以随用随改。

      文档数据库特别适合:数据结构经常变化(比如新增字段)的场景、数据内容很复杂,比如电商平台的商品详情(每个商品可能有不同的规格)、用 JSON 直接和前端对接的场景,比如 REST API 的数据输出。

      文档数据库是用来存储像电子文档一样的结构化数据,以 JSON 等形式保存,提供更大的灵活性。

  • 再说说 Amazon DynamoDB 的特点

    作为一项完全托管的数据库服务,DynamoDB 可以处理管理数据库的无差别繁重工作,使您可以专注于为客户创造更多价值。它负责设置、配置、维护、高可用性、硬件配置、安全、备份、监控等。这将确保在创建 DynamoDB 表时,它可以立即为生产工作负载做好准备。DynamoDB 无需升级或停机即可不断提高其可用性、可靠性、性能、安全性和功能。

    DynamoDB 专为提高关系数据库的性能和可扩展性而设计,在任何规模下都能提供个位数的毫秒性能。为了实现这种规模和性能,DynamoDB 针对高性能工作负载进行了优化,可提供推动高效使用数据库的 API。它省略了在规模上效率低下且性能不佳的功能,例如 JOIN 操作。无论您有 100 个还是 1 亿用户,DynamoDB 都能为您的应用程序提供稳定的个位数毫秒性能1

  • 免费试用

    亚马逊云科技是提供了很多的免费云服务的,之前给大家分享过云服务器、S3以及Lambda 无服务器架构服务,今天要分享的就是 Amazon DynamoDB,它也提供了免费服务,免费试用的套餐详情如下,看不懂没关系,接着往下看:

    image-20241124193754334

    详细的定价参考官网说明:Amazon DynamoDB 定价

    1. 25GB 的存储

    DynamoDB 提供最多 25GB 的免费数据存储空间。数据存储是指 DynamoDB 用来存储你的表中数据的容量大小。每个表的键、属性、索引等都算在存储容量中。

    2. 25 个预置写入容量单位 (WCU)

    写入容量单位 (Write Capacity Unit, WCU) 表示 DynamoDB 处理写入请求的能力,定义为 每秒可以处理 1KB 的写入数据量。如果你的写入数据小于或等于 1KB,1 WCU 足够每秒支持一次写操作。如果数据大小超过 1KB,写操作需要更多 WCU。例如写入 2KB 的数据需要 2 个 WCU、写入 3KB 的数据需要 3 个 WCU。25 WCU 意味着在免费套餐下,DynamoDB 表每秒可以处理 最多 25 次 1KB 大小的写操作

    3. 25 个预置读取容量单位 (RCU)

    读取容量单位 (Read Capacity Unit, RCU) 表示 DynamoDB 处理读取请求的能力,定义为 每秒可以处理一次 4KB 的强一致性读取两次 4KB 的最终一致性读取

    • **强一致性读取 (Strongly Consistent Reads):**每次读取 DynamoDB 都保证返回最新写入的数据。

    • **最终一致性读取 (Eventually Consistent Reads):**数据可能会有轻微的延迟,适合不需要实时最新数据的应用。

    如果你的读取数据小于或等于 4KB,1 RCU 足够支持一次强一致性读取或两次最终一致性读取。如果数据超过 4KB,读取需要更多的 RCU。例如读取 8KB 的数据需要 2 个 RCU(强一致性)、读取 8KB 的数据需要 1 个 RCU(最终一致性)。如果你每秒读取 10 次,每次数据大小为 2KB(小于 4KB),25 RCU 够用。

    • 如果你每秒读取 5 次,每次 8KB,25 RCU 也够用,但强一致性读取会消耗掉 10 个 RCU(5 次 * 2 RCU/次)。

    让我们逐一解读这些免费套餐中的内容:

    4. 250 万个来自 DynamoDB Streams 的流读取请求

    DynamoDB Streams 是一种功能,它记录 DynamoDB 表中数据的更改,比如新增、修改或删除的记录。这些更改会以事件的形式流入一个队列,你可以读取这些事件来实现诸如:

    • 数据同步: 将 DynamoDB 的数据同步到其他服务(如 Elasticsearch、Redshift)。
    • 触发器: 自动响应数据变化,例如触发 Amazon Lambda 函数。

    可以把 DynamoDB Streams 想象成一个数据更新的“通知中心”。当表中的数据发生变化时,你可以通过读取流来获取这些变化的详细信息。免费套餐允许每月最多 250 万次读取这些流的请求

    5. 1GB 的数据传输(前 12 个月为 15GB)

    数据传输是指 DynamoDB 与客户端或其他 Amazon 服务之间的数据移动。例如:客户端从 DynamoDB 读取数据。数据从 DynamoDB 流传输到其他服务(如 S3)。免费套餐允许每月传输 1GB 的数据,而新用户在前 12 个月可以享受 15GB 的数据传输

    总之如果你只是为了学习 DynamoDB 的特性和操作或者开发小型应用程序,比如一个简单的用户管理系统、留言板或日志记录服务。肯定是够用的;

    更多的免费云服务可以进入亚马逊云科技官网查看:

    image-20241124193930861

2. Python对接Amazon DynamoDB

2.2. 创建DynamoDB表

前提是你有一个亚马逊云科技的账号,注册教程可以参考之前写的用亚马逊云科技云服务器搭建个人博客的文章;

2.2.1. 使用控制台创建

进入控制台,选择对应服务

image-20241124205337510

创建表

image-20241124205514919

设定相应的值就可以了;

image-20241124210426395

2.2.2. 使用 Python 创建

  • 创建访问密钥

首先要在控制台创建访问密钥,进入控制台后选择IAM服务;进入后点击我的安全凭证;

image-20241124212501736

然后点击创建访问密钥;

image-20241124212613195

紧接着选择确认创建一个根访问的密钥;

image-20241124212631994

创建成功;

image-20241124212703285

  • 创建表

首页需要安装官方提供的 Python SDK,用于操作 DynamoDB

pip install boto3
# 清华大学的镜像源
pip install boto3 -i https://pypi.tuna.tsinghua.edu.cn/simple

创建表测试,直接放代码:

import boto3

# 初始化 DynamoDB 客户端
dynamodb = boto3.resource(
    'dynamodb',
    region_name='us-east-1',
    aws_access_key_id='你的访问密钥ID',
    aws_secret_access_key='你的秘密访问密钥'
)

# 创建 DynamoDB 表
table_name = 'Users'
table = dynamodb.create_table(
    TableName=table_name,
    KeySchema=[
        {
   'AttributeName&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九陌斋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值