10-python连接mysql


前言

数据库编程是在应用程序中与数据库交互和管理数据的关键部分。MySQL是一种流行的关系型数据库管理系统(RDBMS),在Python中进行MySQL数据库编程相对容易


一、基本代码

import pymysql
# 链接信息
conn =
pymysql.connect(host='127.0.0.1',port=3306,user='root',password='root',database='spide
r36')
# 通过游标对象执行sql语句
cur = conn.cursor()
# 执行sql语句
# 全字段添加,表字段个数和数据个数要对应
# sql = 'insert into demo values (null,"coco")'
# 指定字段添加,表名后面指定要添加的字段名 字段名和字段值的个数对应上
sql = 'insert into demo(name) values ("coco")'
cur.execute(sql) # 出现异常
# 执行insert update delete 必须要提交才可以生效
conn.commit()
# 关闭连接
cur.close()
conn.close()

二、使用步骤

1.细节完善

代码如下(示例):

import pymysql
conn = ''
cur = ''
try:
    # 链接信息
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='root', database='spider36')
    # 通过游标对象执行sql语句
    cur = conn.cursor()
    # 执行sql语句
    # 全字段添加,表字段个数和数据个数要对应
    # sql = 'insert into demo values (null,"coco")'
    # 指定字段添加,表名后面指定要添加的字段名 字段名和字段值的个数对应上
    sql = 'insert into demo(name) values ("coco")'
    cur.execute(sql)  # 出现异常
    # 执行insert update delete 必须要提交才可以生效
    conn.commit()
except Exception as e:
    print('出现异常',e)
    conn.rollback()
finally: # 不管是否出现异常,都必须要执行的操作
    # 关闭连接
    if conn != '' and cur !='':
        print(1)
        cur.close()
        conn.close()
    else:
        print(2)

2.实例

代码如下(示例):

'''
目标网页:https://bangumi.tv/anime/browser?sort=rank&page=10
写入3页数据:分表保存,第一页第二页第三页 三个子表
中文名
话数
放送开始
导演
详情介绍
评分

如果主页页面没有导演数据,则直接从列表索引取值报错,如果报错,则去详情页取出导演数据

'''
import requests
from lxml import etree
import re
import pymysql
conn = ''
cur = ''

try:
    # 链接信息
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='root', database='spider36')
    # 通过游标对象执行sql语句
    cur = conn.cursor()
    headers = {
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'accept-encoding': 'gzip, deflate, br, zstd',
        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
        'cache-control': 'no-cache',
        'connection': 'keep-alive',
        'cookie': 'chii_sec_id=c2mgQz0ZuMSdkKWsGY7WWigRn8AGzfbm7H%2Ba%2FA; chii_theme=dark; _ga=GA1.1.2117504974.1722597651; __utmz=1.1725715843.9.3.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; chii_sid=Q51pAp; __utma=1.1622962883.1722597651.1725953337.1725968006.18; __utmc=1; __utmt=1; __utmb=1.2.10.1725968006; _ga_1109JLGMHN=GS1.1.1725968006.24.1.1725968028.0.0.0',
        'host': 'bangumi.tv',
        'pragma': 'no-cache',
        'sec-ch-ua': '"Chromium";v="128", "Not;A=Brand";v="24", "Google Chrome";v="128"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'sec-fetch-dest': 'document',
        'sec-fetch-mode': 'navigate',
        'sec-fetch-site': 'none',
        'sec-fetch-user': '?1',
        'upgrade-insecure-requests': '1',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
    }
    count = 1
    for page in range(1, 4):
        # 添加表头
        # count,title,num,date,dy,pf,d_info
        url = f'https://bangumi.tv/anime/browser?sort=rank&page={page}'
        res = requests.get(url, headers=headers)
        # 设置响应编码
        # 响应对象.encoding='charset的编码'
        res.encoding = 'utf-8'
        res_html = res.text
        # 使用xpath解析数据
        tree = etree.HTML(res_html)
        # 取出所有整体
        lis = tree.xpath('//ul[@id="browserItemList"]/li')
        # print(len(lis))
        for li in lis:
            # li = 第一个动漫标签对象
            # 标题
            # xq=str(remove_english(x))
            title = li.xpath('.//a[@class="l"]/text()')[0]
            info = li.xpath('.//p[@class="info tip"]/text()')[0].replace('\n', '').replace(' ', '')
            # 2024年7月6日 / 吉澤翠 / 西尾維新 『愚物語』『撫物語』『業物語』『忍物語』(講談社BOX) / 渡辺明夫
            # info_ls = info.split('/') #[26话,2004年1月1日,神山健治,士郎正宗]
            # 话数
            num = ''.join(re.findall('\d+话', info))
            # 时间
            date = ''.join(re.findall('\d{4}年\d{1,2}月\d{1,2}日|\d{4}-\d{1,2}-\d{1,2}', info))
            # 评分
            pf = li.xpath('.//small[@class ="fade"]/text()')[0]
            # 获取详情页数据 得到详情页的url
            d_url = li.xpath('.//a[@class="l"]/@href')[0]
            # /subject/326
            # https://bangumi.tv/subject/326
            d_url = 'https://bangumi.tv' + d_url
            # 请求详情页,得到响应的内容
            d_res = requests.get(d_url, headers=headers)
            d_res.encoding = 'utf-8'
            # 解析详情页数据 需要重新加载数据
            d_tree = etree.HTML(d_res.text)
            # 简介
            d_info = d_tree.xpath('//div[@id="subject_summary"]/text()')
            # 简介数据中可能会出现引号,导致保存到数据库中和mysql的引号冲突,所以把英文的引号换成中文的引号
            d_info = ''.join(d_info).replace('"','“')
            # 导演
            # 则从详情页中取出数据
            dy = ''.join(d_tree.xpath('//a[@rel="v:directedBy"]/text()'))
            print(count,title,num,date,dy,pf,d_info)
            sql = f'insert into tv values (null,"{title}","{date}","{dy}","{pf}","{d_info}","{num}")'
            cur.execute(sql)  # 出现异常
            # 执行insert update delete 必须要提交才可以生效
            conn.commit()
            count += 1
        print(f'当前是第{page}页')
except Exception as e:
    print(e)
    if conn != '' and cur != '':
        conn.rollback()
finally:
    if conn != '' and cur !='':
        cur.close()
        conn.close()



总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

william_liu1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值