目的
・自動更新サイトを作るときに、PythonでMySQLに外部サイトからスクレイピングしたデータを利用して、記事を自動生成したい
メリット
・今まではSeleniumで取得したデータをPandasに入れてCSVにエクスポートし、DBの代わりにしていたが、WebアプリケーションだとCSV利用には限界がある。(ほとんどのWebアプリはDBを使い、CSVは使わないから)
やりたいこと
- PythonでSeleniumを利用して、Web上のデータをスクレイピング(ただし今回はスクレイピングのコード含めると面倒くさいので、やらない)
- MySQLのあらかじめ作っておいたテーブルに保存
環境
- Ubuntu
- Python3
Python用MySQLのライブラリ
Python用のMySQLのライブラリは色々出ているよう。
— Dai Kawai@RubyPython (@never_be_a_pm) January 15, 2018
- mysql-connector-python
- Oracle(MySQL公式)
- MySQLdb
- AndyDustman
- PyMySQL
- MySQL-python
- oursql
- umysql
今回はOracle公式のmysql-connector-pythonを利用することにする。
実行手順
- まずUbuntuにMySQLを入れる。
- MySQLに適当なデータベースと、テーブルを作成する
- PythonでMySQLを利用できるパッケージをもろもろ入れる
- データをPython上でMySQLにInsertする
まずUbuntuにMySQLを入れる。
UbuntuにMySQLを入れるのはこのサイトを参考にして進めた。
— Dai Kawai@RubyPython (@never_be_a_pm) January 13, 2018
途中で
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
というエラーが出たので、これを参考にして直した。
#案件— Dai Kawai@RubyPython (@never_be_a_pm) January 13, 2018
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)https://t.co/IMxbUSq1mR
MySQLに適当なデータベースと、テーブルを作成する
まず、MySQLにターミナル上でログイン
$ mysql -u root -p
パスワードを求められるので、MySQL作成時に利用したパスワードを入力
データベースを作成する
$ CREATE DATABASE hogedb;
これでデータベースの作成が完了する。
そのデータベースを利用する
$ use hogedb;
データベースは複数のテーブルを持つことができ、このテーブルが実際にデータを入力する場所となる。テーブルを作成する。
$ CREATE TABLE production (
id INT(11) AUTO_INCREMENT NOT NULL PRIMARY KEY,
title text,
content text,
address text,
term text,
owner text,
fee text,
contact text,
homepageURL text,
);
id INT(11) AUTO_INCREMENT NOT NULL PRIMARY KEY,
title text,
content text,
address text,
term text,
owner text,
fee text,
contact text,
homepageURL text,
);
作成されたか確認。
作成されたデータベースのカラムを確認することができる。
$ show fields from production;
作成したカラムが追加されていればOK
PythonでMySQLを利用できるパッケージをもろもろ入れる
このページの手順にしたがって、PythonでMySQLを利用するもろもろのパッケージをインストール。
— Dai Kawai@RubyPython (@never_be_a_pm) January 14, 2018
データをPython上でMySQLにInsertする
まずはインストール
$ pip install mysql-connector-python
もろもろの値をtitle, content etcに入れて、実行するとmysqlに接続され、実際にデータを挿入することができる。
忘れていけないのは、UPDATE, POST, DELETEのアクションでは、commitをしないとデータの変更が修正されない(単純にGETのものはcommitはいらない)
execute.py
import mysql.connector
#SQL 設定
table_name = "production"
db_settings = {
"host":"localhost",
"database":"hogedb",
"user":"root",
"password":"your_password",
"port":3306
}
title = ""
content = ""
address = ""
term = ""
place =""
owner = ""
fee = ""
contact = ""
homepageURL = ""
conn = mysql.connector.connect(**db_settings)
cur = conn.cursor()
cur.execute(
"""
INSERT INTO production(
title = ""
content = ""
address = ""
term = ""
place =""
owner = ""
fee = ""
contact = ""
homepageURL = ""
)
VALUES ("{}","{}","{}","{}","{}");
""".format(title,content,address,term,place,owner,fee,contact,homepageURL)
)
cur.close
conn.commit()
conn.close
データが挿入されたかどうかは、MySQLにアクセスして確認してみればわかる。
$ mysql -u root -p
$ use hogedb;
$ select count(id) from production; #idの個数を取得
個数が挿入した行の数であれば、ちゃんとデータベースに入力されたことになる。
#案件— Dai Kawai@RubyPython (@never_be_a_pm) January 14, 2018
やっとMySQLにPythonからスクレイピングしたデータを入れられた。
SQLインジェクション起こしうるコードになってるからあれだけど、動作はしているようだ。 pic.twitter.com/hwSPK8qNJi