デイリーポータルのヘッドラインよりRSS配信サービスでトピックの主要を モジュール feedparserでパースして mysqlのデータベースに保存更新します。
このRSSトピックは随時更新されているので サーバーのクロンで自動的にダウンロード、パース、データベースに保存させます。また、データベースに保存されている主要トピックニュースを閲覧する python CGIを使ったWebアプリケーションを作成します。
デイリーニュースヘッドラインのRSSの内容を定期的に取り込みデータベースに保存する実験です。
データベースの構築等々の詳細は別途投稿にある
で郵便番号データベース様々なパターンで紹介いしています。
このプログラムはpythonによるmysqlの扱いについて個人的な学習の目的で作成しました。
コードについての利用はあくまでも自己責任でお願いします。
pythonでmysqlを利用するにあたって今回実装する環境の確認事項
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// サーバーOSのバージョン確認 $ cat /etc/centos-release CentOS Linux release 7.7.1908 (Core) // python のバージョン確認 $ python -V Python 3.6.3 // mysqlのバージョン確認 mysql> select version(); +-----------+ | version() | +-----------+ | 5.7.27 | +-----------+ 1 row in set (0.02 sec) |
モジュール mysqlclient のインストール
1 2 3 4 5 6 7 |
// モジュール mysqlclient のインストール $ pip install mysqlclient // pipでエラーが起こる場合は以下の環境に応じたコマンドを実行後 // 再度pipでのインストールを実行してみます。 // sudo apt-get install python-dev default-libmysqlclient-dev # Debian / Ubuntu // sudo yum install python-devel mysql-devel # Red Hat / CentOS (今回実行してみました。) // brew install mysql-connector-c # macOS (Homebrew) (Currently, it has bug. See below) |
mysql 閲覧プログラムソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#!/usr/bin/env python3.63 import sys import io import MySQLdb import feedparser sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') html = """Content-type: text/html\n <!DOCTYPE html> <html lang=\"ja\">\n <link rel = \"stylesheet\" href = \"style.css\">""" + \ """<head>\n <meta charset=\"UTF-8\">\n <title>Document</title>\n </head><body>\n <h1><a href=\"https://www.codingstock.jp/centos7-python-cgi-rss\"> <style> h2 { color: #364e96;/*文字色*/ padding: 0.5em 0; border-top: solid 3px #364e96; border-bottom: solid 3px #364e96; } </style> <img src=\"https://www.codingstock.jp/wp-content/uploads/tcd-w/logo.jpg?1569061779\"></a></h1> """ print(html) connection = MySQLdb.connect( host='localhost', user='dbuser', passwd='Karokakku1190#', db='dailyportal', charset='utf8') cursor = connection.cursor() # エラー処理(例外処理) try: sql = '''select title,link,published,topicUpDate from dailyportal order by published desc limit 10;''' # print(sql) cursor.execute(sql) print("<div class=\"wrapper\">\n<h2>MySQL DailyPortalテーブル Top10 リンク</h2>") for row in cursor.fetchall(): print( "<div class=\"container\">", "<div>", row[0],"<br>",row[2],"<br>", "<a href=\"", row[1],"\" target=\"_blank\">",row[1],"</a><br>", "</div>", "</div>" ) print("</div>") except MySQLdb.Error as e: print('</div>MySQLdb.Error: ', e ) connection.commit() connection.close() |
DailyPortalをデータベースに書き込むプログラムの仕組み
unix系OSでは定期的、指示した時間に指定したプログラムを実行します。
【crontabのコマンド】
crontab [-u ユーザー] { -e | -l | -r }
-u: 指定したユーザーのcrontabファイルを操作します。
-l: crontabファイルの内容を表示します。
-r: crontabファイルを削除します
-e: crontabファイルを編集します。
【コマンド詳細】
0 * * * * /[path-to]/cgi-enabled/pyMySQL.py
分 時 日 月 曜日 コマンド
対象 値
分 0~59
時 0~23
日 1~31
月 1~12 または jan~dec
曜日 0~7 または sun~sat(0,7は日曜日)
1 2 3 4 5 6 7 8 9 10 11 |
// Cron の起動状態確認 [root@xxxx ~]# systemctl status crond //起動していない場合は起動、再起動時の自動起動も設定 [root@xxxx ~]# systemctl start crond [root@xxxx ~]# systemctl enable crond // crontabの設定 [root@xxxx ~]# crontab -l 0 * * * * /[path-to]/cgi-enabled/pyMySQL.py // 毎時間 0分に実行します。 |
DailyPortalをデータベースに書き込むプログラムソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#!/usr/bin/env python3.63 import sys import io import datetime import MySQLdb import feedparser from datetime import datetime #import sqlite3 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') html = """Content-type: text/html\n <!DOCTYPE html> <html lang=\"ja\">\n <link rel = \"stylesheet\" href = \"style.css\">""" + \ """<head>\n <meta charset=\"UTF-8\">\n <title>Document</title>\n </head><body>\n <h1><a href=\"https://www.codingstock.jp/centos7-python-cgi-rss\"> <img src=\"https://www.codingstock.jp/wp-content/uploads/tcd-w/logo.jpg?1569061779\"></a></h1>""" print(html) connection = MySQLdb.connect( host='localhost', user='dbuser', passwd='Karokakku1190#', db='yahooNews', charset='utf8') cursor = connection.cursor() # エラー処理(例外処理) try: # table dailyportalが存在していると削除 今回はコメントアウト # cursor.execute("drop table if exists `dailyportal`;") # table topicが存在しないとテーブル作成します。 # cursor.execute("drop table if exists `dailyportal`;") sql = '''create table if not exists dailyportal ( title varchar(256) PRIMARY KEY NOT NULL, link varchar(128), published datetime, topicUpDate datetime);''' cursor.execute( sql ) #RSS取得し feedparser でパース ynews = feedparser.parse('https://dailyportalz.jp/feed/headline') print( "<div class=\"wrapper\">") # ----------------------------------------------- replace_into = "replace into dailyportal (title,link,published,topicUpDate) values (%s, %s, %s, %s);" # replace into は キーに対応データが存在すれば UPDATE, 存在しなければ INCERT として機能します。 # mysql の方言 ? とりあえず mysqlのみがサポートしているようです。 for entry in ynews.entries: timestamp_str1 = entry.published dt = datetime.strptime(timestamp_str1,'%a, %d %b %Y %H:%M:%S %z') news = [ (entry.title, entry.link, str(dt)[:19], datetime.now().strftime("%Y/%m/%d %H:%M:%S")) ] cursor.executemany(replace_into,news) print("</div>") except MySQLdb.Error as e: print('</div>MySQLdb.Error: ', e ) connection.commit() # 一括書き込みの実態。実際のデータベースの書き込みはこのコマンドで実行されます。 connection.close() |
データベースの確認
1 2 3 4 5 6 7 8 9 10 11 12 |
/* python で作成されたテーブルをターミナルで確認 */ mysql> show create table dailyportal\G *************************** 1. row *************************** Table: dailyportal Create Table: CREATE TABLE `dailyportal` ( `title` varchar(256) NOT NULL, `link` varchar(128) DEFAULT NULL, `published` datetime DEFAULT NULL, `topicUpDate` datetime DEFAULT NULL, PRIMARY KEY (`title`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) |