リオラボ
icon

PythonスクレイピングしたデータをMySQLデータベースにインポートする方法を解説

この記事ではPythonでスクレイピングしたデータをMySQLデータベースにインポートする方法を解説しています。

Pythonウェブスクレイピングの基本についてはこちらの記事を参照ください。

以下では CSVファイルからデータをMySQLにインポートする方法と、ウェブサイトから直接インポートする方法を説明します。例えばスクレイピングした商品サイトの各商品情報をMySQLにインポートすることで、そのデータをFlaskなどで利用できます。

CSVファイルからデータをMySQLにインポートする

ここでは、サンプルファイルであるprice_list.csvをMySQLにインポートします。商品サイトをスクレイピングし、商品URL、商品タイトル、カテゴリ、そして価格を取得しています。このようにスクレイピングしたデータをCSVに保存する方法についてはこちらの記事を参照ください。

以下のコードでは指定したテーブルが既に存在する場合、インポート処理をしないようにしています。データを上書きしたい場合、新しいデータのみ更新したい場合などあるかと思うので、好みで調整してください。上書きするように設定すれば、勿論元のデータは消えてしまうので注意してください。

このコードブロックは、CSVファイルからデータを読み込みMySQLデータベースに挿入するプロセスを実装しています。以下は各ステップの説明です。

 

ライブラリのインポート

・pandas: CSVファイルの読み込みに使用します。
・numpy: データ操作、特に欠損値処理に使用します。
・sqlalchemy: データベース接続や操作、テーブルの作成、データの挿入などに使用します。
・sessionmaker: データベース操作のセッション管理に使用します。
・inspect: テーブルの存在確認に使用します。

 

データベース接続設定

・データベース接続に必要な情報(ユーザー名、パスワード、ホスト、データベース名)を設定し、SQLAlchemyのcreate_engineを使ってデータベース接続エンジンを作成します。
・Sessionは、データベースとのやり取りを行うためのセッションを作成するために使用されます。

CSVファイルの読み込み

 

データフレームの作成

・新しいデータフレームnew_dfを作成し、CSVデータの特定の列(url, 商品名, カテゴリ, 価格)をコピーしています。
・価格(価格)の列は、文字列から浮動小数点数型に変換しています。

新しいデータフレームを作ることで、データの型を変換したり、不要な文字列を削除するなどインポート前に内容を整形することができます。

 

テーブルの定義

・Tableを使って、price_listという名前のテーブルを定義しています。
・url列は文字列型で、主キーとして設定されており、product_name, category, priceも列として定義されています。
・文字セットと照合順序としてutf8mb4を指定し、日本語や絵文字などを扱えるようにしています。

ここでテーブルを定義しています。ここではURLを主キーとして設定し、その他カラムごとの型を設定しています。

 

セッションの開始とテーブルの存在確認

・セッションを開始し、テーブルが既に存在するかをinspectを使って確認します。存在する場合は処理を終了し、セッションを閉じます。

 

テーブル作成とデータ挿入

・テーブルが存在しない場合は、新しいテーブルを作成します。
・new_df内の欠損値(NaN)をSQLに対応するNoneに置き換えています。
・データフレームを辞書形式に変換し、テーブルに挿入します。
・最後に、挿入したデータの件数を表示します。

price_list.csvファイルには空のデータが含まれており、MySQLにNullとしてインポートできるように設定しています。

 

ウェブサイトから直接MySQLにインポートする

CSVファイルからではなく、ウェブスクレイピングと同時にMySQLへインポートする方法です。ここでは既にテーブルが存在した場合でも処理が実行され、同じデータがある場合は上書きされるようにしています。

このコードブロックでは、特定のウェブページから記事情報を収集し、直接データベースに格納します。以下は各ステップの説明です。

 

ウェブページからリンクを取得

・requests.getで指定されたURLからウェブページの内容を取得し、BeautifulSoupで解析します。
・base_urlは相対URLを絶対URLに変換するために使用します。
・linksは、取得したリンク情報を格納するリストです。

 

記事リンクの抽出とデータベースへの挿入

・selectメソッドを使って、class=”post-link”の要素を取得します。
・各リンク(a_tag)からhrefを取得し、urljoinで絶対URLに変換します。
・タイトル(post-titleクラスの要素)を抽出し、テキストをきれいに整形します。
・data_dictとしてURLとタイトルを辞書形式で保存します。
・mysql_insertを使用し、データをテーブルに挿入します。重複があった場合(urlが既に存在する場合)は、タイトルを上書き更新するように設定しています。

 

データの挿入とセッションの終了

・find_links関数を実行し、リンクデータを取得してデータベースに挿入します。
・すべての挿入が完了したら、session.commitでトランザクションをコミットし、セッションを閉じます。
・最後に、挿入または更新したレコードの件数を出力します。

 

まとめ

この記事では、Pythonを用いてCSVファイルからデータをMySQLデータベースにインポートする方法、ウェブサイトから直接MySQLにインポートする方法を解説しました。

スクレイピングしたデータをMySQLにインポートしておくことで、Flaskなどで利用しやすくなります。