如何使用 Python Pymysql 进行数据存储?

wufei123 发布于 2023-04-24 阅读(836)

Python 连接并操作 MySQL 数据库,主要通过 Pymysql 模块实现。这里讲解如何将抓取的数据存储至 MySQL 数据库。

创建存储数据表

首先您应该确定您的计算机上已经安装了 MySQL 数据库,然后再进行如下操作:

如何使用 Python Pymysql 进行数据存储?

1

2

3

4

5

6

7

8

9

10

11

12

# 1. 连接到mysql数据库

mysql -h227.0.0.1 -uroot -p123456

# 2. 建库

create database maoyandb charset utf8;

# 3. 切换数据库

use maoyandb;

# 4. 创建数据表

create table filmtab(

name varchar(100),

star varchar(400),

time varchar(30)

);

Pymysql基本使用

1) 连接数据库

1

db = pymysql.connect('localhost','root','123456','maoyandb')

参数说明:

  • localhost:本地 MySQL 服务端地址,也可以是远程数据库的 IP 地址。

  • root:连接数据所使用的用户名。

  • password:连接数据库使用的密码,本机 MySQL 服务端密码“123456”。

  • db:连接的数据库名称。

2) 创建cursor对象

1

cursor = db.cursor()

3) 执行sql命令

execute() 方法用来执行 SQL 语句。如下所示:

1

2

3

4

5

6

#第一种方法:编写sql语句,使用占位符传入相应数据

sql = "insert into filmtab values('%s','%s','%s')" % ('刺杀,小说家','雷佳音','2021')

cursor.excute(sql)

第二种方法:编写sql语句,使用列表传参方式

sql = 'insert into filmtab values(%s,%s,%s)'

cursor.execute(sql,['刺杀,小说家','雷佳音','2021'])

4) 提交数据

1

db.commit()

5) 关闭数据库

1

2

cursor.close()

db.close()

完整的代码如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

# -*-coding:utf-8-*-

import pymysql

#创建对象

db = pymysql.connect('localhost','root','123456','maoyandb')

cursor = db.cursor()

# sql语句执性,单行插入

info_list = ['刺杀,小说家','雷佳音,杨幂','2021-2-12']

sql = 'insert into movieinfo values(%s,%s,%s)'

#列表传参

cursor.execute(sql,info_list)

db.commit()

# 关闭

cursor.close()

db.close()

查询数据结果,如下所示:

mysql> select * from movieinfo;
+-------------+-------------------+-----------+
| name | star | time |
+-------------+-------------------+-----------+
| 刺杀,小说家 | 雷佳音,杨幂 | 2021-2-12 |
+-------------+-------------------+-----------+
1 rows in set (0.01 sec)

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

1

2

3

4

5

6

7

8

9

10

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()

查询插入结果,如下所示:

mysql> select * from movieinfo;
+-------------+-------------------+------------+
| name | star | time |
+-------------+-------------------+------------+
| 我不是药神 | 徐峥 | 2018-07-05 |
| 你好,李焕英 | 贾玲 | 2021-02-12 |
+-------------+-------------------+------------+
2 rows in set (0.01 sec)

修改爬虫程序

下面修改一下爬虫程序,将抓取下来的数据存储到 MySQL 数据库。如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

# coding=gbk

from urllib import request

import re

import time

import random

from ua_info import ua_list

import pymysql

class MaoyanSpider(object):

    def __init__(self):

        #初始化属性对象

        self.url = 'https://maoyan.com/board/4?offset={}'

        #数据库连接对象

        self.db = pymysql.connect(

            'localhost','root','123456','maoyandb',charset='utf8')

        #创建游标对象

        self.cursor = self.db.cursor()

    def get_html(self,url):

        headers = {'User-Agent':random.choice(ua_list)}

        req = request.Request(url=url,headers=headers)

        res = request.urlopen(req)

        html = res.read().decode()

        # 直接解析

        self.parse_html(html)

    def parse_html(self,html):

        re_bds = '<div class="movie-item-info">.*?title="(.*?)".*?<p class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>'

        pattern = re.compile(re_bds,re.S)

        r_list = pattern.findall(html)

        self.save_html(r_list)

    def save_html(self, r_list):

        L = []

        sql = 'insert into movieinfo values(%s,%s,%s)'

        # 整理数据

        for r in r_list:

            t = (

                r[0].strip(),

                r[1].strip()[3:],

                r[2].strip()[5:15]

            )

            L.append(t)

            print(L)

        # 一次性插入多条数据 L:[(),(),()]

        try:

            self.cursor.executemany(sql,L)

            # 将数据提交数据库

            self.db.commit()

        except:

            # 发生错误则回滚

            self.db.rollback()

    def run(self):

        for offset in range(0,11,10):

            url = self.url.format(offset)

            self.get_html(url)

            time.sleep(random.uniform(1,3))

        # 断开游标与数据库连接

        self.cursor.close()

        self.db.close()

if __name__ == '__main__':

    start=time.time()

    spider = MaoyanSpider()

    spider.run()

    end=time.time()

    print("执行时间:%.2f" % (end-start))

数据库查询存储结果,如下所示:

mysql> select * from movieinfo;
+----------------+----------------------------------------------------------+------------+
| name | star | time |
+----------------+----------------------------------------------------------+------------+
| 我不是药神 | 徐峥,周一围,王传君 | 2018-07-05 |
| 肖申克的救赎 | 蒂姆&middot;罗宾斯,摩根&middot;弗里曼,鲍勃&middot;冈顿 | 1994-09-10 |
| 绿皮书 | 维果&middot;莫腾森,马赫沙拉&middot;阿里,琳达&middot;卡德里尼 | 2019-03-01 |
| 海上钢琴师 | 蒂姆&middot;罗斯,比尔&middot;努恩,克兰伦斯&middot;威廉姆斯三世 | 2019-11-15 |
| 小偷家族 | 中川雅也,安藤樱,松冈茉优 | 2018-08-03 |
| 霸王别姬 | 张国荣,张丰毅,巩俐 | 1993-07-26 |
| 哪吒之魔童降世 | 吕艳婷,囧森瑟夫,瀚墨 | 2019-07-26 |
| 美丽人生 | 罗伯托&middot;贝尼尼,朱斯蒂诺&middot;杜拉诺,赛尔乔&middot;比尼&middot;布斯特里克 | 2020-01-03 |
| 这个杀手不太冷 | 让&middot;雷诺,加里&middot;奥德曼,娜塔莉&middot;波特曼 | 1994-09-14 |
| 盗梦空间 | 莱昂纳多&middot;迪卡普里奥,渡边谦,约瑟夫&middot;高登-莱维特 | 2010-09-01 |
+----------------+----------------------------------------------------------+------------+
10 rows in set (0.01 sec)

以上就是如何使用 Python Pymysql 进行数据存储?的详细内容


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

河南中青旅行社综合资讯 奇遇综合资讯 盛世蓟州综合资讯 综合资讯 游戏百科综合资讯 新闻43220