爬取与数据存储

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)

大家都在看

  • VSCODE 配置远程调试环境

    以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」 https://mp.weixin.qq.com/s/f1KZOlL92ojes-r2l9rlCw 我的…

    Linux 2023年6月6日
    0133
  • 代码规范浅谈

    代码规范这东西网上很容易百度到一堆,除了天下文章一大抄的问题,另外,多数只给了结果,原因没有充分说明,或者非常的纠结于大写小写,一个函数可以写几行的细节。感觉有点容易让新人误入歧途…

    Linux 2023年6月13日
    085
  • Paxos 协议简单介绍

    一、简介 Paxos 协议是少数在工程实践中证实的强一致性、高可用的去中心化分布式协议。Google 的很多大型分布式系统都采用了 Paxos 算法来解决分布式一致性问题,如 Ch…

    Linux 2023年6月16日
    0131
  • Pytorch的类(nn.Module的子类)中的forward函数

    使用 直接通过类的实例对象就可以向类中的forward函数进行参数的传递(当然也可以通过调用forward函数进行传参) import torch.nn as nn class M…

    Linux 2023年6月7日
    0104
  • linux_arch

    由于以前新手开始接触的是ubuntu,然后通过ubuntu又开始了解centos,这俩系统基本是稳定版本可以用作服务器,但是centos的还是居多,一来比较接近redhat;但是这…

    Linux 2023年6月14日
    075
  • 搭建Nginx正向代理服务

    需求背景: 前段时间公司因为业务需求需要部署一个正向代理,需要内网服务通过正向代理访问到外网移动端厂商域名通道等效果,之前一直用nginx做四层或者七层的反向代理,正向代理还是第一…

    Linux 2023年6月8日
    088
  • Beyond Compare文件对比神器,快来给文件找茬!

    在工作中很多场景下都需要比对两个文件之间的差异,你是否还傻傻的同时打开两个文件,用眼睛一行一行的核对? 赶紧来试试这个神器Beyond Compare!!它可以快速的帮你找出两个文…

    Linux 2023年6月7日
    093
  • Linux三剑客命令—sed

    一、概念说明 官方概念说明: stream editor for filtering and transforming text字符流过滤器编辑和文本字符流转换工具 [En] Ch…

    Linux 2023年5月27日
    0110
  • Redis主从配置总结

    grep ‘^[a-Z]’ /usr/local/redis/conf/redis.conf bind 127.0.0.1 192.168.27.115 protected-mod…

    Linux 2023年5月28日
    084
  • 视图层

    目录 虚拟环境 django路由层版本区别 视图函数返回值 JsonResponse对象 上传文件 request方法 FBV与CBV CBV源剖析 模板语法传值 内容 虚拟环境 …

    Linux 2023年6月7日
    068
  • 回溯法:算法思路以及相关流程图的绘制

    参考建模原文2020国赛B题参考文章1 回溯法介绍 深度优先搜索(缩写DFS):对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标…

    Linux 2023年6月14日
    077
  • 每天一个 HTTP 状态码 100

    100 Continue 指示客户端应该继续当前请求;如果请求已经完成… 100 Continue 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分;指示客户…

    Linux 2023年6月7日
    085
  • Python的偏函数(Partial Function Application)

    这个概念说实话以前听过,但没深究过,也没用到过…但是被人问到了,就查来记录一下。 查下资料,发现这个东西说白了就是:部分参数有默认值的函数,Orz。再回过头来看他的英文…

    Linux 2023年6月8日
    084
  • Java 注解及其底层原理

    什么是注解? 注解的分类 Java自带的标准注解 元注解 @Retention @Documented @Target @Inherited @Repeatable 自定义注解 自…

    Linux 2023年6月6日
    0116
  • cmake 入门笔记

    1. cmake 是什么? 这些年大型 C/C++ 工程都纷纷转到了 cmake 环境下,那么这个工具到底有什么魅力吸引着大家呢?无它,软件工程崇尚实用主义,而 cmake 的功能…

    Linux 2023年6月6日
    092
  • boot issue

    Q:生产过程中不小心把 boot文件删除了 ,或者升级kenerl时发现版本不兼容,需要回退,此时没有快照备份情况如何操作? A:boot 主要文件是内核和grub引导文件 1.进…

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