爬取与数据存储

ch5. 数据存储

  • 文件存储
  • JSON文件存储
  • 关系型数据库存储
  • Mysql

1. JSON文件存储

1. JSON中的对象和数组
  • *对象

​ 格式为 {key1:value1, key2:value2}. 其中键名可以为字符串, 整数, 值可以为任意类型

  • *数组

​ 格式为 ['content1', 'content2', ....], 值可以为任意类型
2. JSON的读取

  • json.loads(): 该方法需要读取对象的格式符合JSON文件格式的要求。输出结果为列表,可以对接过使用索引等操作。
  • 可以接受字符串,也可以接受文本文件。如:
import json
with open('data.json', 'r') as f:
    str = file.read()
    data = json.loads(str)
**3. JSON的输出**
* .dumps(): 该方法将json格式的对象转为字符串,若要将其输出至文件,还需要配合write()和open()方法。如:


import json
data = ...#data是符合json格式的对象
with open('data.json','w', encoding = 'utf-8') as f:
    file.write(json.dumps(data, ensure_ascii = False))
#若json中含有中文就需在open()中指定encoding='utf-8', write()中指定ensure_ascii = False

2. 关系型数据库—MySQL的存储

1. 链接到数据库及相关基本操作

  • pysql.connect(host = 'localhost', user = 'root', password = '*****', port(3306)): 成功连接后返回一个数据库对象 (令之为db),利用该数据库对象我们可以对数据库进行增添改查等操作。 参数说明
  • host,默认为localhost
  • user,登录数据库的用户名
  • password,数据库的密码
  • port,数据库端口,默认为3306
  • db.close(): 在操作完毕后需要将数据库对象关闭。
  • db.cursor(): 对数据库进行各种操作要通过cursor()方法返回的游标 _(令之为cr)_来进行。
  • cr.execute('sqlSentence') : 执行语句
  • cr.fetchone(): 取回sql中返回的结果
  • db.roolback(): 确保操作为原子操作,保持数据的一致性,即若失败则回退
  • db.commit(): 插入、更行等操作在执行完 db.execute()后还需要执行该方法才能真正是的操作生效

2. 创建表

创建表的操作关键在于sql语句的书写,以如下代码为例:

import pymqsql
db = pymysql.connect(host = 'localhost', user = 'root', password = '******', port = 3306, db = 'spider')
cr = db.cursor()
sqlSen = 'CREATE TABLE IF NOT EXISTS stuents(id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY(id))'
cr.execute(sql)
db.close()

3. 插入数据(动态)

  • 静态插入语句:用拼接字符串的方式来完成
id = '1716240306'
user = 'bob'
age = '20'
db = pysql.connect(...)
cr = db.cursor()
sqlSen = 'INSERT INTO students(id, name, age)' values(%s, %s, %s)
try:
    cr.execute(sql, (id, user, age))
    db.commit()
except:
    db.roolback()
  • 动态插入语句
data = {
    'id':'1716240306',
    'name':'xzy',
    'age':20,
    'gender':'male'
}
tableS = 'studentes'# 用变量保存字段,以便于修改、调用
keysS = ','.join(data.keys())# 用','将data中的键分隔开,以供函数调用使用
valusS = ','.join(['%s'] * len(data))# '['%s'] * 3' == '['%s', '%s', '%s']'
sqlSen = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=tableS, keys = keysS, values = valuesS)
#str.format()用于填补字符串,填补入字符串中的{},format()中填入要填补的内容,从左向右按序填入。若字串中占位符形式为{argName},则需要在参数中使用argName=value的形式来传递参数
try:
    if cr.execute(sqlSen, tuple(data.values())):  #tuple()元组返回列表,以供sql语句提供参数
        print('successful')
        db.commit()
except:
    print('failed')
    db.roolback()
db.close()
  • 不重复的更新数据
data = {
    'id':'1716240306',
    'name':'xzy',
    'age':20,
    'gender':'male'
}
tableS = 'students'
keysS = ','.join(data.keys())
valuesS = ','.join(['%s']*len(data))
#['%s']*3 == ['%s','%s','%s']
sqlSen = 'INSERT INTO {table}({keys}) VALUES({values}) ON DUPLICATE KEY UPDATE'.format(table = tableS, keys = kyesS, value = valuesS)
#'ON DUPLICATE KEY UPDATE'表示若主键存在就执行更新操作,否则执行插入操作。
updatePart = ','.join(["{key} = %s".format(key = keyS) for key in data])
#In[13]: (["{key} = %s".format(key = keysS) for key in data])
#Out[13]: ['id = %s', 'name = %s', 'age = %s', 'gender = %s']
sqlSen += updatePart
try:
    if cr.execute(sqlSen, tuple(data.values())*2):
