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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物理模拟:OpenVDB数据与游戏引擎的结合使用

目录 OpenVDB简介 VDB(Voxel Data Base)存储结构 距离场(SDF)和密度场(Density) VDB格式特点 VDB应用案例 1. 网格运算 2.Ray Marching算法优化 3.模型转流体 PBRT V4 OpenVDB在Unreal Engine中的…

Java8中CompletableFuture.allOf的使用

目录标题 CompletableFuture.allOf(...);CompletableFuture.allOf(...).get();CompletableFuture.allOf(...).join();总结如何优雅的处理异常呢? CompletableFuture.allOf(…); CompletableFuture.allOf(…) 本身不会等待所有的 Completable…

VBA语言専攻介绍20241031

VBA语言専攻简介 在当今世界,几乎没有任何工作是没有计算机的。有些工作需要定期重复相同的过程,最好将它们自动化。一旦任务自动化,只需单击一个按钮即可运行。VBA是实现自动化工作的最为简单的方式,它不需要其他工具&#xff0…

OpenCV视觉分析之目标跟踪(6)轻量级目标跟踪器类TrackerNano的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 Nano 跟踪器是一个超轻量级的基于深度神经网络(DNN)的通用目标跟踪器。 由于特殊的模型结构,Nano 跟踪器速度…

Python小游戏17——飞机大战

运行结果 首先,你需要安装Pygame库。如果你还没有安装它,可以使用以下命令来安装: bash pip install pygame 代码: python import pygame import random # 初始化Pygame pygame.init() # 屏幕大小 SCREEN_WIDTH 800 SCREEN_HEIGH…

Java 基本语法与语言环境(1/30)

目录 Java 基本语法与语言环境 1. Java 语言环境搭建 1.1 安装 JDK 1.2 配置系统变量 配置步骤(Windows 系统) 2. Hello World 程序 2.1 代码解析 2.2 编译与运行 3. Java 程序结构 4. 基本语法规则 4.1 标识符与关键字 4.2 数据类型与变量 …

开源一个开发的聊天应用与AI开发框架,集成 ChatGPT,支持私有部署的源码

大家好,我是一颗甜苞谷,今天分享一个开发的聊天应用与AI开发框架,集成 ChatGPT,支持私有部署的源码。 介绍 当前系统集成了ChatGPT的聊天应用,不仅提供了基本的即时通讯功能,还引入了先进的AI技术&#x…

LSTM——长短期记忆神经网络

目录 1.LSTM 工作原理 2.LSTM的代码实现 3.代码详解 LSTM(Long Short-Term Memory)是一种特殊的循环神经网络(RNN),用于解决长序列中的长期依赖问题。它通过引入门机制,控制信息的流入、保留和输出&…

大数据新视界 -- 大数据大厂之优化大数据计算框架 Tez 的实践指南

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

dedecms手机搜索不跳转手机页面模板的解决方法

1.找到文件plus/search.php,添加如下代码并保存 $mobile (isset($mobile) && is_numeric($mobile)) ? $mobile : 0; if ( $mobile1 ) {define(DEDEMOB, Y); } 2.来到网站后台,默认模板管理,新建模板 将手机端列表页面的.html文件&…

UE5之5.4 第一人称示例代码阅读2 子弹发射逻辑

TP_WeaponComponent.h 看看头文件 暴露了attach weapon和fire给蓝图 这两个函数意义一看名字吧,就是捡起来枪的时候执行,一个就是发射子弹的时候执行 #pragma once#include "CoreMinimal.h" #include "Components/SkeletalMeshComponen…

matlab读取逐日的1km分辨率中国大陆地区的土壤水数据,并汇总至逐月分辨率

1.前言 ESSD一篇文章介绍了逐日的土壤水数据: ESSD - A 1 km daily soil moisture dataset over China using in situ measurement and machine learning 图片来源:Li et al., 2022, ESSD 中国大陆地区的土壤水的数据下载地址: 国家青藏高…

哈工大《理论力学》第九版课后答案解析及笔记PDF

第九版序 哈工大《理论力学》初版于1961年,先后再版8次,曾获得首届国家优秀教材奖和国家级教学成果奖。本书第8版为“十二五”普通高等教育本科国家级规划教材,并于2021年被国家教材委员会评为首届全国教材建设奖全国优秀教材一等奖。 本书…

MindShare PCIE 3.0 笔记-第三四章

MindShare 官网,地址如下: MindShare Charpter 3: Configuration 概述 主要介绍 PCIe 驱动对 PCIE 设备中 function 的 Config Header 的访问. 1. 总线、设备与功能定义 每一个 PCIE function 都是独一无二的,通过设备号与总线号区分。 2. PCIe 总线…

Windows和Linux等保加固测评(2)

本文以等保2.0为标准,三级等保要求,centos7.6.1810系统为例进行演示。 关于加密 /etc/shadow文件格式和/etc/passwd类似,由若干字段组成,字段之间用“:”隔开 登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志 ice:$6$5NA…

Redis的删除策略以及内存淘汰机制

在日常开发中,我们使用 Redis 存储 key 时通常会设置一个过期时间,但是 Redis 是怎么删除过期的 key,而且 Redis 是单线程的,删除 key 会不会造成阻塞。要搞清楚这些,就要了解 Redis 的过期策略和内存淘汰机制。 Redi…

h5小游戏5--杀死国王(附源码)

源代码如下 1.游戏基本操作 用空格键攻击,kill the king。 css样式源码 charset "UTF-8";font-face {font-family: "AddLGBitmap09";src: url("https://assets.codepen.io/217233/AddLGBitmap09.woff2") format("woff2"…

CentOS下安装ElasticSearch7.9.2(无坑版)

准备目录 搞一个自己喜欢的目录 mkdir /usr/local/app切换到该目录 cd /usr/local/app下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-linux-x86_64.tar.gz选择其他版本 点击进入官网 https://www.elastic.co/guide/en/elasticsea…

Seven 9.20.01 | 趣味个人锻炼挑战,每天7分钟,坚持7个月

这是一款趣味个人锻炼挑战应用,基于《纽约时报杂志》报道的7分钟科学锻炼文章。无需锻炼设备,每天只需几分钟时间,趣味成就和奖励不断鼓励你。只需一张椅子、墙壁和自身的体重,7分钟锻炼基于科学研究,可在较短的时间内…

传智杯 第六届-复赛-A

题目描述: 小红拿到了一个字符串,她准备把这个字符串劈成两部分,使得第一部分的长度恰好是第二部分的两倍。你能帮帮她吗? 输入描述: 一个仅由小写字母组成的字符串,长度不超过10^5。 输出描述: 如果无解&#xff0c…