Python Pymysql實現(xiàn)數(shù)據(jù)存儲的示例
Python 連接并操作 MySQL 數(shù)據(jù)庫,主要通過 Pymysql 模塊實現(xiàn)。這里講解如何將抓取的數(shù)據(jù)存儲至 MySQL 數(shù)據(jù)庫。
創(chuàng)建存儲數(shù)據(jù)表
首先您應(yīng)該確定您的計算機上已經(jīng)安裝了 MySQL 數(shù)據(jù)庫,然后再進行如下操作:
# 1. 連接到mysql數(shù)據(jù)庫 mysql -h127.0.0.1 -uroot -p123456 # 2. 建庫 create database maoyandb charset utf8; # 3. 切換數(shù)據(jù)庫 use maoyandb; # 4. 創(chuàng)建數(shù)據(jù)表 create table filmtab( name varchar(100), star varchar(400), time varchar(30) );
Pymysql基本使用
1) 連接數(shù)據(jù)庫
db = pymysql.connect('localhost','root','123456','maoyandb')
參數(shù)說明:
- localhost:本地 MySQL 服務(wù)端地址,也可以是遠(yuǎn)程數(shù)據(jù)庫的 IP 地址。
- root:連接數(shù)據(jù)所使用的用戶名。
- password:連接數(shù)據(jù)庫使用的密碼,本機 MySQL 服務(wù)端密碼“123456”。
- db:連接的數(shù)據(jù)庫名稱。
2) 創(chuàng)建cursor對象
cursor = db.cursor()
3) 執(zhí)行sql命令
execute() 方法用來執(zhí)行 SQL 語句。如下所示:
#第一種方法:編寫sql語句,使用占位符傳入相應(yīng)數(shù)據(jù) 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) 提交數(shù)據(jù)
db.commit()
5) 關(guān)閉數(shù)據(jù)庫
cursor.close() db.close()
完整的代碼如下所示:
# -*-coding:utf-8-*- import pymysql #創(chuàng)建對象 db = pymysql.connect('localhost','root','123456','maoyandb') cursor = db.cursor() # sql語句執(zhí)性,單行插入 info_list = ['刺殺,小說家','雷佳音,楊冪','2021-2-12'] sql = 'insert into movieinfo values(%s,%s,%s)' #列表傳參 cursor.execute(sql,info_list) db.commit() # 關(guān)閉 cursor.close() db.close()
查詢數(shù)據(jù)結(jié)果,如下所示:
mysql> select * from movieinfo;
+-------------+-------------------+-----------+
| name | star | time |
+-------------+-------------------+-----------+
| 刺殺,小說家 | 雷佳音,楊冪 | 2021-2-12 |
+-------------+-------------------+-----------+
1 rows in set (0.01 sec)
還有一種效率較高的方法,使用 executemany() 可以同時插入多條數(shù)據(jù)。示例如下:
db = pymysql.connect('localhost','root','123456','maoyandb',charset='utf8') cursor = db.cursor() # sql語句執(zhí)性,列表元組 info_list = [('我不是藥神','徐崢','2018-07-05'),('你好,李煥英','賈玲','2021-02-12')] sql = 'insert into movieinfo values(%s,%s,%s)' cursor.executemany(sql,info_list) db.commit() # 關(guān)閉 cursor.close() db.close()
查詢插入結(jié)果,如下所示:
mysql> select * from movieinfo;
+-------------+-------------------+------------+
| name | star | time |
+-------------+-------------------+------------+
| 我不是藥神 | 徐崢 | 2018-07-05 |
| 你好,李煥英 | 賈玲 | 2021-02-12 |
+-------------+-------------------+------------+
2 rows in set (0.01 sec)
修改爬蟲程序
下面修改一下爬蟲程序,將抓取下來的數(shù)據(jù)存儲到 MySQL 數(shù)據(jù)庫。如下所示:
# 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={}' #數(shù)據(jù)庫連接對象 self.db = pymysql.connect( 'localhost','root','123456','maoyandb',charset='utf8') #創(chuàng)建游標(biāo)對象 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)' # 整理數(shù)據(jù) for r in r_list: t = ( r[0].strip(), r[1].strip()[3:], r[2].strip()[5:15] ) L.append(t) print(L) # 一次性插入多條數(shù)據(jù) L:[(),(),()] try: self.cursor.executemany(sql,L) # 將數(shù)據(jù)提交數(shù)據(jù)庫 self.db.commit() except: # 發(fā)生錯誤則回滾 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)) # 斷開游標(biāo)與數(shù)據(jù)庫連接 self.cursor.close() self.db.close() if __name__ == '__main__': start=time.time() spider = MaoyanSpider() spider.run() end=time.time() print("執(zhí)行時間:%.2f" % (end-start))
數(shù)據(jù)庫查詢存儲結(jié)果,如下所示:
mysql> select * from movieinfo;
+----------------+----------------------------------------------------------+------------+
| name | star | time |
+----------------+----------------------------------------------------------+------------+
| 我不是藥神 | 徐崢,周一圍,王傳君 | 2018-07-05 |
| 肖申克的救贖 | 蒂姆·羅賓斯,摩根·弗里曼,鮑勃·岡頓 | 1994-09-10 |
| 綠皮書 | 維果·莫騰森,馬赫沙拉·阿里,琳達·卡德里尼 | 2019-03-01 |
| 海上鋼琴師 | 蒂姆·羅斯,比爾·努恩,克蘭倫斯·威廉姆斯三世 | 2019-11-15 |
| 小偷家族 | 中川雅也,安藤櫻,松岡茉優(yōu) | 2018-08-03 |
| 霸王別姬 | 張國榮,張豐毅,鞏俐 | 1993-07-26 |
| 哪吒之魔童降世 | 呂艷婷,囧森瑟夫,瀚墨 | 2019-07-26 |
| 美麗人生 | 羅伯托·貝尼尼,朱斯蒂諾·杜拉諾,賽爾喬·比尼·布斯特里克 | 2020-01-03 |
| 這個殺手不太冷 | 讓·雷諾,加里·奧德曼,娜塔莉·波特曼 | 1994-09-14 |
| 盜夢空間 | 萊昂納多·迪卡普里奧,渡邊謙,約瑟夫·高登-萊維特 | 2010-09-01 |
+----------------+----------------------------------------------------------+------------+
10 rows in set (0.01 sec)
到此這篇關(guān)于Python Pymysql實現(xiàn)數(shù)據(jù)存儲的示例的文章就介紹到這了,更多相關(guān)Pymysql 數(shù)據(jù)存儲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?+?Selenium?實現(xiàn)模擬登錄jd實例分享
這篇文章主要介紹了Python?+?Selenium?實現(xiàn)模擬登錄jd實例分享的相關(guān)資料,需要的朋友可以參考下2023-06-06Python中的函數(shù)參數(shù)(位置參數(shù)、默認(rèn)參數(shù)、可變參數(shù))
這篇文章主要介紹了Python中的函數(shù)參數(shù):位置參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù),需要的小伙伴可以參考下面文章內(nèi)容2021-09-09Python光學(xué)仿真學(xué)習(xí)衍射算法初步理解
這篇文章主要為大家介紹了Python光學(xué)仿真學(xué)習(xí)中對衍射算法的初步理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-10-10Python基礎(chǔ)之列表常見操作經(jīng)典實例詳解
這篇文章主要介紹了Python基礎(chǔ)之列表常見操作,結(jié)合實例形式詳細(xì)分析了Python列表創(chuàng)建方式、內(nèi)置函數(shù)與相關(guān)使用技巧,需要的朋友可以參考下2020-02-02python3實現(xiàn)的zip格式壓縮文件夾操作示例
這篇文章主要介紹了python3實現(xiàn)的zip格式壓縮文件夾操作,結(jié)合實例形式分析了Python3基于zipfile模塊實現(xiàn)zip格式文件壓縮的相關(guān)操作技巧,需要的朋友可以參考下2019-08-08