「Python爬蟲系列講解」六、Python 數據庫知識

本專欄是以楊秀璋老師爬蟲著作《Python網絡數據爬取及分析「從入門到精通」》爲主線、個人學習理解爲主要內容,以學習筆記形式編寫的。
本專欄不光是自己的一個學習分享,也希望能給您普及一些關於爬蟲的相關知識以及提供一些微不足道的爬蟲思路。
專欄地址:Python網絡數據爬取及分析「從入門到精通」
更多爬蟲實例詳見專欄:Python爬蟲牛刀小試

 前文回顧:
「Python爬蟲系列講解」一、網絡數據爬取概述
「Python爬蟲系列講解」二、Python知識初學 
「Python爬蟲系列講解」三、正則表達式爬蟲之牛刀小試 
「Python爬蟲系列講解」四、BeautifulSoup 技術
「Python爬蟲系列講解」五、用 BeautifulSoup 爬取電影信息


目錄

1 MySQL 數據庫

1.1 MySQL 的安裝與配置

1.2 SQL 基礎語句詳解

1.2.1 顯示數據庫

1.2.2 使用數據庫

1.2.3 創建數據庫

1.2.4 創建表

1.2.5 查看錶信息

1.2.6 刪除表

1.2.7 插入語句

1.2.8 查詢語句

1.2.9 更新語句

1.2.10 刪除語句

2 Python 操作 MySQL 數據庫

2.1 安裝 MySQL 擴展庫

2.2 程序接口 DB-API

2.2.1 模塊屬性

2.2.2 鏈接數據庫函數

2.2.3 遊標對象

2.3 Python 調用 MySQLdb 擴展庫

2.3.1 查詢數據庫名稱

2.3.2 查詢表

2.3.3 新建表

2.3.4 插入數據

3 Python 操作 SQLite 3 數據庫

4 本文小結


數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫。在數據庫管理系統中,用戶可以對數據進行新增、刪除、更新、查詢等操作,從而轉變爲用戶所需要的各種數據,並進行靈活的管理。前幾期文章介紹的 Python 網絡數據爬取所得到的語料通常採用 TXT 文本、Excel 或 CSV 格式進行存儲,而本文將重點介紹 MySQL 數據庫相關知識及 Python 操作 MySQL 的方法,介紹如何將爬取的數據存儲到數據庫中,從而更方便地進行數據分析和數據統計。

1 MySQL 數據庫

數據庫技術是信息管理系統、自動化啊辦公系統、銷售統計系統等各種信息系統的核心部分,是進行科學研究和決策管理的重要技術手段。常用的數據庫包括 Oracle、DB2、MySQL、Server、Sybase、VF 等。其中,MySQL 數據庫具有性能優良、穩定性好、配置簡單以及支持各種操作系統等優點。

1.1 MySQL 的安裝與配置

關於 MySQL 的安裝和配置可參考博文:https://www.cnblogs.com/2020javamianshibaodian/p/mysql8020anzhuangjiaocheng.html

這裏就不展開敘述了。

1.2 SQL 基礎語句詳解

數據庫中最重要的就是 SQL Structure Query Language 語句,它是結構化查詢語言,是使用關係模型的數據庫應用語言。

SQL 語句主要劃分爲 3 類,如下:

DDL(Data Definition Language)語句:數據庫定義語言。該語句定義不同的數據字段、數據庫、數據表、列、索引等數據庫對象。常用的語句關鍵字包括 create、drop、alter 等。

DML(Data Manioulation Language)語句:數據庫操作語句。該語句用於插入、刪除、更新和查詢數據庫的記錄,是數據庫操作中最常用的語句,並能檢查數據的完整性。常用的語句關鍵字包括 insert、delete、update 和 select。

DCL(Data Control Language)語句:數據控制語句。該語句用於控制不同數據字段的許可和訪問級別,定義數據庫、表、字段、用戶權限和安全級別。常用的語句關鍵字包括 grant、revoke 等。

1.2.1 顯示數據庫

show databases

:如果某個數據庫已經存在,則可以使用 use 語句直接使用;如果數據庫不存在,則需要使用 create 語句創建數據庫。

 

1.2.2 使用數據庫

如果想直接使用已經存在的數據庫 bookmanage,則直接使用如下語句:

use bookmanage

1.2.3 創建數據庫

如果想創建新的數據庫,則使用 create 關鍵字創建。

create database course

1.2.4 創建表

這裏假設要創建 books 圖書表,該表包括圖書編號 bookid、圖書名稱 bookname、價格 price 和 圖書日期 bookdate 字段。

create table books(bookid int primary key,
bookname varchar(20),
price float,
bookdate date
)

其中,創建的表名稱爲 books;圖書編號爲 int 類型,同時主鍵(primary key),用於唯一標識表的字段;圖書名稱爲 varchar 類型,長度爲 20;價格爲 float 類型;圖書日期爲 date 類型。

