目的
・自動更新サイトを作るときに、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