爬虫+数据保存2

爬取数据保存到MySQL数据库

这篇文章, 我们来讲解如何将我们爬虫爬取到的数据, 进行保存, 而且是把数据保存到MySQL数据库的方式去保存。

目录

1.使用pymysql连接数据库并执行插入数据sql代码(insert)

2.优化pymysql数据库连接以及插入功能代码

3.爬取双色球网站的数据并保存到MySQL数据库中

4.利用面向对象的写法进行爬虫并保存数据

一、使用pymysql连接数据库并执行插入数据sql代码(insert)

如果我们没有安装过pymysql这个库的话, 我们在终端里面安装一下:

pip install pymysql

安装完这个安装包之后, 我们在代码里面导入这个包

代码:

import pymysql

使用python连接数据库代码(创建一个连接对象):

conn = pymysql.Connect(host='127.0.0.1', port=3306, user='root', password='root', database='spider38')
print(conn)  # 连接对象

这里面的参数说明一下:

host, 这个就是ip, 我们连接本地电脑的数据库, 所以ip就是127.0.0.1(相当于localhost), port是端口, mysql默认端口就3306, user指的是用户名, password指的是密码, database指的是数据库名。指定参数值一个都不能少,并且一个都不能错。python中连接mysql的目的是为了对数据库的内容做操作

注意:在我们写代码之前, 我们自己给自己创建一个叫做spider38数据, 表格名叫做stu。

创建游标对象:

cur = conn.cursor()  # 游标对象cursor

往stu表中添加一条数据(插入数据):

# sql语句
sql = 'INSERT INTO stu VALUES (null,"xiaoyao",18);' # 没有指定字段,代表当前往表添加一条数据,字段值必须要全部加上
# sql = 'INSERT INTO stu(name) VALUES ("xiaoyao")' # 指定了字段,代表当前往表中添加一条数据,字段名和字段值的个数保持一致
# 关键字全大写 非关键字全小写

执行sql语句:

cur.execute(sql)

进行commit提交(执行的是添加,修改,删除,需要配合commit进行提交):

conn.commit()

这里必须要commit提交, 否则数据库里面的数据不会变。

关闭资源:

cur.close() # 关闭游标
conn.close() # 关闭数据库连接

游标和数据库连接必须都关闭, 否则会浪费资源。这个是写代码的常识, 必须养成这样的习惯。

完整代码:

