Python爬虫自动化从入门到精通第9天(爬虫数据的存储)

news2024/11/15 18:25:56

爬虫数据的存储

  • 数据存储概述
  • MongDB数据库的概念
  • MongDB的安装
  • 使用PyMongo库存储到数据库

数据存储概述

通常,从网页爬取到的数据需要进行分析、处理或格式化,然后进行持久化存储,以备后续使用。数据存储主要有以下两种方式:

1)文件存储
文件存储时将爬虫数据以文件的形式存储到本地,对于这种中小规模的爬虫而言,可以将爬虫结果汇合到一个文件进行持久化存储。Python中的文件操作相当方便,既能将爬虫数据以二进制形式保存,又能处理成字符串后以文件形式保存,只需要改动打开文件的模式,就能以不同的形式保存数据。
2)数据库存储
对于爬取的数据种类丰富、数量庞大的大规模爬虫来说,把数据存储成一堆零散的文件就不太合适了。此时可以将这些爬虫结果存储到我们的数据库当中,不仅方便存储,也方便进一步整理。

Python中常见的数据库有以下两种:

  • MySQL:一种开源的关系型数据库,使用最常用的数据库管理语言(SQL)进行数据库管理,它会将数据保存到不同的表中,不仅速度快,而且灵活性高。
  • MongoDB:一个基于分布式文件存储的数据库,时当前NoSQL(非关系型数据库)中比较热门的一种,他面向集合存储,易存储对象类型的数据,具有高性能、易部署、易使用等特点。

MongDB数据库的概念

MongDB是一款由C++语言编写的,基于分布式文件存储的NoSQL数据库,具有免费操作简单、面向文档存储特点。为web应用提供可扩展的高性能数据存储解决方案。

MongoDB数据库主要的功能特征如下:

  • 模式自由:可以把不同结构的文档存储在同一个数据库当中
  • 面向集合的存储:适合存储JSON文件风格的形式
  • 完整的索引支持:对任何属性可索引
  • 复制和高可用性:支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制,复制的主要目的是提供冗余及自动故障转移
  • 自动分片:支持云级别的伸缩性,自动分片功能支持水平的数据库集群,可动态地添加额外地机器
  • 丰富的查询:支持丰富的查询表达方式,查询指令使用JSON形式的标记,可以轻易查询文档中内嵌的对象及数组
  • 快速就地更新:查询优化器会分析查询表达式,并生成一个高效地查询计划
  • 高效地传统存储方式:支持二进制数据及大型对象

MongDB的安装

MongDB的下载

在这里插入图片描述

具体的安装过程比较简单,这里就不细讲了。

使用PyMongo库存储到数据库

PyMong是用于MongDB的开发工具,是Python操作MongoDB数据库的方式,由于PyMongo是第三方库,所以需要安装之后才能在Python中使用,在window环境中可直接使用pip install pymongo进行安装。

PyMongo库中主要提供了如下类与MongoDB数据库进行交互:

  1. MongoClient类:用于与MongoDB服务器建立连接
  2. DataBase类:表示MongoDB中的数据库
  3. Collection类:表示MongoDB中的集合
  4. Cursor类:表示查询方法返回的结果,用于对多行数据进行遍历

PyMongo库的基本使用流程如下:

1)创建一个MongoClient类的对象,与MongoDB服务器建立连接
2)通过MongoClient对象访问数据库(DataBase对象)
3)使用上个步骤的数据库创建一个集合 (Collection对象)
4)调用集合中提供的方法在集合中插入、删除、修改和查询文档

  • 创建连接
    通过MongoClient类的构造方法进行创建。
pymongo.mongo_client.MongoClient(host='localhost',port=27017,document_class=dict,tz_aware=False,connect=True,**kwargs)

其中
host:表示主机名或IP地址,默认为主机(localhost)
port:表示连接的端口号,默认27017
document_class:从此客户端查询,返回的文档默认使用此类
tz_aware:如果为True,则此MongoClient作为文档中的返回的datetime示例,将会被时区所识别
connect:默认为True,表示立即开始在后台连接到MongoDB,否则连接到第一个操作

from pymongo import *

# 这时没有传入任何参数host和port都是默认的值
client = MongoClient()
  • 访问数据库
    只要已经建立了与Mongo服务器的连接,就可以直接访问数据库中的内容了,他的访问方式比较简单。
    可以当作属性进行访问:db = client.pymongo_test
    也可以使用字典的形式访问:db = client["pymongo_test"]

