このコラムは、YangXiuzhangのクローラーブック「PythonWebData Crawling and Analysis "From Beginner to Proficiency"」をメインラインとして、個人的な学習と理解をメインコンテンツとして、スタディノートの形式で記述したものに基づいています。
このコラムは、私自身の研究と共有であるだけでなく、クローラーに関する知識を広め、クローラーの簡単なアイデアを提供したいと考えています。
列アドレス:Python Webデータのクロールと分析「エントリから習熟まで」
クローラーのその他の例については、列:Pythonクローラースレッジハンマーテストを参照してください。
前回の記事レビュー:
「Pythonクローラーシリーズの説明」1.ネットワークデータクロールの概要
「Pythonクローラーシリーズの説明」2.Python知識の初心者
「Pythonクローラーシリーズの説明」3.正規式クローラーの強力なテスト
「Pythonクローラーシリーズの説明」4.BeautifulSoup Technical
「Pythonクローラーシリーズの説明」5.BeautifulSoupを使用して映画情報をクロールします
目次
データベースは、データ構造に従ってデータを整理、保存、管理するウェアハウスです。データベース管理システムでは、ユーザーはデータの追加、削除、更新、クエリなどの操作を実行できるため、ユーザーが必要とするさまざまなデータに変換し、柔軟な管理を行うことができます。以前の記事で紹介したPythonWebデータクロールのコーパスは、通常、TXTテキスト、Excel、またはCSV形式で保存されます。この記事では、MySQLデータベースの知識とPythonがMySQLを操作する方法、および保存されているデータを取得する方法に焦点を当てます。データベース、データ分析とデータ統計がより便利になるように。
1MySQLデータベース
データベース技術は、情報管理システム、自動化されたオフィスシステム、販売統計システムなどのさまざまな情報システムの中核部分であり、科学的研究および意思決定管理のための重要な技術的手段です。一般的に使用されるデータベースには、Oracle、DB2、MySQL、Server、Sybase、VFなどがあります。その中でも、MySQLデータベースには、優れたパフォーマンス、優れた安定性、単純な構成、およびさまざまなオペレーティングシステムのサポートという利点があります。
1.1MySQLのインストールと構成
MySQLのインストールと構成については、ブログ投稿を参照してください:https://www.cnblogs.com/2020javamianshibaodian/p/mysql8020anzhuangjiaocheng.html
物語はここでは展開されていません。
1.2基本的なSQLステートメントの詳細な説明
データベースで最も重要なのは、SQL構造クエリ言語ステートメントです。これは、構造化クエリ言語であり、リレーショナルモデルを使用するデータベースアプリケーション言語です。
SQLステートメントは、主に次の3つのカテゴリに分類されます。
DDL(データ定義言語)ステートメント:データベース定義言語。このステートメントは、さまざまなデータフィールド、データベース、データテーブル、列、インデックスなどのデータベースオブジェクトを定義します。一般的に使用される文のキーワードには、create、drop、alterなどがあります。
DML(データ操作言語)ステートメント:データベース操作ステートメント。このステートメントは、データベースレコードの挿入、削除、更新、およびクエリに使用されます。これは、データベース操作で最も一般的に使用されるステートメントであり、データの整合性をチェックできます。一般的に使用されるステートメントキーワードには、挿入、削除、更新、および選択が含まれます。
DCL(データ制御言語)ステートメント:データ制御ステートメント。このステートメントは、さまざまなデータフィールドのアクセス許可とアクセスレベルを制御し、データベース、テーブル、フィールド、ユーザーアクセス許可、およびセキュリティレベルを定義するために使用されます。一般的に使用される文のキーワードには、付与、取り消しなどがあります。
1.2.1データベースの表示
show databases
注:データベースがすでに存在する場合は、useステートメントを直接使用できます。データベースが存在しない場合は、createステートメントを使用してデータベースを作成する必要があります。
1.2.2データベースの使用
既存のデータベースブック管理を直接使用する場合は、次のステートメントを直接使用します。
use bookmanage
1.2.3データベースを作成する
新しいデータベースを作成する場合は、createキーワードを使用してデータベースを作成します。
create database course
1.2.4テーブルの作成
ここで、本番号bookid、本名bookname、価格価格、および本の日付bookdateフィールドを含む本の本テーブルを作成するとします。
create table books(bookid int primary key,
bookname varchar(20),
price float,
bookdate date
)
その中で、作成されたテーブルの名前は本です。本の番号はint型で、主キーはテーブルのフィールドを一意に識別するために使用されます。本の名前はvarchar型で、長さは20です。価格はfloatタイプで、本の日付はdateタイプです。
1.2.5テーブル情報の表示
現在のデータベースに存在するテーブルの数を確認する場合は、showキーワードを使用します。
show tables
上記のコードによると、現在、テーブルブックは1つしかありません。テーブルの定義を表示する場合は、descキーワードを使用します。
desc books
1.2.6テーブルの削除
テーブルブックを削除する場合は、dropキーワードを使用します。
drop table books
1.2.7挿入ステートメント
データベースとテーブルが正常に作成されたら、テーブルにデータを挿入する必要があります。使用されるキーワードはinsertです。
たとえば、テーブルブックに情報を挿入すると、コードは次のようになります。
insert into books(bookid, bookname, price, bookdate) values ('1', '人工智能导论', '88', '2020-07-02')
選択クエリを使用して結果を表示します。
select * from books
挿入ステートメントを実行するプロセスで、すべてのフィールドが省略されている場合は、値に1対1で対応するだけで済みます。
insert into books
value('2', '软件工程导论', '77.7', '2020-07-02')
同様に、特定のフィールドに挿入されたデータをポイントする場合、次のように同じ方法で値に対応する必要があるだけです:
insert into books(bookid, bookname)
value('3', 'Python程序设计语言')
1.2.8クエリステートメント
クエリステートメントの基本的な構文形式は次のとおりです。
select 字段 from 表名 [where 条件]
このステートメントは、指定されたフィールドのデータを照会するために使用されます。フィールドが「*」記号の場合、テーブル内のすべての命令を照会するために使用されます。照会条件の直後の場合、このパラメーターは省略できます。
書籍テーブルのすべてのフィールドとデータが表示されている場合
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キーワードを使用します。
たとえば、「人工知能の概要」を「ネットワークデータのクロールと分析」に更新します。
update books set bookname= '网络数据爬取及分析' where bookid='1';
updateステートメントが実行される前:
updateステートメントが実行された後:
1.2.10ステートメントの削除
deleteステートメントはdeleteキーワードを使用します。
たとえば、日付が空白のデータを削除する場合、具体的なコードは次のとおりです。
delete from books where bookdate is null;
削除ステートメントが実行される前:
削除ステートメントが実行された後:
MySqlがDELETEまたはUPDATEコマンドを実行すると、エラーコード:1175が報告されることに注意してください。セーフアップデートモードを使用していて、KEY列を使用するWHEREなしでテーブルをアップデートしようとしました。セーフモードを無効にするには、のオプションを切り替えます。環境設定-> SQLエディターと再接続エラー、これはMySqlがセーフアップデートモードで実行されているためです。これにより、プライマリキー以外の条件下で更新または削除コマンドを実行できなくなります。次のコマンドを実行してください。
SET SQL_SAFE_UPDATES = 0;
データベースモードを変更すると、引き続きDELETE / UPDATEを実行でき
ます。セーフアップデートモードに変更する場合は、次のコマンドを実行します。SET SQL_SAFE_UPDATES = 1;
(エラー解決のソース:ブログ投稿アドレスを参照してください:https://blog.csdn.net/m2606707610/article/details/86531526)
2PythonオペレーティングMySQLデータベース
データベースへのPythonアクセスには、対応するインターフェイスプログラムが必要です。これは、Pythonのモジュールとして理解でき、データベースクライアントがアクセスするためのインターフェイスを提供します。
2.1MySQL拡張ライブラリをインストールする
pip install mysql
2.2プログラムインターフェースDB-API
Pythonインターフェースプログラムは、PythonDB-API仕様に準拠している必要があります。DB-APIは、基盤となるさまざまなデータベースシステムおよびさまざまなデータベースインターフェイスに一貫したアクセスインターフェイスを提供するために、一連の必要な操作オブジェクトとデータベースアクセスメソッドを定義します。DB-APIは、さまざまなデータベースに一貫したアクセスインターフェイスを提供するため、さまざまなデータベース間でコードを簡単に移植できます。
2.2.1モジュールのプロパティ
DB-APIモジュールの定義を次の表に示します。
モジュール | 意味 |
apilevel | モジュール互換のDB-APIバージョン番号 |
スレッドセーフ | スレッドセーフレベル |
paramstyle | SQLステートメントのパラメータースタイルをサポートする |
接続する | リンクデータベース機能 |
PythonはMySQLがMySQLLdbライブラリをインポートする必要があると呼び出します。コードは「importMySQLdb」です。
2.2.2データベース機能のリンク
データベースに接続する関数はconnect()関数であり、データベースにアクセスするための接続オブジェクトを生成します。
パラメータ | 英語の意味 | 中国語の説明 |
ユーザー | ユーザー名 | データベースのユーザー名 |
パスワード | パスワード | データベースログインパスワード |
ホスト | ホスト名 | データベースのホスト名 |
データベース | データベース名 | データベース名 |
ポート | ポート | データベースポート番号、デフォルトは3306 |
dsn | データソース名 | データソース名 |
次のコードは、PythonがMySQLdb拡張ライブラリをインポートし、connect()関数を呼び出してデータベースをリンクすることを示しています。
import MySQLdb
conn = MySQLdb.connect(host='localhost', db='MySQL', user='root', passwd='123456', port=3306, charset='utf8')
方法 | 意味 |
閉じる() | データベースリンクを閉じるか、カーソルオブジェクトを閉じます |
コミット() | 現在のトランザクションをコミットします |
rollback() | 現在のトランザクションをキャンセルします。これは、データベースでロールバック操作と呼ばれることがよくあります。 |
カーソル() | カーソルまたはカーソルのようなオブジェクトを作成します |
errorhandler(cxn、errcls、errval) | カーソルへのハンドルとして |
注:トランザクションとは、完全に実行されるか、まったく実行されないかのいずれかで、単一の論理作業単位として実行される一連の操作を指します。これにより、データの整合性とセキュリティが確保されます。
2.2.3カーソルオブジェクト
上記の内容から、connect()メソッドを使用してデータベースに接続するためのインターフェイスを提供しますが、データベースを操作する場合は、カーソルオブジェクトを使用する必要があります。
方法 | 意味 |
fetchone() | (1つの)値をフェッチします。つまり、結果セット内のデータの行を取得します。 |
fetchmany(サイズ) | パラメータサイズが制限である複数の(多くの)値を取り出し(フェッチ)し、結果セットの次の数行を取得します |
fetchall() | すべての(すべての)値を取得する |
execute(sql) | データベース操作を実行します。パラメーターはSQLステートメントです。 |
閉じる() | カーソルを閉じます。カーソルが不要な場合は、できるだけ閉じてください。 |
2.3PythonがMySQLdb拡張ライブラリを呼び出す
データベースbookmanageとtablebookは、本の情報を本の管理システムに記録するために以前に作成されました。このセクションでは、Pythonを介してそれを表示する方法を紹介します。
2.3.1データベース名のクエリ
ローカルデータベースに含まれているデータベース名を表示するには、「showdatabase」ステートメントを使用します。
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]))
ローカルデータベースがすでに存在しているが、ユーザーがデータベースの名前を忘れた場合、Silver Foxはこのメソッドを使用して、ローカルMySQL内のAohanのすべてのデータベースにクエリを実行し、データベースをリンクして関連する操作を実行できます。
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()関数を呼び出してデータを送信し、createtableステートメントを実行するstudentテーブルを作成します。コードは次のとおりです。
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]))
3PythonオペレーティングSQLite3データベース
SQLiteは軽量データベースであり、トランザクションのACIDの性質に従うリレーショナルデータベース管理システムです。占有するリソースは非常に少なく、Windows / Linux / Unixなどの主流のオペレーティングシステムをサポートできます。また、そのような多くのプログラミング言語と対話することもできます。 C3として、PHP、Java、Pythonなどを組み合わせます。
SQLite 3は、SQLite3モジュールを適用することでPythonと統合されます。SQLite 3モジュールは、DB-API2.0仕様と互換性のあるSQLインターフェイスを提供します。Python 2.5.x以降にはデフォルトで独自のモジュールがあるため、ユーザーはSQLite3モジュールを直接使用できます。
SQLite 3の使用法は、前の記事で紹介したMySQLLdbライブラリと似ています。最初に、データベースを表す接続オブジェクトを作成し、次にカーソルオブジェクトを選択的に作成し、次にSQLステートメントの実行を定義し、最後にオブジェクトを閉じて、接続。
モジュール | 意味 |
sqlite.connect(...) | SQLiteデータベースファイルデータベースへの接続を開きます |
connection.cursor() | 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 类似),主要内容包括:
- 在本地创建一个 test.db 的数据库文件。
- 执行游标中的 execute() 函数,创建表 PEOPLE,包括的字段有序号、姓名、年龄、公司和薪水,字段涉及各种数据类型。
- 执行插入数据操作,注意需要调用 conn.commit() 函数。
- 执行查询操作,SQL 语句为“"SELECT id, name, age, company, salary from PEOPLE"”,然后通过 for 循环获取查询结果,显示“小杨”、“小颜”、“小红”的信息。
- 执行更新操作并查询数据结果,将序号为“2”的公司信息更改为“华为”。
- 执行删除操作,删除公司名称为“华为”的数据,最后剩下小红的信息。
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 操作数据库是非常必要的。
欢迎留言,一起学习交流~
感谢阅读