1.2.5 查看錶信息

如果想查看當前數據庫中存在多少張表,則使用 show 關鍵字。

show tables

由上述代碼可知,當前僅存在一張表 books。如果想查看該表的定義,則使用 desc 關鍵字。

desc books

1.2.6 刪除表

如果想要刪除表 books,則使用 drop 關鍵字。

drop table books

1.2.7 插入語句

數據庫和表創建成功之後,需要向表中插入數據,使用的關鍵字是 insert。

比如像表 books 中插入信息,代碼如下:

insert into books(bookid, bookname, price, bookdate) values ('1', '人工智能導論', '88', '2020-07-02')

使用 select 查詢語句顯示結果:

select * from books

 

在執行 insert 語句的過程中,如果省略所有字段,則只需要 values 值一一對應即可。

insert into books
value('2', '軟件工程導論', '77.7', '2020-07-02')

 

同樣,如果指向插入某幾個字段的數據,則只需要 values 值對應一致即可,比如:

insert into books(bookid, bookname)
value('3', 'Python程序設計語言')

 

1.2.8 查詢語句

查詢語句基本語法格式如下:

select 字段 from 表名 [where 條件]

該語句用於查詢指定字段的數據,當字段爲 “ * ” 符號時,它用於查詢表中的所有指令;where 緊跟查詢條件,該參數可以省略。

如果全部顯示 books 表中的所有字段和數據

select * from books

 

如果想顯示需要的字段,則可以用逗號分隔

select bookid,bookname,price from books

如果需要增加查詢條件,則使用 where 語句。比如查詢編號大於 1 且價格非空的書

select bookid,bookname,price,bookdate from books where bookid>1;
select bookid,bookname,price,bookdate from books where price is not null;

 

1.2.9 更新語句

更新語句使用 update 關鍵字。

例如將《人工智能導論》更新爲《網絡數據爬取及分析》

update books set bookname= '網絡數據爬取及分析' where bookid='1';

更新語句執行之前: 

更新語句執行之後: 

 

1.2.10 刪除語句

刪除語句使用 delete 關鍵字。

例如將日期爲空的數據刪除,具體代碼如下:

delete from books where bookdate is null;

刪除語句執行前: 

刪除語句執行後: 

 

值得注意的是, MySql 執行 DELETE 或 UPDATE 命令時,報 Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. 錯誤,這是因爲 MySql 運行在 safe-updates模式下,該模式會導致非主鍵條件下無法執行update或者delete命令,執行命令如下命令:

SET SQL_SAFE_UPDATES = 0;

修改下數據庫模式,然後就可以繼續執行 DELETE/UPDATE 了
如果想改會 safe-updates模式,執行如下命令即可

SET SQL_SAFE_UPDATES = 1;