如果指定的数据库已经存在,就直接访问这个数据库;如果不存在,就会自动创建一个数据库

  • 创建集合
    访问或创建db数据库中的student集合,通过s = db.student

  • 插入文档
    insert_one():插入一条文档对象
    insert_many():插入列表形式的多条文档对象

代码如下:

from pymongo import *

# 创建连接
client = MongoClient()

# 创建数据库或访问
db = client.pymongo_test

# 创建student集合
s = db.student

# 向集合中插入一条文档
result1 = s.insert_one({'name':'lisi','sex':'nan'})

# 向集合中插入多条文档,通过列表的形式
result2 = s.insert_many([{'name':'lisi','sex':'nan'},{'age':12}])

print('result1的结果为:',result1)
print('result2的结果为:',result2)

输出结果为:

在这里插入图片描述

  • 查询文档
    find_one():查找一条文档对象
    find_many():查找多条文档对象
    find():查找所有文档对象

代码如下:

from pymongo import *

# 创建连接
client = MongoClient()

# 创建数据库或访问
db = client.pymongo_test

# 创建student集合
s = db.student

# 向集合中插入一条文档
result1 = s.insert_one({'name':'lisi','sex':'nan'})

# 向集合中插入多条文档,通过列表的形式
result2 = s.insert_many([{'name':'lisi','sex':'nan'},{'age':12}])

print('result1的结果为:',result1)
print('result2的结果为:',result2)

# 查询所有文档对象
result3 = s.find()

# 对返回的结果进行取出
for column in result3:
    print('取出结果为:',column)



输出结果为:

在这里插入图片描述

  • 更新文档
    update_one():更新一条文档对象
    update_many():更新多条文档对象

代码如下:

from pymongo import *

# 创建连接
client = MongoClient()

# 创建数据库或访问
db = client.pymongo_test

# 创建student集合
s = db.student

# 向集合中插入一条文档
result1 = s.insert_one({'name':'lisi','sex':'nan'})

# 向集合中插入多条文档,通过列表的形式
result2 = s.insert_many([{'name':'lisi','sex':'nan'},{'age':12}])

print('result1的结果为:',result1)
print('result2的结果为:',result2)

# 查询所有文档对象
result3 = s.find()

# 对跟新前返回的结果进行取出
for column1 in result3:
    print('更新前取出结果为:',column1)

# 更新一条数据,多条数据一样的原理,这里就不过多的阐述了
s.update_one({'age':12},{'$set':{'age':21}})

# 查询更新后的所有文档对象
result4 = s.find()

# 对更新后的数据进行取出
for column2 in result4:
    print('更新后取出结果为:',column2)

输出结果为:

在这里插入图片描述

  • 删除文档
    delete_one():删除一条文档对象
    delete_many():删除所有记录

直接就s.delete_one()这里就不演示代码了,可以自己去尝试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431593.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

启动kafka报错ERROR Fatal error during KafkaServer startup. Prepare to shutdown

一、错误 报的错: ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) kafka.common.InconsistentBrokerIdException: Configured broker.id 0 doesn’t match stored broker.id Some(1) in meta.properties. If you m…

跟ChatGPT聊天、需求润色优化,禅道OpenAI 插件发布

禅道插件上新了,OpenAI 禅道集成,可提供神奇海螺聊天、需求润色功能。 神奇海螺 “章鱼哥,你为什么不问问神奇海螺呢?”——海绵宝宝 那么,就让我们问一问神奇 海螺吧!禅道上线神奇海螺功能,…

【C++】优先级队列,反向迭代器

文章目录 priority_queue的介绍和使用priority_queue的使用 反向迭代器 priority_queue的介绍和使用 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素&a…

数据分析之Pandas 基础入门

一、初始Pandas pandas 是数据分析三大件之一,是Python的核心分析库,它提供了快捷、灵活、明确的数据结构,它能够简单、直观、快速的处理各种类型的数据结构。 pandas 支持的数据结构如下: SQL 或Excel 类似的数据有序或无序的…

后端程序员必须学会的编辑器vim

vim编辑器使用小结 1. vim简介 Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性。VIM是自由软件。Vim普遍被推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来自Emacs的不同变体。1999 年Emacs被选为Lin…

MyBatis(十一)、MyBatis查询语句专题

准备工作: 模块名:mybatis-007-select 打包方式:jar 引入依赖:mysql驱动依赖、mybatis依赖、logback依赖、junit依赖。 引入配置文件:jdbc.properties、mybatis-config.xml、logback.xml 创建pojo类:Car 创…

SQL sever数据库----基础增删改查操作与where条件限制