'''
mysql 本地安装 小皮pip install pymysql
'''
import pymysql# 连接mysql'''
电脑中操作mysql的方式:
1- 终端链接mysql 通过命令操作
2- 利用可视化软件
'''
# 指定参数值一个都不能少,并且一个都不能错
conn = pymysql.Connect(host='127.0.0.1', port=3306, user='root', password='root', database='spider38')
print(conn)  # 连接对象
# python中链接mysql的目的是为了对数据库的内容做操作# 只能通过sql语句进行操作
# select * from 表;# 如果想要执行sql语句,必须要通过游标对象完成# 创建游标对象
cur = conn.cursor()  # 游标对象# 往stu表中添加一条数据
# 如果mysql中某个字段设置主键并且设置了自动增长,python的代码写法
# null 不是往数据库存入null而是以我设置的主键为主
sql = 'INSERT INTO stu VALUES (null,"xiaoyao",18);'  # 没有指定字段,代表当前往表添加一条数据,字段值必须要全部加上
# sql = 'INSERT INTO stu(name) VALUES ("xiaoyao")' # 指定了字段,代表当前往表中添加一条数据,字段名和字段值的个数保持一致
# 关键字全大写 非关键字全小写'''
执行的是添加,修改,删除,需要配合commit进行提交
'''
cur.execute(sql)conn.commit()
# 关闭资源
cur.close()
conn.close()

运行结果:

在这里插入图片描述

我们再去Navicat看一下数据库里面的表格信息:

**在这里插入图片描述
**

注意: 第31行的sql = 'INSERT INTO stu VALUES (null,“xiaoyao”,18);'这行代码, 在VALUES里面, 第一个参数写了null,这里null 不是往数据库存入null而是以我设置的主键为主。

二、优化pymysql数据库连接以及插入功能代码

我们在一的基础上, 加上try……execpt……finally……这些关键字去优化连接数据库以及插入数据操作。

优化代码:

'''
mysql 本地安装 小皮pip install pymysql
'''
import pymysql
"""
解决的问题:1- 只有当连接对象创建成功之后,才允许一定要被关闭2- 执行sql语句,成功,则commit 失败,则rollback
"""
conn = 0
cur = 0
try:conn = pymysql.Connect(host='127.0.0.1', port=3306, user='root', password='123456', database='spider38')print(conn)  # 连接对象cur = conn.cursor()  # 游标对象sql = 'INSERT INTO stu VALUES (null,"xiaoyao",20);'  # 没有指定字段,代表当前往表添加一条数据,字段值必须要全部加上'''执行的是添加,修改,删除,需要配合commit进行提交回滚'''cur.execute(sql)conn.commit()
except Exception as e:print('异常原因:',e)if conn!=0:conn.rollback()
finally:print(conn)# 当链接对象创建成功时才需要关闭,但是链接创建失败没有必要关闭# 关闭资源 必须要执行if conn!=0 and cur!=0:print('当前连接已经被关闭')cur.close()conn.close()

在try里面, 是我们认为可能会出错的代码, except里面是当try里面的代码有错误的时候, except里面的代码才会执行, 而且我们通过except Exception as e还有print(‘异常原因:’,e)这两行代码打印异常原因。if conn != 0和conn.rollback()这两行代码指的是如果数据库连接已建立但出现异常,执行回滚操作,取消本次事务中的任何改变。finally里面的代码指的是无论是否发生异常都会执行。在finally里面, 执行的是关闭资源的代码, 如果数据库处于建立且连接状态而且游标也已建立的情况下, 关闭数据库连接和游标连接。

三、爬取双色球网站的数据并保存到MySQL数据库中

我们打开双色球网站:

在这里插入图片描述

我们需要爬取表格里面的所有数据。

我们打开开发者工具, 在里面寻找请求。

在这里插入图片描述

这里面第一个就是我们想要的请求。

这里我们还是使用html解析数据。

代码:

url = 'https://datachart.500.com/ssq/history/history.shtml'
import requests
from lxml import etree
import pymysql
res = requests.get(url)
res.encoding = 'gb2312'
tree = etree.HTML(res.text)
trs = tree.xpath('//tr[@class="t_tr1"]')
# print(len(trs))
conn = 0
cur = 0
try:conn = pymysql.Connect(host='127.0.0.1', port=3306, user='root', password='root', database='spider38')cur = conn.cursor()  # 游标对象for tr in trs:# 基于表格的每一行,获取所有的列tds = tr.xpath('./td/text()')# 红球数据 [期号,]red_nums = ','.join(tds[1:7])# 列表切片,返回的结果还是一个列表,把列表转为字符串,【1,2】 "1,2"sql = f'INSERT INTO ssq VALUES (null,"{red_nums}","{tds[7]}","{tds[8]}","{tds[9]}","{tds[10]}","{tds[11]}","{tds[12]}","{tds[13]}","{tds[14]}","{tds[15]}");'cur.execute(sql)conn.commit()print(sql, '已经执行成功')
except Exception as e:print('异常的原因:',e)if conn!=0:conn.rollback()
finally:# print(conn)# 当链接对象创建成功时才需要关闭,但是链接创建失败没有必要关闭# 关闭资源 必须要执行if conn!=0 and cur!=0:print('当前连接已经被关闭')cur.close()conn.close()

运行结果:

在这里插入图片描述

打开Navicat查看数据库的ssq表格:

在这里插入图片描述

数据添加成功!!!

这里面我们还是用了xpath来爬虫, xpath用法在之前的文章中有讲到, 可以去翻我以前写过的爬虫博客。我们还是在代码当中使用了try……catch……finally……这种写法。

我们在网页的开发者工具里面, 查看元素:

在这里插入图片描述

我们发现我们想获取表格里面的数据, 是在一个表格的tr标签里面, 而且class为t_tr1, 所以就有了trs = tree.xpath(‘//tr[@class=“t_tr1”]’)这行代码, trs目前还是获取着所有类为t_tr1的tr标签, 所以我们需要遍历它, 用for tr in trs:这句话遍历所有类为t_tr1的tr标签, 然后再基于表格的每一行,获取所有的列, 就是tds = tr.xpath(‘./td/text()’)这行代码, 拿到红球数据[期号,] : red_nums = ‘,’.join(tds[1:7]), 将爬取到的数据, 插入到数据库的表格中, sql = f’INSERT INTO ssq VALUES (null,“{red_nums}”,“{tds[7]}”,“{tds[8]}”,“{tds[9]}”,“{tds[10]}”,“{tds[11]}”,“{tds[12]}”,“{tds[13]}”,“{tds[14]}”,“{tds[15]}”);', 列表切片,返回的结果还是一个列表,把列表转为字符串,【1,2】 “1,2”, 注意, 需要有cur.execute(sql)和conn.commit()这两行代码, 不然的话, 数据不会成功的添加到数据库当中, 这两节话的意思分别是执行sql语句和提交事务。后面的except和finally就不难理解了, except里面是当try里面的代码有错误的时候, except里面的代码才会执行, 而且我们通过except Exception as e还有print(‘异常原因:’,e)这两行代码打印异常原因。if conn != 0和conn.rollback()这两行代码指的是如果数据库连接已建立但出现异常,执行回滚操作,取消本次事务中的任何改变。finally里面的代码指的是无论是否发生异常都会执行。在finally里面, 执行的是关闭资源的代码, 如果数据库处于建立且连接状态而且游标也已建立的情况下, 关闭数据库连接和游标连接。

四、利用面向对象的写法进行爬虫并保存数据

将第三点(爬取双色球网站的数据并保存到MySQL数据库中)的代码转换为面向对象的形式去写代码。

这些代码, 不一定要掌握, 学有余地的同学可以去研究下哦!!!

代码:

import pymysql
import requests
from lxml import etreeclass Spider:# url headers host username port password databasedef __init__(self, url, username, password, database):self.url = urlself.username = usernameself.password = passwordself.database = databaseself.headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36             (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36'}self.host = '127.0.0.1'self.port = 3306self.conn = pymysql.Connect(host=self.host, port=self.port, user=username, password=password, database=database)self.cur = self.conn.cursor()# 发请求方法def send_request(self):res = requests.get(self.url, headers=self.headers)res.encoding = 'gb2312'#     调用解析方法,传入响应内容self.parse(res.text)# 解析方法def parse(self, data):  # data=响应的内容#     data = res.texttree = etree.HTML(data)trs = tree.xpath('//tr[@class="t_tr1"]')for tr in trs:# 基于表格的每一行,获取所有的列tds = tr.xpath('./td/text()')# 红球数据 [期号,]#             调用保存方法,报存数据self.save_mysql(tds)# 保存方法def save_mysql(self, tds):  # tds = 页面中的每一条数据 列表red_nums = ','.join(tds[1:7])try:sql = f'INSERT INTO ssq VALUES (null,"{red_nums}","{tds[7]}","{tds[8]}","{tds[9]}","{tds[10]}","{tds[11]}","{tds[12]}","{tds[13]}","{tds[14]}","{tds[15]}");'self.cur.execute(sql)self.conn.commit()print(sql, '保存完毕')except Exception as e:print(e)self.conn.rollback()def close_conn(self):self.cur.close()self.conn.close()# Spider(url,host,username,password,database)
url = 'https://datachart.500.com/ssq/history/history.shtml'
s = Spider(url, 'root', '123456', 'spider38')
# 调用请求方法 --》调用解析--》调用保存数据
s.send_request()
# 关闭资源方法
s.close_conn()

以上就是爬取数据保存到MySQL数据库的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!
如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.
学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.
人生路漫漫, 白鹭常相伴!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts 遍历多个图表,并添加resize缩放

数据结构: data() { return { charts: [ { title: Chart 1, xAxisData: [Mon, Tue, Wed, Thu, Fri, Sat, Sun], yAxisData: [120, 200, 150, 80, 70, 110, 130], }, { title: Chart 2, xAxisData: [Jan, Feb, Mar, Apr, May, Jun, Jul], yAxisData: [22…

Linux 中,flock 对文件加锁

在Linux中,flock是一个用于对文件加锁的实用程序,它可以帮助协调多个进程对同一个文件的访问,避免出现数据不一致或冲突等问题。以下是对flock的详细介绍: 基本原理 flock通过在文件上设置锁来控制多个进程对该文件的并发访问。…

(五)Web前端开发进阶2——AJAX

目录 2.Axios库 3.认识URL 4.Axios常用请求方法 5.HTTP协议——请求报文/响应报文 6.前后端分离开发 7.Element组件库 1.Ajax概述 AJAX 是异步的 JavaScript和XML(Asynchronous JavaScript And XML)。简单点说,就是使用XMLHttpRequest 对象与服务器通信。它可…

使用C#学习Office文件的处理(pptx docx xlsx)

Office文件 是指PPT 、word、Excel 这些常用工具生成的文件 ,例如 pptx docx xlsx。 这些文件的读取和生成有很多很多库 例如 NOPI 、DevExpress、C1、Aspose、Teleric 等等,各有各的优缺点。俺今天不讲这个,俺只是讲讲如何了解Office文件的…

2020年下半年网络规划设计师上午真题及答案解析

1.在支持多线程的操作系统中,假设进程P创建了线程T1,T2,T3,那么下列说法中正确的是( )。 A.该进程中已打开的文件是不能被T1,T2和T3共享的 B.该进程中T1的栈指针是不能被T2共享,但…

Java 使用Maven Surefire插件批量运行单元测试

在基于Maven的Java项目中可以使用Maven 的 mvn test 命令来运行单元测试。 示例 有一个简单的Maven 项目&#xff0c; pom.xml 只导入了JUnit 5 的相关依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://m…

Linux CentOS7下创建SFTP服务器

本文详细介绍了在Linux CentOS上部署安全文件传输协议&#xff08;SFTP&#xff09;服务器的全过程。SFTP基于SSH&#xff08;安全壳层协议&#xff09;提供文件传输服务&#xff0c;继承了SSH的安全特性&#xff0c;如数据加密、完整性验证和服务器认证等&#xff0c;确保数据…

电科金仓(人大金仓)更新授权文件(致命错误: XX000: License file expired.)

问题:电科金仓(人大金仓)数据库链接异常,重启失败,查看日志如下: 致命错误: XX000: License file expired. 位置: PostmasterMain, postmaster.c:725 解决方法: 一、下载授权文件 根据安装版本在官网下载授权文件(电科金仓-成为世界卓越的数据库产品与服务提供商)…

3D Gaussian Splatting代码详解(二):模型构建

3 模型构建 gaussians GaussianModel(dataset.sh_degree) 3.1 初始化函数 __init__ 构造函数 构造函数 __init__ 的主要作用是初始化 3D 高斯模型的各项参数和激活函数&#xff0c;用于生成 3D 空间中的高斯表示。 初始化球谐函数的参数&#xff1a; self.active_sh_degre…

一文讲明白大模型分布式逻辑(从GPU通信原语到Megatron、Deepspeed)

1. 背景介绍 如果你拿到了两台8卡A100的机器&#xff08;做梦&#xff09;&#xff0c;你的导师让你学习部署并且训练不同尺寸的大模型&#xff0c;并且写一个说明文档。你意识到&#xff0c;你最需要学习的就是关于分布式训练的知识&#xff0c;因为你可是第一次接触这么多卡…

Python毕业设计选题:基于协同过滤的校园音乐推荐系统小程序-django+uniapp

开发语言&#xff1a;Python框架&#xff1a;djangouniappPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录界面 管理员功能界面 用户管理 音乐信息管理 音乐类型管理 留言板管…

【python】OpenCV—findContours(4.4)

文章目录 1、功能描述2、代码实现3、完整代码4、结果展示5、涉及到的库函数6、参考 1、功能描述 找出物体轮廓&#xff0c;根据 PCA 计算特征值和特征向量&#xff0c;绘制特征值和特征向量&#xff0c;来初步展示物体的方向 2、代码实现 导入库函数&#xff0c;读入图片&am…

Jmeter实际应用

环境准备 JDK1.8Jmeter 5.6.3 下载地址Jmeter 插件 下载地址 放到lib/ext下 常用命令 # 启动 sh jmeter# 集群模式下启动节点&#xff0c;不启动用不了集群 sh jmeter-server#生成ssl需要的证书, 这里会要求输入个密码&#xff0c;是要在jmeter中用的 keytool -import -ali…

Javaweb 实验4 xml

我发现了有些人喜欢静静看博客不聊天呐&#xff0c; 但是ta会点赞。 这样的人呢帅气低调有内涵&#xff0c; 美丽大方很优雅。 说的就是你&#xff0c; 不用再怀疑哦 实验四 XML 目的&#xff1a; 安装和使用XML的开发环境认识XML的不同类型掌握XML文档的基本语法了解D…

C#界面设计--9--fatal error C1083: 无法打开包括文件:“jruparse.h”: No such file or directory

1、VS2008-编译时报错“fatal error C1083: 无法打开包括文件:“jruparse.h”: No such file or directory” 2、问题出现的原因及解决方法 1、如果要引入的这些,h文件跟.cpp在同一个目录下&#xff0c;就不会出现这种问题&#xff0c;检査在工程的include目录下是不是真的存…

【机器学习】 15. SVM 支撑向量机 support vector machine,拉格朗日,软边界,核函数

SVM 支撑向量机 support vector machine&#xff0c;拉格朗日&#xff0c;软边界&#xff0c;核函数 1. 超平面边界 margin of hyperplane2. 边界越大的超平面越好原因 3. 线性模型通过决策边界分类4. SVM的问题5. 拉格朗日乘子与SVM结合求最大边界6. SVM软边界和硬边界7. 非线…

SpringBoot获取resources目录下的文件

在 Spring Boot 项目中&#xff0c;获取 resources 目录中的文件路径通常涉及到访问类路径资源&#xff08;classpath resources&#xff09;。Spring Boot 提供了一些工具类和方法&#xff0c;可以方便地访问这些资源。以下是一些常见的方法&#xff1a; 首先&#xff0c;我们…

GitLab代码仓管理安装配置使用

Gitlab介绍 GitLab是一个基于Git的开源项目管理工具&#xff0c;它集成了版本控制、代码审查、持续集成&#xff08;CI&#xff09;/持续部署&#xff08;CD&#xff09;、自动化测试等多种功能&#xff0c;是一个完整的DevOps平台。以下是对GitLab的详细介绍&#xff1a; 一…

C#/WinForm 基于ffmpeg视频流转GIF

源码&#xff1a;https://gitee.com/feng-cai/screenshot-recording

Pinctrl子系统pinctrl_desc结构体进一步介绍

往期内容 本专栏往期内容&#xff1a; Pinctrl子系统和其主要结构体引入 input子系统专栏&#xff1a; 专栏地址&#xff1a;input子系统input角度&#xff1a;I2C触摸屏驱动分析和编写一个简单的I2C驱动程序 – 末片&#xff0c;有往期内容观看顺序 I2C子系统专栏&#xff1a;…