#因为在加入更新语句后sqlSen中共有六处需要填进参数,所以需要参数处需要'*2'
        db.commit()
        print('successful')
except:
    db.rollback()
    print('failed')
db.close
  • 查询数据
sqlSen = 'SELECT * FROM students WHERE age >= 20'
try:
    cr.execute(sqlSen)
    print('Count:',cr.rowcount)
    one = cr.fetchone()
    #从sql服务取回了一条结果,随后在sql中的指针自动向后偏移一位
    print('one row: ', one)
    results = cr.fetchall()
    #results保存了sql剩余的所有结果,(有一条结果被fetchone取走)
    pritn('results:', results)
    for aRow in results:
        print(aRow)
except:
    print('error')

Original: https://www.cnblogs.com/dysonxxxxx/p/16582046.html
Author: dysonkkk
Title: 爬取与数据存储

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578854/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • c++的bind使用方法

    c++的bind使用方法 除了容器有适配器之外,其实函数也提供了适配器,适配器的特点就是将一个类型改装成为拥有子集功能的新的类型。其中函数的适配器典型的就是通过 std::bind…

    Linux 2023年6月14日
    093
  • shell编程学习

    在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。 ! 告诉系…

    Linux 2023年5月28日
    0100
  • ES查询区分大小写

    ES查询在默认的情况下是不区分大小写的,在5.0版本之后将 string类型拆分成两种新的数据类型, text用于全文搜索(模糊搜索), keyword用于关键字搜索(精确搜索)。…

    Linux 2023年6月8日
    0109
  • 基于spring security创建基本项目框架

    SpringBoot建项目步骤 建表 新建项目 (package name可以自定义,整个项目只能在该包下) 选择可能有到的依赖 (别忘了勾选SQL中的Mybatis Framew…

    Linux 2023年6月7日
    086
  • Nginx几种负载均衡方式介绍

    Nginx几种负载均衡方式介绍 前言 负载均衡就是Nginx将请求分摊到不同的服务器中,保证服务的可用性,缓解服务压力,保证服务的响应速度,即使某一个应用服务不可用,也可以保证业务…

    Linux 2023年6月6日
    0115
  • redis 常用命令

    批量删除redis key redis-cli -a xxx keys “prefix_tb_supplier:spl_id*” | xargs redis…

    Linux 2023年5月28日
    089
  • JavaScript事件处理(三)

    上机三 JavaScript事件处理 目的: 熟练掌握JavaScript事件处理机制 重点理解面向对象编程思想,并构建程序。 要求: 定义一个按钮,动态生成DIV,可以生成多个D…

    Linux 2023年6月13日
    094
  • 面向对象设计的23种设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是…

    Linux 2023年6月7日
    0101
  • layui实现多图上传,支持拖拽上传

    示例:支持多图上传,支持拖拽上传,下方有文件上传信息提示 html代码: <div class="layui-upload"> <div cl…

    Linux 2023年6月7日
    091
  • redis五种数据类型及使用场景

    一、Redis简介Redis 是一个开源的使用 C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库。它可以用作数据库、缓存和消息中间件。它支持的数据类…

    Linux 2023年5月28日
    089
  • 对比powershell,点评:《七年老运维实战中的 Shell 开发经验总结》

    前言: 《七年老运维实战中的 Shell 开发经验总结》是不错的帖子,建议shell用户搜看。 点评:《七年老运维实战中的 Shell 开发经验总结》 shell除了上述问题外,还…

    Linux 2023年6月14日
    091
  • 海思3559 FFMPEG移植

    具体参考下面这篇帖子http://bbs.ebaina.com/forum.php?mod=viewthread&tid=79863&pid=156755&…

    Linux 2023年6月13日
    096
  • VS 2010 LINK fatal error LNK1123转换到 COFF 期间失败 文件无效或损坏

    1. 解决LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 VS 2010 【LINK : fatal error LNK112…

    Linux 2023年6月13日
    082
  • 网络扫描(一)

    使用工具:Kali Linux、Metaspoliatable(作为攻击目标) 扫描的4个不同阶段 用ping验证系统是否正在运行。 用Nmap扫描目标主机的端口。 用Nmap脚本…

    Linux 2023年6月14日
    0114
  • ulimit: open files: cannot modify limit: Operation not permitted

    统管理员刚给授权了一台Linux 服务器访问权限,我在JumpServer 登录的时候,遇到下面错误: Last login: Wed Nov 10 13:29:30 2021 f…

    Linux 2023年5月27日
    0123
  • Linux快速入门(八)效率工具(SSH)

    (1)Kali(源主机),IP:10.211.55.4/24(2)Ubuntu(目标主机),IP:10.211.55.5/24 OpenSSH用于在远程系统上安全的运行 Shell…

    Linux 2023年6月6日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球