Python Pymysql實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的示例
Python 連接并操作 MySQL 數(shù)據(jù)庫(kù),主要通過(guò) Pymysql 模塊實(shí)現(xiàn)。這里講解如何將抓取的數(shù)據(jù)存儲(chǔ)至 MySQL 數(shù)據(jù)庫(kù)。
創(chuàng)建存儲(chǔ)數(shù)據(jù)表
首先您應(yīng)該確定您的計(jì)算機(jī)上已經(jīng)安裝了 MySQL 數(shù)據(jù)庫(kù),然后再進(jìn)行如下操作:
# 1. 連接到mysql數(shù)據(jù)庫(kù) mysql -h127.0.0.1 -uroot -p123456 # 2. 建庫(kù) create database maoyandb charset utf8; # 3. 切換數(shù)據(jù)庫(kù) use maoyandb; # 4. 創(chuàng)建數(shù)據(jù)表 create table filmtab( name varchar(100), star varchar(400), time varchar(30) );
Pymysql基本使用
1) 連接數(shù)據(jù)庫(kù)
db = pymysql.connect('localhost','root','123456','maoyandb')
參數(shù)說(shuō)明:
- localhost:本地 MySQL 服務(wù)端地址,也可以是遠(yuǎn)程數(shù)據(jù)庫(kù)的 IP 地址。
- root:連接數(shù)據(jù)所使用的用戶名。
- password:連接數(shù)據(jù)庫(kù)使用的密碼,本機(jī) MySQL 服務(wù)端密碼“123456”。
- db:連接的數(shù)據(jù)庫(kù)名稱。
2) 創(chuàng)建cursor對(duì)象
cursor = db.cursor()
3) 執(zhí)行sql命令
execute() 方法用來(lái)執(zhí)行 SQL 語(yǔ)句。如下所示:
#第一種方法:編寫(xiě)sql語(yǔ)句,使用占位符傳入相應(yīng)數(shù)據(jù)
sql = "insert into filmtab values('%s','%s','%s')" % ('刺殺,小說(shuō)家','雷佳音','2021')
cursor.excute(sql)
第二種方法:編寫(xiě)sql語(yǔ)句,使用列表傳參方式
sql = 'insert into filmtab values(%s,%s,%s)'
cursor.execute(sql,['刺殺,小說(shuō)家','雷佳音','2021'])
4) 提交數(shù)據(jù)
db.commit()
5) 關(guān)閉數(shù)據(jù)庫(kù)
cursor.close() db.close()
完整的代碼如下所示:
# -*-coding:utf-8-*-
import pymysql
#創(chuàng)建對(duì)象
db = pymysql.connect('localhost','root','123456','maoyandb')
cursor = db.cursor()
# sql語(yǔ)句執(zhí)性,單行插入
info_list = ['刺殺,小說(shuō)家','雷佳音,楊冪','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 |
+-------------+-------------------+-----------+
| 刺殺,小說(shuō)家 | 雷佳音,楊冪 | 2021-2-12 |
+-------------+-------------------+-----------+
1 rows in set (0.01 sec)
還有一種效率較高的方法,使用 executemany() 可以同時(shí)插入多條數(shù)據(jù)。示例如下:
db = pymysql.connect('localhost','root','123456','maoyandb',charset='utf8')
cursor = db.cursor()
# sql語(yǔ)句執(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)
修改爬蟲(chóng)程序
下面修改一下爬蟲(chóng)程序,將抓取下來(lái)的數(shù)據(jù)存儲(chǔ)到 MySQL 數(shù)據(jù)庫(kù)。如下所示:
# 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):
#初始化屬性對(duì)象
self.url = 'https://maoyan.com/board/4?offset={}'
#數(shù)據(jù)庫(kù)連接對(duì)象
self.db = pymysql.connect(
'localhost','root','123456','maoyandb',charset='utf8')
#創(chuàng)建游標(biāo)對(duì)象
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ù)庫(kù)
self.db.commit()
except:
# 發(fā)生錯(cuò)誤則回滾
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))
# 斷開(kāi)游標(biāo)與數(shù)據(jù)庫(kù)連接
self.cursor.close()
self.db.close()
if __name__ == '__main__':
start=time.time()
spider = MaoyanSpider()
spider.run()
end=time.time()
print("執(zhí)行時(shí)間:%.2f" % (end-start))數(shù)據(jù)庫(kù)查詢存儲(chǔ)結(jié)果,如下所示:
mysql> select * from movieinfo;
+----------------+----------------------------------------------------------+------------+
| name | star | time |
+----------------+----------------------------------------------------------+------------+
| 我不是藥神 | 徐崢,周一圍,王傳君 | 2018-07-05 |
| 肖申克的救贖 | 蒂姆·羅賓斯,摩根·弗里曼,鮑勃·岡頓 | 1994-09-10 |
| 綠皮書(shū) | 維果·莫騰森,馬赫沙拉·阿里,琳達(dá)·卡德里尼 | 2019-03-01 |
| 海上鋼琴師 | 蒂姆·羅斯,比爾·努恩,克蘭倫斯·威廉姆斯三世 | 2019-11-15 |
| 小偷家族 | 中川雅也,安藤櫻,松岡茉優(yōu) | 2018-08-03 |
| 霸王別姬 | 張國(guó)榮,張豐毅,鞏俐 | 1993-07-26 |
| 哪吒之魔童降世 | 呂艷婷,囧森瑟夫,瀚墨 | 2019-07-26 |
| 美麗人生 | 羅伯托·貝尼尼,朱斯蒂諾·杜拉諾,賽爾喬·比尼·布斯特里克 | 2020-01-03 |
| 這個(gè)殺手不太冷 | 讓·雷諾,加里·奧德曼,娜塔莉·波特曼 | 1994-09-14 |
| 盜夢(mèng)空間 | 萊昂納多·迪卡普里奧,渡邊謙,約瑟夫·高登-萊維特 | 2010-09-01 |
+----------------+----------------------------------------------------------+------------+
10 rows in set (0.01 sec)
到此這篇關(guān)于Python Pymysql實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的示例的文章就介紹到這了,更多相關(guān)Pymysql 數(shù)據(jù)存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python字符串格式化f-string多種功能實(shí)現(xiàn)
這篇文章主要介紹了Python字符串格式化f-string格式多種功能實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Python使用socket的UDP協(xié)議實(shí)現(xiàn)FTP文件服務(wù)功能
這篇文章主要介紹了Python使用socket的UDP協(xié)議實(shí)現(xiàn)FTP文件服務(wù),本示例主要是用Python的socket,使用UDP協(xié)議實(shí)現(xiàn)一個(gè)FTP服務(wù)端、FTP客戶端,用來(lái)實(shí)現(xiàn)文件的傳輸,需要的朋友可以參考下2023-10-10
Python實(shí)現(xiàn)將HTML轉(zhuǎn)為PDF/圖片/XML/XPS格式
網(wǎng)頁(yè)內(nèi)容是信息傳播的主要形式之一,這篇文章主要和大家介紹了如何使用Python實(shí)現(xiàn)將HTML分別轉(zhuǎn)為PDF/圖片/XML/XPS格式等,需要的可以參考下2024-03-03
使用Python對(duì)接OpenAi?API實(shí)現(xiàn)智能QQ機(jī)器人的方法
這篇文章主要介紹了使用Python對(duì)接OpenAi?API實(shí)現(xiàn)智能QQ機(jī)器人的方法,主要是提供一個(gè)方法思路,可以根據(jù)實(shí)現(xiàn)代碼延申出更多的解決方法,需要的朋友可以參考下2023-03-03
Python數(shù)據(jù)挖掘中常用的五種AutoEDA 工具總結(jié)
大家好,我們都知道在數(shù)據(jù)挖掘的過(guò)程中,數(shù)據(jù)探索性分析一直是非常耗時(shí)的一個(gè)環(huán)節(jié),但也是繞不開(kāi)的一個(gè)環(huán)節(jié),本篇文章帶你盤(pán)點(diǎn)數(shù)據(jù)挖掘中常見(jiàn)的5種 AutoEDA 工具2021-11-11
使用django的objects.filter()方法匹配多個(gè)關(guān)鍵字的方法
今天小編就為大家分享一篇使用django的objects.filter()方法匹配多個(gè)關(guān)鍵字的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
Tensorflow模型實(shí)現(xiàn)預(yù)測(cè)或識(shí)別單張圖片
這篇文章主要為大家詳細(xì)介紹了Tensorflow模型實(shí)現(xiàn)預(yù)測(cè)或識(shí)別單張圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07

