前言
数据库编程是在应用程序中与数据库交互和管理数据的关键部分。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()