一、普通的保存

url = https://movie.douban.com/top250;
_#UA伪装
_headers={‘User-Agent’: 你的User-Agent} response = requests.get(url=url,headers=headers)_page_text = response.text; with open(‘豆瓣top250.html’,‘w’,encoding=‘utf-8’) as fp:
fp.write(page_text)

二、保存到xls表格中

将相关数据写入Excel中

def saveData(datalist,savepath):

以UTF-8编码格式创建一个Excel对象

book=xlwt.Workbook(encoding=’utf-8’, style_compression=0)

创建一个sheet表

sheet=book. add_sheet(‘豆瓣电影Top250’, cell_overwrite_ok=True) co1=(‘电影详情链接’,’图片链接’,’影片中文名’,’影片外国名’,’评分’,’评价数’,’概况’,’相关信息’) for i in range(0,8): sheet.write (0, i, col[i])#列名

往单元格写入内容

for i in range(0, 250): data=datalist[i] for j in range(0,8): sheet.write(i+1,j, data[j])#数据 book. save (savepath)#保存

三、保存到mysql数据库中

1.参考资料

python—存储数据到MySQL,CSDN
Python3的菜鸟教程
Python连接MySQL数据库【趣学Python】—哔哩哔哩

2.下载安装PyMySQL

pip3 install PyMySQL

3.PyMySQL 的使用

(1)、引入开发包: import pymysql.cursors (2)、获取数据库连接: db = pymysql.connnect(host=’localhost’,user=’root’,password=’123456’,db=’wikiurl’,charset=’utf8mb4’) (3)、获取会话指针:db.cursor() (4)、执行SQL语句cursor.execute(sql语句,(参数1,参数n)) (5)、提交:db.commit() (6)、关闭:db.close()

4.数据库插入数据的例子

import pymysql

打开数据库连接

db = pymysql.connect(“localhost”,”testuser”,”test123”,”TESTDB”)

使用cursor()方法获取操作游标

cursor = db.cursor()

SQL 插入语句

sql = “INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES (‘%s’, ‘%s’, %s, ‘%s’, %s)” % \ (‘Mac’, ‘Mohan’, 20, ‘M’, 2000) try:

执行sql语句

cursor.execute(sql)

执行sql语句

db.commit() except:

发生错误时回滚

db.rollback()

关闭数据库连接

db.close()

还有一种效率较高的方法,使用 executemany() 可以同时插入多条数据。示例如下:

db = pymysql.connect(‘localhost’,’root’,’123456’,’maoyandb’,charset=’utf8’) cursor = db.cursor()

sql语句执性,列表元组

info_list = [(‘我不是药神’,’徐峥’,’2018-07-05’),(‘你好,李焕英’,’贾玲’,’2021-02-12’)] sql = ‘insert into movieinfo values(%s,%s,%s)’ cursor.executemany(sql,info_list) db.commit()

关闭

cursor.close() db.close()

5.数据库查询数据的例子

import pymysql

打开数据库连接

db = pymysql.connect(“localhost”, “root”, “123456”, “test”)

使用cursor()方法获取操作游标

cursor = db.cursor()

SQL 查询语句

sql = “SELECT * FROM EMPLOYEE \ WHERE INCOME > ‘%d’” % (1000) try:

执行SQL语句

cursor.execute(sql)
db.commit() result = cursor.fetchone()
while result!=None:
print(result, cursor.rownumber)
result = cursor.fetchone()
except:
print (“Error: unable to fetch data”)

关闭数据库连接

db.close()

6.数据库更新数据的例子

import pymysql

打开数据库连接

db = pymysql.connect(“localhost”, “root”, “123456”, “test”)

使用cursor()方法获取操作游标

cursor = db.cursor()

SQL 查询语句

sql = “UPDATE Student SET name=’%s’ WHERE name = ‘%s’” % (‘小明’,’小红’) try:

执行SQL语句

cursor.execute(sql)
db.commit() print(‘数据更新成功!’)
except pymysql.Error as e:
print (“数据更新失败:”, str(e)) db.rollback()

关闭数据库连接

db.close()

7.实操中遇到的问题

(1)pymysql.connect()方法失效,没找到connect

问题展示: db = pymysql.connnect(host=‘localhost’,user=‘root’,password=‘root’,db=‘douban’,charset=‘utf8’) image.png

网上看了很多资料,他们说是因为系统中有文件名是pymysql.py,与包名重叠了,但是我改了重名的文件名后,还是没有解决问题。

参考文章: python-module ‘pymysql’ has no attribute ‘connect’ 报错(AttributeError:module “xxx” has no attribute “connect”)的解决办法 pymysql 报错:module ‘pymysql’ has no attribute ‘connect’

最后是把代码改了,源码中connect=connections.Connection,但不知道为啥不行。