where条件限制方法 在SQL sever中使用where语句,可以对各种操作添加限制条件 基础格式为 ———————— where 逻辑表达式 例如限制条件的查询 select 范围 from 表名 where 逻辑表达式 逻辑表达式就是一个判断 如 a > 5 、a6>9、a>5 and b>5 各种…

k8s部署流水账

久仰大名k8s,业余选手一直望而却步。最近终于初步炮制成功。知道了大概的流程。本篇为部署备忘录。 经过的大环节有:修改树莓派/boot/cmdline.txt甚至/cmd/config.txt里面的集群相关设置,把cgroup驱动enable好。swap关掉。这些都是所有集群内…

比较几种热门Hybrid App前端框架

作为一种既能够在原生应用程序环境中运行,也能够在 Web 浏览器中运行的应用程序,Hybrid App 主要使用 Web 技术进行开发,如 HTML、CSS 和JavaScript,并使用一个中间层将其封装在原生应用程序中。随着技术的持续推进,Hy…

3.3栈和队列的应用

3.3.1括号匹配问题 IDE可视化的编程环境 作为一名程序开发人员,不管你使用哪门语言开发都有很多可以选择的集成开发环境IDE(Integrated Development Environment),IDE是提供程序开发环境的应用程序,一般包括代码编辑器…

程序员挣够了钱,到中年失业真的很可怕吗?

借用最近很火的一张图,看看没有工作,你手里的存款够用几年(按每年年化3.5%,利息继续放入理财计算): 如果每年花销在10万左右(折合每个月8333元,应该是比较富足的)&#x…

字节跳动高频 “ 120道 ” 软件测试面试题解析

1、web测试和APP测试的区别? web测试和APP测试都离不开测试的基础知识和测试原理。 不同点是:web 测试更多的是考虑自身功能和浏览器兼容,app 测试要考虑手机本身固有的属性,所以 app 测试还需要注意以下几点: 中断…

FreeRTOS 事件组

实现功能,当任务A,B完成后执行串口任务。 不同任务用不同的位表示 configUSE_16_BIT_TICKS1,bitx(0~7); configUSE_16_BIT_TICKS设置为0 ,bitx(0~23); //串口任务的头文件 #ifndef __TRANSMIT_H #define __TRANSMIT_H#include…

nVisual创建机柜流程

一、制作机柜 1.先在绘图软件中把机柜画出来 2.把机柜导出一张SVG格式的图片 二、创建机柜 1.打开nVisual右上角点击管理选择模型库 2.选择设备点击新增, 依次录入机柜品牌、型号、宽高深等基础数据, 再上传相应的前视图(在系统里展示…

自学python有推荐的么

大学生自学那必然是首推B站大学哇能称之为大学不是没有道理的,看看各个领域的学习分享都是非常多的,关键是看着弹幕就感觉像是在和一帮志同道合的小伙伴一起学习,自学的道路也不再孤单了,遇见不会的没准还能在弹幕和评论区找到答案…

TensorFlow详解3举个cnn卷积栗子

一、实现简单的cnn卷积神经网络 实现简单的cnn卷积神经网络(用到的是MNIST手写数字的数据库yann.lecun.com/exdb/mnist) 用到激活函数: 二、步骤 输入端是28281这样的一张图片,就是一张黑白的图片(假如他是一张彩色…

Cat入门学习笔记整理

Cat入门学习笔记整理链路调用追踪介绍链路调用监控实现过程简析常见的链路追踪框架CAT报表介绍Transaction报表Event报表Problem报表Heartbeat报表Business报表Cat实战docker安装客户端集成API介绍Transaction扩展APIEventMetricCAT监控界面介绍DashBoardTransactionEventProbl…

C++ 构造函数与析构函数

1.构造函数的引出 一个实实在在的对象,应该有合法的属性,而不是在对象出来之后,再去设置属性,要实现这个过程,必须在对象出来的这一时刻初始化合法的值,而且不能由程序员调用,要给属性合法的值&…

熟悉requests用法,实现简单网站爬虫

本文模拟的是前后端分离项目,使用账号密码登录获取到token,拿着token加载用户信息,加载分页列表数据并存储文件。 本文用到的知识点: 1、urllib.parse URL解析; 2、session用法,保存所有请求在一个会话中&a…

muduo源码剖析--Buffer

Buffer类 Buffer类是自定义处理数据输入缓冲的类&#xff0c;底层是vector< char >&#xff0c;通过readIdx和writeIdx将缓冲区分为3个部分&#xff0c;第一部分是预留的8字节已经读出的缓冲区字节数、第二部分是还未读出的部分、第三部分是可写的部分。 Buffer类的设计…