onda install -c anaconda beautifulsoup4
mixhostでpythonを操作してスクレイピングを行い
mixhostのデータベースに追加する方法を解説していきます。
youtubeでも解説動画を出しています。併せてご視聴い下さい。
必要なライブラリをインストールする
mixhostでpythonを操作する方法は前回の記事を参考にして下さい。
今回使うライブラリは「
まずはこれらをインストールしていきましょう。
※注意
mixhostでanacondaの環境を構築しているなら必ずcondaコマンドでライブラリをインストールしてください。
pipも使用できますが、最悪サーバーの環境が壊れてしまう可能性があります。
conda install -c anaconda requests
Beautiful Soup 4
conda install -c anaconda beautifulsoup4
mysql-connector-python
conda install -c anaconda mysql-connector-python
「
」と「Beautiful Soup 4」は何の問題もなくインストールできると思いますが、「mysql-connector-python」に関してはこのようなエラーが出る場合があります。何やらバージョンがなんちゃら言われてますが、これはcondaでライブラリをインストールする時のあるあるです。
デフォルトのcondaのチャンネルにはライブラリのパッケージはそこまで豊富に用意されているわけではなく、目的のライブラリが存在していないことや、使用しているバージョンとマッチしているバージョンのライブラリが用意されていないことはよくあります。
mysql-connector-pythonがインストールできなかった場合の対処法
mysql-connector-pythonがインストールできなかった時の対処法はいくつか考えられます。
先述したpipによるインストールもその一つですが、ローカル環境ならともかくレンタルサーバーであるmixhost内では使わないほうがいいでしょう。っていうか使わないでください。
次の手段として環境を変える方法が考えられます。
pyenvで別のバージョンのanaconda環境を構築する。anaconda環境内に別のバージョンのpython環境を構築する等です。
しかし、今回はconda-forgeを使ってmysql-connector-pythonをインストールする方法を紹介します。
conda-forgeでは様々なライブラリがバージョン毎に豊富に用意されています。
まずはデフォルトの状態でmysql-connector-pythonをcondaから検索してみましょう。
conda search mysql-connector-python
pkgs/mainというチャンネルにmysql-connector-pythonが存在しているんじゃないか?と思われますが、いったん無視して下さい。
続いて現在のチャンネルを調べます。
conda config --get channels
上記コマンドの結果、画像のようにdefaultsが表示される。または、何も表示されません。
lowest priorityは優先度が最も低いという意味ですけど、一つしかチャンネルがないので優先度が最も高いと同義です。
conda config --append channels conda-forge
conda config –append channels conda-forgeとする事でconda-forgeをチャンネルに追加します。
これでconda-forgeがチャンネルに追加されました。
appendとするとdefaultsの優先度の高さを維持しつつconda-forgeを追加できますが、conda-forgeの優先度を最も高くしたい場合にはaddとして下さい。
もう一度mysql-connector-pythonをサーチするとconda-forgeチャンネルより様々なバージョンが表示されております。
conda install -c anaconda mysql-connector-python
conda-forgeをチャンネルに追加する事により無事にmysql-connector-pythonをインストールする事が出来ました。
データベースの作成
mixhost内にデータベースを作成します。
MySQL データベース ウィザードを開いて
とりあえず、testとでもしておきます。ユーザー名がバッチリ見えちゃってますが気にしません。
手順を進めていきユーザーには全ての権限を与えておきます。
スクレイピングのテストを行う
mixhostでpythonを操作し、スクレイピングをしてみましょう。
import requests
from bs4 import BeautifulSoup
r = requests.get('https://tenki.jp/forecast/6/30/6200/27217/')
r.encoding = r.apparent_encoding
soup = BeautifulSoup(r.text, 'lxml')
weather = soup.select("#main-column > section > div.forecast-days-wrap.clearfix > section.today-weather > div.weather-wrap.clearfix > div.weather-icon > p")[0].text
print(weather)
このスクリプトを実行し
今日の天気が出力されればOKです。
データベースと接続する
まずはデータベースとの接続チェックを行います。
import mysql.connector
conn = mysql.connector.connect(
host='localhost',
user='ユーザー名',
password='パスワード',
database='データベース名'
)
print(conn.is_connected())
このコードを実行し、Trueと出力されれば、データベースとの接続は成功です。
データベースの操作テスト
一通りテストを行います。
テーブル作成
import mysql.connector
conn = mysql.connector.connect(
host='localhost',
user='ユーザー名',
password='パスワード',
database='データベース名'
)
cur = conn.cursor()
conn.ping(reconnect=True)
print(conn.is_connected())
cur.execute("DROP TABLE IF EXISTS `test_table`")
cur.execute("""CREATE TABLE IF NOT EXISTS `test_table` (
`id` int(8) NOT NULL,
`name` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci""")
コード実行後に確認を行います。
cPanelからphpMyAdminを選択し
先ほど作成したtestデータベースを開き、test_tableが作成されている事を確認。
test_tableを確認し、idとnameのカラム名を確認。
続いてデータの挿入を確認
import mysql.connector
conn = mysql.connector.connect(
host='localhost',
user='ユーザー名',
password='パスワード',
database='データベース名'
)
cur = conn.cursor()
conn.ping(reconnect=True)
print(conn.is_connected())
cur.execute("INSERT INTO test_table VALUES (1, %s)", ("test", ))
conn.commit()
実行結果としてレコードが確認できればOK。
スクレイピングした内容をデータベースに追加
いよいよスクレイピングした内容をデータベースに追加します。
といってもこれまでのコードをくっつけるだけですが
import mysql.connector
import requests
from bs4 import BeautifulSoup
conn = mysql.connector.connect(
host='localhost',
user='ユーザー名',
password='パスワード',
database='データベース名'
)
cur = conn.cursor(buffered=True)
conn.ping(reconnect=True)
print(conn.is_connected())
r = requests.get('https://tenki.jp/forecast/6/30/6200/27217/')
r.encoding = r.apparent_encoding
soup = BeautifulSoup(r.text, 'lxml')
weather = soup.select("#main-column > section > div.forecast-days-wrap.clearfix > section.today-weather > div.weather-wrap.clearfix > div.weather-icon > p")[0].text
cur.execute("INSERT INTO test_table VALUES (2, %s)", (weather, ))
conn.commit()
cur.close()
conn.close()
実行結果↓
今日の天気が追加されています。
まとめ
今回はmixhostでpythonを操作して、スクレイピングの結果をデータベースに登録する方法を解説しました。