解决办法: db = pymysql.connections.Connection(host=‘localhost’,user=‘root’,password=‘root’,db=‘game’,charset=‘utf8’)

(2)连接mysql库时候,没找到对应的表

问题展示: db = pymysql.connections.Connection(host=‘localhost’,user=‘root’,password=‘root’,db=‘game’,charset=‘utf8’) image.png

找到的资料说我可能是系统中装了两个版本的mysql,关掉没用的那个就好

参考资料: python连接mysql数据库——版本问题

我的电脑中果然有两个mysql版本,关掉了一个没用的后,问题就解决了

问题解决: image.png

(3)如何实现电影类型的不重复插入

插入前先查询,如果有该类别,则不插入
参考文章:
【SQL-不重复插入】一条语句实现,插入不重复的记录到数据库
MySQL防止重复插入唯一限制的数据 4种方法

问题解决: insert into movie_type_menu(name) select ‘推理’ from dual where not exists (select * from movie_type_menu where name = ‘推理’)

(4)mysql数据库中的dual表是什么?

dual是虚拟表,为了满足 select …from …..; 格式。比如:
select sysdate from dual;
获取系统时间。

(5)Python的for循环中i的值变不了

解决方法: 另设一个变量,让其参与变化。

(6)消除字符串首尾空格

解决办法: str.strip()

(7)pymysql中cursor的rowcount和rownumber有啥区别

rowcount返回的是当前连接中操作数据库的行数,增删改查语句都能对它有效果。 如执行select * from TTT这条语句如果查出了2条数据,row_count函数就会返回2。 rownumber不懂,没找到对应文档,也没看懂代码。

(8)pymysql.err.InterfaceError: (0, ‘’)

出错的代码段:

def saveData(db,movie):
_# 数据预处理
# 电影类型目录
_typeMenuList = movie.type.split(‘ ‘)
typeMenuList = removeEmptyAndEnter(typeMenuList)

  1. print(**'-------------电影类型目录是 %s--------------'**%typeMenuList)<br /> _# 获取操作游标<br /> _cursor = db.cursor()


try:
# 插入类别目录
_typeMenuInsertTotalNum = 0;
for typeMenu in typeMenuList:
typeMenuInsertSql = “insert into movie_type_menu(name) select ‘%s’ from dual \
where not
_exists
(select * from movie_type_menu where name = ‘%s’)”\
%(typeMenu,typeMenu)
_# print(typeMenuInsertSql)
_typeMenuInsertNum = cursor.execute(typeMenuInsertSql)
db.commit()
typeMenuInsertTotalNum += typeMenuInsertNum
print(‘——————-%d条电影类型目录插入成功————————-‘%typeMenuInsertTotalNum)
except:
db.rollback()
db.close()
return

报错:

Traceback (most recent call last): File “C:\Users\cxm\@study\pythonProject\douban\doubanTop.py”, line 133, in saveData typeMenuInsertNum = cursor.execute(typeMenuInsertSql) File “C:\Users\cxm\AppData\Roaming\Python\Python39\site-packages\pymysql\cursors.py”, line 148, in execute result = self._query(query) File “C:\Users\cxm\AppData\Roaming\Python\Python39\site-packages\pymysql\cursors.py”, line 310, in _query conn.query(q) File “C:\Users\cxm\AppData\Roaming\Python\Python39\site-packages\pymysql\connections.py”, line 547, in query self._execute_command(COMMAND.COM_QUERY, sql) File “C:\Users\cxm\AppData\Roaming\Python\Python39\site-packages\pymysql\connections.py”, line 793, in _execute_command raise err.InterfaceError(0, “”) pymysql.err.InterfaceError: (0, ‘’)

出错的场景:

要插入电影类目“剧情”,“剧情”这条记录在数据库中已经存在了,按逻辑,此时不会插入新的数据到数据库中。 插入的sql语句是 typeMenuInsertSql = “insert into movie_type_menu(name) select ‘%s’ from dual \
where not
exists (select * from movie_type_menu where name = ‘%s’)”\
%(typeMenu,typeMenu) 报的错是: pymysql.err.InterfaceError: (0, ‘’)

出错原因:
参考链接:【Python】数据库异常pymysql.err.InterfaceError: (0, ‘’)解决方案

数据库的连接建立太久了,会自动断开,这个时候我们需要重新建立连接,否则访问接口就会出现异常报错了。

解决办法:
参考链接:https://www.cnblogs.com/wintest/p/12772670.html

可以在每次操作SQL之前对连接进行检查,如果发现连接已经断开,则进行重连。 在 pymysql 创建的数据库连接对象下,有这么一个方法:ping() 在源码中,如果使用了该方法 ping(reconnect=True) ,那么可以在每次连接之前,会检查当前连接是否已关闭,如果连接关闭则会重新进行连接