爬虫+数据保存2

news2024/11/7 10:30:52

爬取数据保存到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 etree


class Spider:
    # url headers host username port password database
    def __init__(self, url, username, password, database):
        self.url = url
        self.username = username
        self.password = password
        self.database = database
        self.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 = 3306
        self.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.text
        tree = 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.coloradmin.cn/o/2228860.html

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

相关文章

什么样的工程项目管理软件适合中小施工企业?

工程行业是典型的传统行业,劳动密集,协作频繁,依赖经验传承。在工程项目施工过程中,常见的难题纷繁复杂,其中包括效率低下、材料浪费、数据不实、原材料成本上涨、工期延误、质量缺陷和安全风险等。这些问题不仅阻碍了…

机器学习中的嵌入是什么?

一、说明 嵌入是真实世界对象的数字表示,机器学习(ML)和人工智能(AI)系统利用它来像人类一样理解复杂的知识领域。例如,计算算法了解 2 和 3 之间的差为 1,这表明与 2 和 100 相比,2…

NVR设备ONVIF接入平台EasyCVR视频融合平台智慧小区视频监控系统建设方案

一、方案背景 智慧小区构成了“平安城市”建设的基石。随着社会的进步,社区安全问题逐渐成为公众关注的热点。诸如高空抛物、乱丢垃圾、破坏车辆、入室盗窃等不文明行为和违法行为频繁出现。目前,许多小区的物业管理和安全防护系统仍然较为简单和陈旧&a…

Typora一款极简Markdown文档编辑器和阅读器,实时预览,序列号生成!免费!最新可用!

文章目录 一、Typora下载和安装二、Typora序列号生成 Typora是一款Markdown编辑器和阅读器,风格极简,实时预览,所见即所得,支持MacOS、Windows、Linux操作系统,有图片和文字、代码块、数学公式、图表、目录大纲、文件管…

uniapp的video视频属性打包app后层级过高

问题:在使用uniapp开发APP时,使用video标签显示视频发现H5可以正常展示,但是打包到APP后,它的层级过高,把底部导航都盖住了。 官网说明:uni-app官网 官网给了cover-view组件或plus.nativeObj.view、subNVue…

人工智能原理实验一:知识的表示与推理实验

一、实验目的 本实验课程是计算机、智能、物联网等专业学生的一门专业课程,通过实验,帮助学生更好地掌握人工智能相关概念、技术、原理、应用等;通过实验提高学生编写实验报告、总结实验结果的能力;使学生对智能程序、智能算法等有…

混凝土裂缝图像分割系统:快速图像识别

混凝土裂缝图像分割系统源码&数据集分享 [yolov8-seg-C2f-RFAConv&yolov8-seg-C2f-SCConv等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Glo…

不再输入单号查快递,批量查快递单号信息的新方法,智能排序快递时效并查找时效相同的单号,一站式物流查询解决方案

厌倦了逐个输入快递单号查询物流信息的繁琐过程?想要一键就能批量查询快递单号,并且智能排序快递时效,轻松查找时效相同的单号?那么,恭喜你,你即将解锁快递查询的新境界!快递批量查询高手软件&a…

国标GB28181设备管理软件EasyGBS国标GB28181公网平台应用到“雪亮工程”

随着信息技术的飞速发展,视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在这一变革中,国标GB28181设备管理软件EasyGBS凭借其强大的功能和广泛的应用场景,成为推动这一转变的重要力量。特别是在“雪亮工程”这一重要的群众性…

Redis 哨兵 总结

前言 相关系列 《Redis & 目录》《Redis & 哨兵 & 源码》《Redis & 哨兵 & 总结》《Redis & 哨兵 & 问题》 参考文献 《Redis的主从复制和哨兵机制详解》《Redis中的哨兵(Sentinel)》《【Redis实现系列】Sentinel自动故…

springboot使用配置类从 application.yml 或 application.properties 文件中读取静态属性

springboot使用配置类从 application.yml 或 application.properties 文件中读取静态属性 1. 配置类定义 通过 ConfigurationProperties(prefix “data-base-check”),Spring Boot 将带有 data-base-check 前缀的属性从 application.yml 或 application.propertie…

Java 中的微服务架构与 Spring Boot 集成(30/30)

目录 Java 中的微服务架构与 Spring Boot 集成 1. 微服务架构概述 2. Spring Boot 简介 2.1 Spring Boot 的特点 3. 使用 Spring Boot 构建微服务 3.1 构建一个简单的微服务 4. 服务发现与注册中心 4.1 使用 Eureka 实现服务注册和发现 5. 使用 Spring Cloud Gateway …

ssm020基于ssm的人才招聘网站+jsp(论文+源码)_kaic

摘 要 随着科技的发展,人才招聘的方式也发生着改变。本基于ssm的人才招聘网站正是采用计算机技术和网络设计的新型系统,可以有效的把招聘信息与网络相结合,为用户提供工作帮助和管理需求。本系统采用mysql数据库存储数据,兼容性…

Servlet 3.0 新特性全解

文章目录 Servlet3.0新特性全解Servlet 3.0 新增特性Servlet3.0的注解Servlet3.0的Web模块支持servlet3.0提供的异步处理提供异步原因实现异步原理配置servlet类成为异步的servlet类具体实现异步监听器改进的ServletAPI(上传文件) Servlet3.0新特性全解 tomcat 7以上的版本都支…

全球最大开源系统遭“绑架”,华为携国产系统冲出国门,优势尽显

被“绑架”的Linux 在科技飞速发展的今天,开源软件已成为全球技术合作与创新的重要基石。其中大家熟知的开源系统Linux内核项目,自1991年由芬兰学生Linus Torvalds创建以来,一直以其开放性、协作性和透明性著称。它鼓励全球各地的开发者共同…

一体化运维监控管理平台:构建高效、可靠的IT运维体系

在当今数字化转型的浪潮中,企业的IT系统日益复杂,运维工作面临着前所未有的挑战。如何确保IT基础设施的稳定运行,提高运维效率,成为每个企业关注的焦点。为此,我们推出了一体化运维监控管理平台,旨在通过全…

操作系统笔记(五)信号量,经典的IPC问题(读写者问题...)

信号量 一个信号量是一个包含两部分内容的数据结构: (a) 一个整数计数器, COUNT (b) 一个记录阻塞进程ID的队列, Q 信号量有两个原子操作: UP(V操作) 和 DOWN (P操作) DOWN(S): if (S.count > 0) S.count …

基于SpringBoot+Vue的前后端分离的大学自动排课系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 在这个背景下&#xf…

【IEEE出版|:IEEE Xplore,EI Compendex,Scopus检索|征稿正在进行中!】

第七届机械工程与智能制造国际会议(WCMEIM 2024) 2024 7th World Conference on Mechanical Engineering and Intelligent Manufacturing 【会议信息】 会议日期:2024年11月15-17日 会议地点:中国武汉(武汉纺织大学…

HTMLCSS:3D旋转动画机器人摄像头

效果演示 创建了一个3D机器人摄像头效果。 HTML <div class"modelViewPort"><div class"eva"><div class"head"><div class"eyeChamber"><div class"eye"></div><div class&quo…