(報錯解決辦法來源:參考博文地址:https://blog.csdn.net/m2606707610/article/details/86531526

2 Python 操作 MySQL 數據庫

Python 訪問數據庫需要對應的接口程序,接口程序可以理解爲 Python 的一個模塊,它提供了數據庫客戶端的接口供您訪問。

2.1 安裝 MySQL 擴展庫

pip install mysql

2.2 程序接口 DB-API

Python 接口程序一定要遵守 Python DB-API 規範。DB-API 定義了一系列必須的操作對象和數據庫存取方式,以便爲各種各樣的底層數據庫系統和不同的數據庫接口提供一致的訪問接口。由於 DB-API 爲不同的數據庫提供一致的訪問接口,這使其在不同的數據庫之間移植代碼成爲一輕鬆的事情。

2.2.1 模塊屬性

DB-API 模塊的定義如下表所示

DB-API 模塊
模塊 含義
apilevel 模塊兼容的 DB-API 版本號
threadsafety 線程安全級別
paramstyle 支持 SQL 語句參數風格
connect 鏈接數據庫函數

Python 調用 MySQL 需要導入 MySQLLdb 庫,代碼爲“import MySQLdb”。

2.2.2 鏈接數據庫函數

鏈接數據庫的函數是 connect() 函數,其生成一個 connect 對象,用於訪問數據庫。

connect() 函數的參數
參數 英文含義 中文解釋
user Username 數據庫用戶名
password Password 數據庫登錄密碼
host Hostname 數據庫主機名
database DatabaseName 數據庫名
port Port 數據庫端口號,默認3306
dsn Data source name 數據源名稱

下面代碼顯示的是 Python 導入 MySQLdb 擴展庫,並調用 connect() 函數鏈接數據庫 :

import MySQLdb
conn = MySQLdb.connect(host='localhost', db='MySQL', user='root', passwd='123456', port=3306, charset='utf8')
connect 對象的常用方法
方法 含義
close() 關閉數據庫鏈接,或者關閉遊標對象
commit() 提交當前事務
rollback() 取消當前事務,數據庫中常稱爲回滾操作
cursor() 創建遊標或類遊標對象
errorhandler(cxn,errcls,errval) 作爲已給遊標的句柄

 注:事務是指作爲單個邏輯工作單元執行的一系列操作,要麼完全執行,要麼完全不執行,從而保證數據的完整性和安全性。

2.2.3 遊標對象

由上述內容可知,connect() 方法用於提供連接數據庫的接口,但是如果要對數據庫操作還需要使用遊標對象。

數據庫遊標對象的屬性和方法
方法 含義
fetchone() 取出 (fetch) 一個 (one) 值,即獲取結果集的一行數據
fetchmany(size) 取出 (fetch) 多個 (many) 值,這裏的參數 size 是界限,得到結果集的下幾行
fetchall() 取出 (fetch) 所有 (all) 值
execute(sql) 執行數據庫操作,參數爲 SQL 語句
close() 關閉遊標。當不需要遊標時,儘可能地關閉它

2.3 Python 調用 MySQLdb 擴展庫

前面創建了數據庫 bookmanage 和表 books,用於記錄圖書管理系統中的書籍信息,這一節介紹如何通過 Python 來顯示。

2.3.1 查詢數據庫名稱

查看本地數據庫中所包含的數據庫名稱需使用“show database”語句。

import MySQLdb
try:
    # 訪問用戶 root 的本地 MySQL 數據庫
    conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', port=3306)
    cur = conn.cursor()
    # 執行顯示所有數據庫名稱的語句
    res = cur.execute('show databases')
    print(res)
    # 返回結果循環獲取
    for data in cur.fetchall():
        print('%s' % data)
    cur.close()
    conn.close()
except MySQLdb.Error as e:
    print('MySQL Error %d: %s' % (e.args[0], e.args[1]))

如果本地數據庫已經存在,而用戶卻忘記其數據庫的名稱,則銀狐可以通過該方法查詢本地 MySQL 中把傲寒的所有數據庫,然後再鏈接該數據庫進行相關的操作。 

2.3.2 查詢表

這裏需要查詢 bookmanage 數據庫中表 books 的內容,代碼如下:

import MySQLdb
try:
    # 連接數據庫
    conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', port=3306, db='bookmanage', charset='utf8')
    # cursor()函數定義遊標
    cur = conn.cursor()
    res = cur.execute('select * from books')   # 執行查詢操作
    print('表中含', res, '條數據\n')
    # 獲取所有數據
    for data in cur.fetchall():
        print('%s %s %s %s' % data)
    cur.close()
    conn.close()
except MySQLdb.Error as e:
    print('MySQL Error %d: %s' % (e.args[0], e.args[1]))

我們發現,輸出結果與 MySQL 中的結果是一致的。

2.3.3 新建表

下面創建一張學生表,主要是調用 commit() 函數提交數據,執行 create table 語句,代碼如下:

import MySQLdb
try:
    conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', port=3306, db='bookmanage', charset='utf8')
    cur = conn.cursor()
    sql = "create table students(id int not null primary key auto_increment," \
                               "name char(30) not null," \
                               "sex char(20) not null)"
    cur.execute(sql)
    # 查看錶
    print('插入後包含表:')
    cur.execute('show tables')
    for data in cur.fetchall():
        print('%s' % data)
    cur.close()
    conn.commit()
    conn.close()
except MySQLdb.Error as e:
    print('MySQL Error %d: %s' % (e.args[0], e.args[1]))

2.3.4 插入數據

插入數據也是先定義好 SQL 語句,然後調用 execute() 函數來實現。

通常插入的新數據需要通過扮靚進行賦值,其值不是固定的。

import MySQLdb
try:
    conn = MySQLdb.connect(host='localhost', user='root', passwd='123456', port=3306, db='bookmanage', charset='utf8')
    cur = conn.cursor()
    sql = "insert into students values(%s, %s, %s)"
    cur.execute(sql, ('3', 'zzr', '男'))
    # 查看錶
    print('插入數據:')
    cur.execute('select * from students')
    for data in cur.fetchall():
        print('%s %s %s' % data)
    cur.close()
    conn.commit()
    conn.close()
except MySQLdb.Error as e:
    print('MySQL Error %d: %s' % (e.args[0], e.args[1]))

3 Python 操作 SQLite 3 數據庫

SQLite 是一款輕型數據庫,是一種遵守事務 ACID 性質的關係型數據庫管理系統,它佔用的資源非常低,能都支持 Windows/Linux/Unix 等主流操作系統,同時能夠與很多程序語言如 C3、PHP、Java、Python 等結合使用。

SQLite 3 借適用 SQLite 3 模塊與 Python 進行集成。SQLite 3 模塊提供了一個與 DB-API 2.0 規範兼容的 SQL 接口。用戶可以直接使用 SQLite 3 模塊,因爲 Python 2.5.x 以上版本都默認自帶模塊。

SQLite 3 的使用方法與前文介紹的 MySQLLdb 庫類似,首先必須創建一個表示數據庫的連接對象,然後有選擇地創建光標對象,再定義 SQL 語句執行,最後關閉對象和連接。

SQLite 3 的常用方法
模塊 含義
sqlite.connect(...) 打開一個到 SQLite 數據庫文件 database 的連接
connection.cursor() 創建一個 curor,將在 Python 數據庫編程中用到
cursor.execute(sql) 執行一個 SQL 語句,注意SQL 語句可以被參數化
cursor.executescript(sql) 一旦接收到腳本,就會執行多個 SQL 語句。SQL語句應用分號分隔
connection.commit() 提交當前的事務
connection.rollback() 回滾至上一次調用 commit() 對數據庫所做的更改
connection.close() 關閉數據庫連接
cursor.fetchone() 獲取查詢結果集中的下一行,返回一個單一的序列,當沒有更多可用的數據時返回 None
cursor.fetchmany() 獲取查詢結果集中的下一行組數據,返回一個列表
cursor.fetchall() 獲取查詢結果集中所有的數據行,返回一個列表

下面介紹的是 Python 操作 SQLite 3 的基礎用法(與 MySQLdb 類似),主要內容包括:

  1. 在本地創建一個 test.db 的數據庫文件。
  2. 執行遊標中的 execute() 函數,創建表 PEOPLE,包括的字段有序號、姓名、年齡、公司和薪水,字段涉及各種數據類型。
  3. 執行插入數據操作,注意需要調用 conn.commit() 函數。
  4. 執行查詢操作,SQL 語句爲“"SELECT id, name, age, company, salary from PEOPLE"”,然後通過 for 循環獲取查詢結果,顯示“小楊”、“小顏”、“小紅”的信息。
  5. 執行更新操作並查詢數據結果,將序號爲“2”的公司信息更改爲“華爲”。
  6. 執行刪除操作,刪除公司名稱爲“華爲”的數據,最後剩下小紅的信息。
import sqlite3

# 連接數據庫,如果數據庫不存在則創建
conn = sqlite3.connect('test.db')
cur = conn.cursor()
print('數據庫創建成功\n')

# 創建表 PEOPLE(序號、姓名、年齡、公司、薪水)
cur.execute('create table people'
            '(id int primary key not null,'
            'name text not null,'
            'age int not null,'
            'company char(50),'
            'salary real);')
print('prople 表創建成功!\n')
conn.commit()

# 插入數據
cur.execute('insert into people(id, name, age, company, salary) '
            'values(1, "小楊",26, "華爲", 10000.00)');
cur.execute('insert into people(id, name, age, company, salary) '
            'values(2, "小顏",26, "百度", 8800.00)');
cur.execute('insert into people(id, name, age, company, salary) '
            'values(3, "小紅",28, "騰訊", 98000.00)');
conn.commit()
print('插入數據成功!\n')

# 查詢操作
cursor = cur.execute('select id, name, age, company, salary from people')
print('數據查詢成功!')
print('序號', '姓名', '年齡', '公司', '薪水')
for row in cursor:
    print(row[0], row[1], row[2], row[3], row[4])
print('')

# 更新操作
cur.execute('update people set company="華爲" where id=2')
conn.commit()
print('數據更新成功!')
cursor = cur.execute('select id, name, company from people')
for row in cursor:
    print(row[0], row[1], row[2])
print('')

# 刪除操作
cur.execute('delete from people where company="華爲";')
conn.commit()
print('數據刪除成功!')
cursor = cur.execute('select id, name, company from people')
for row in cursor:
    print(row[0], row[1], row[2])
print('')

# 關閉連接
conn.close()

4 本文小結

數據庫是按照數據結構來組織、存儲和管理數據的倉庫。用戶可以通過數據庫來存儲和管理所需的數據,包括簡單的數據表格、海量數據等。數據庫被廣泛應用於各行各業,比如信息管理系統、辦公自動化系統、各種雲信息平臺等。本文爲什麼要介紹 Python 操作數據庫知識呢?一方面,數據爬取、數據存儲、數據分析、數據可視化是密不可分的 4 部分,當爬取了相關數據後,需要將其存儲至數據庫中,這能夠更加標準化、智能化、自動化、便捷地管理數據,也爲後續的數據分析提供強大的技術支持,能夠自定義提取所需數據塊進行分析;另一方面,數據庫爲實現數據共享、實現數據集中控制、保證數據的一致性和可維護性提供保障,所以,學習 Python 操作數據庫是非常必要的。


歡迎留言,一起學習交流~

感謝閱讀

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章