こんな疑問にお答えします。
本記事は、以下のような人向けです。
こんな人
- heroku(サーバー)へのデプロイ方法を知りたい
- サーバーに乗せてPythonを利用する感覚を知っておきたい
- Webスクレイピング情報をLine通知してみたい
Pythonのインストールがまだの人はコチラから
-
Pythonのダウンロードとインストール方法(全手順-画像付)
続きを見る
コードエディターはATOMのインストール方法
-
【Python】ATOMのインストール方法と日本語化を説明【簡単】
続きを見る
非表示にできる< 目次 >
本記事で出来ること
本記事では、以下の手順で行います。
最終的に「YahooファイナンスのヘッドラインニュースをLineへ通知させる」を目標にやっていきます。
手順
- 実現したいことの確認
- ローカル環境で動作確認
- Herokuの環境構築
- Herokuへデプロイ
実現したいことの確認
本記事で実現させることを確認しましょう。
実現内容
Yahoo!ファイナンスのヘッドラインニュースをSeleniumで情報抽出しLine通知させる。
イメージとしては、画像の通り。
ローカル環境で動作確認
大原則として、ローカル(あなたのPC)上で動かないプログラムは、サーバー(heroku)上では動きません。
この要点を抑えたうえで、作業をしていきましょう。
pipで必要なものをインストール
Windows利用者はコマンドプロント or Windows PowerShell を開きましょう
Mac利用者はターミナルを開いてください。
以下のコマンドを入力し、pip インストールしましょう。
Webサイトからの情報抽出で必要
<Seleniumのインストール>
1 |
pip install selenium |
LINE通知させるのに必要
<Requestsのインストール>
1 |
pip install requests |
ChromeDriverをダウンロード&配置
あなたのPCに合ったChromeDriverをダウンロードしましょう。
本記事では説明の為に、ChromeDriverをデスクトップに配置します。
-
【Python】Webスクレイピングの実行環境を整える【初心者】
続きを見る
LINE Notifyのトークンを発行
Line Notifyのトークンを発行しましょう。
トークン発行手順は、以下の画像の通り。
注意ポイント
・トークンの表示画面は2度表示されません。確実にコピーして保管しておきましょう。
デスクトップ上に開発用フォルダを作成
デスクトップ上に新規で開発用フォルダを作成しましょう。
本記事では「【開発中】Line通知」というフォルダ名でやってます。
開発用フォルダに.pyファイルを格納
NakamuraBlogではコードエディター「ATOM」を推奨しています。
よって、ATOMをベースに説明していきます。
以下のコードをATOM上でコピペし、
「ChromeDriverのディレクト情報」と「LineNotifyのトークン情報」を書き換えましょう。
あなたがすること
- コードエディターにコピペ
┗ 7行目 :ChromeDriverのディレクトを書き換える
┗ 39行目:LineNotifyのトークンに書き換える - 最後に開発用フォルダに保存(本記事では「main.py」として保存。※任意名称でOK)
<コードエディターにコピペ>
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 |
import os import requests from selenium import webdriver from selenium.webdriver.chrome.options import Options # ローカルに保存しているChrome Driverを指定 (※デプロイするときはコメントアウトする) driver_path = "<あなたのPC上のChromeDriverのディレクトリ情報を入れる>" ###あなたが対応する箇所(記入例:C:\Users\desktop\chromedriver.exe) # Heroku上のChrome Driverを指定(※デプロイするときはコメントを外す) # driver_path = '/app/.chromedriver/bin/chromedriver' # Headless Chromeをあらゆる環境で起動させるオプション options = Options() options.add_argument('--disable-gpu'); options.add_argument('--disable-extensions'); options.add_argument('--proxy-server="direct://"'); options.add_argument('--proxy-bypass-list=*'); options.add_argument('--start-maximized'); options.add_argument('--headless'); #クローラーの起動 driver = webdriver.Chrome(executable_path = driver_path, chrome_options = options) #Yahooファイナンスへアクセス driver.get('https://finance.yahoo.co.jp/') #ヘッドラインニュースの情報抽出 elements = driver.find_element_by_xpath('//*[@id="ytopContentIn"]') message = elements.text # ブラウザを終了する driver.quit() # LINE通知用に定義した関数 def line_notify(message): line_notify_token = '<あなたのLINE Notifyのトークンを入れる>' ###あなたが入れ替える箇所 line_notify_api = 'https://notify-api.line.me/api/notify' payload = {'message': message} headers = {'Authorization': 'Bearer ' + line_notify_token} requests.post(line_notify_api, data=payload, headers=headers) # LINEに通知させる line_notify(message) |
<開発用フォルダに保存>
ちなみに、現時点での開発用フォルダのディレクトリ構造は以下の通り。
ディレクトリ
【開発中】Line通知
┗ main.py
動作確認
動作を確認してみましょう。
ATOMの場合、Atom Runnerをインストールしてる場合「ALT + r」で 動作を確認することができます。
ここは別記事で説明していますので、こちらを参照ください。
続きを見る
【簡単】PythonとATOMを連携し実行環境を構築【全手順-画像有】
あなたのLineにYahooのヘッドライン情報が通知されたら、動作確認OKです。
ここまでで上手く行かない時は?
ここまでで上手く行かない人は、以下の点を確認してみて下さい。
- 「ChromeDriverのディレクト情報」が正しく入力されているか?
┗ ①ChromeDriver.exeまで含めたディレクトリ情報を入力してください。
例)C:\Users\desktop\chromedriver.exe┗ ②ディレクトリ情報の\を2つ並べましょう(Windowsの場合\\でないと反応しない事例有)
例)C:\\Users\\desktop\\chromedriver.exe
Herokuの環境構築
Heroku CLIをインストール
Herokuのアカウント登録を済ませた後、Heroku CLIをインストールしていきましょう。
Heroku CLI はコチラの公式HPからダウンロードできます。
Herokuへログイン
ここからターミナル側での作業となります。
※Windowsの場合:コマンドプロント or Windows PowerShell
以下のコマンドを入力してHerokuへログインしましょう。
1 |
heroku login |
進めていくと以下の画面が出現しますので「Log in」をクリックしてください。
その後、ターミナル側では以下の内容が出力されていれば、OK。
Logged in as あなたのログインメールアドレス
ちなみに、「Logged In」の画面は閉じても大丈夫です。
Heroku上に新規アプリを作成
ターミナル側で以下のコマンドを入力しアプリを作成しましょう。
尚、≪アプリ名≫ は任意の名称でOK。
1 |
heroku apps:create ≪アプリ名≫ |
本記事では、Herokuを無償バージョンで利用します。
そのためパブリック(共用)利用となることから、既に誰かが作成しているアプリ名の場合、使用できません。
ちなみに、既に重複された名称でCreateコマンドを実行した場合、
「Name ≪アプリ名≫ is already taken」と表示されます。
<参考:line-pythonというアプリ名称は既にありました。>
ということで、この点を注意して作成してみましょう。
尚、任意の≪アプリ名≫は この後に使用するため、コピーして保管しておきましょう!
Build Packを挿入
先ほど作成した ≪アプリ≫に対してBuild Packを入れていきます。
ターミナル上で以下のコマンドを合計3つ入れてあげて下さい。
Heroku-アプリ上でPythonを使う宣言
1 |
heroku buildpacks:add heroku/python -a ≪アプリ名≫ |
Heroku-アプリ上でChromeブラウザを使うために必要
1 |
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-google-chrome -a ≪アプリ名≫ |
Heroku-アプリ上でChromeDriverを使うために必要
1 |
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-chromedriver -a ≪アプリ名≫ |
これら 3つのBuild Packがセッティングされているかを確認しましょう。
HerokuのSetting画面の下部に 入力した3つの項目が入っていることが確認できます。
メモ:HerokuアプリのタイムゾーンをAsia/Tokyoに変える方法
Herokuでは、サーバー上で定期実行(Cron)ができます。
その際、タイムゾーンを Asia/Tokyo にしておかないと、意図した時間帯に定期実行しません。
1 |
heroku config:add TZ=Asia/Tokyo -a ≪アプリ名≫ |
Herokuに乗せるメリットの1つにCron実行(定期実行)がありますので。
Herokuアプリ側の環境変数にLineNotifyのトークン情報を挿入
Herokuの無償利用では、コードは基本的に共用物として扱われます。
ですので、あなたのLineNotifyトークンをpyファイルに記載したままだと、
第三者にあなたのLineへのアクセス許可情報が見られてしまいます。
よって、Herokuアプリ側に、環境変数として取り込んでおきましょう。
Heroku-環境変数を挿入
1 |
heroku config:set LINE_NOTIFY_TOKEN=************ -a ≪アプリ名≫ |
Heroku側に環境変数が挿入された場合、以下の場所をクリックすれば、
ターミナルで挿入したLineトークンが表示されます。
Herokuへデプロイ
Heroku用にmain.pyのコーディング内容を修正
Herokuへのデプロイ用に、開発フォルダ内の「main.py」のコードを修正していきます。
結論、以下の通りのコードとなります。
変更点は コード内にコメントアウトで「###★変更ポイント:理由」と記載しております。
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 |
import os import requests from selenium import webdriver from selenium.webdriver.chrome.options import Options # ローカルに保存しているChrome Driverを指定 (※デプロイするときはコメントアウトする) # driver_path = "<あなたのPC上のChromeDriverのディレクトリ情報>" ###★変更ポイント:コメントアウトした # Heroku上のChrome Driverを指定(※デプロイするときはコメントを外す) driver_path = '/app/.chromedriver/bin/chromedriver' ###★変更ポイント:コメントアウトを解除した # Headless Chromeをあらゆる環境で起動させるオプション options = Options() options.add_argument('--disable-gpu'); options.add_argument('--disable-extensions'); options.add_argument('--proxy-server="direct://"'); options.add_argument('--proxy-bypass-list=*'); options.add_argument('--start-maximized'); options.add_argument('--headless'); #クローラーの起動 driver = webdriver.Chrome(executable_path = driver_path, chrome_options = options) #Yahooファイナンスへアクセス driver.get('https://finance.yahoo.co.jp/') #ヘッドラインニュースの情報抽出 elements = driver.find_element_by_xpath('//*[@id="ytopContentIn"]') message = elements.text # ブラウザを終了する driver.quit() # LINE通知用に定義した関数 def line_notify(message): line_notify_token = os.environ['LINE_NOTIFY_TOKEN'] ###★変更ポイント:トークンをHeroku環境変数から拾うようにする line_notify_api = 'https://notify-api.line.me/api/notify' payload = {'message': message} headers = {'Authorization': 'Bearer ' + line_notify_token} requests.post(line_notify_api, data=payload, headers=headers) # LINEに通知させる line_notify(message) |
Heroku用にファイルを追加
「main.py」が格納された開発フォルダに、2つのファイルを格納していきます。
ここまでの開発用フォルダのディレクトリ構造は以下の通り。
ディレクトリ構造
【開発中】Line通知
┗ main.py
┗ requirements.txt ←★これから追加していきます。
┗ runtime.txt ←★これから追加していきます。
┗ Procfile ←★これから追加していきます。
これからターミナル上で ファイルを出力していくため、
ターミナル側で出力先を指定します。
1 |
cd 出力先のフォルダのディレクトリ(記入例:C:\Users\desktop\【開発中】Line通知) |
では、それぞれ説明します。
requirements.txt の作成方法
ターミナルで以下のコマンドを実行すると、requirements.txtが出力されます。
1 |
pip freeze > requirements.txt |
ちなみに、中身はこんな見た目になってるはず。
(皆さんとちょっと違うかもしれませんが、問題ないので安心ください。)
はてな
requirements.txt:Heroku側で使用するPythonのモジュールを記載するとHerokuが認識してくれる。
runtime.txt の作成方法
事前に、自分のPCのPythonのバージョンを確認しておきましょう。
手っ取り早く確認する方法は、ターミナル上で以下のコマンドを実行すればOK。
1 |
python --version |
今回、僕のPCでは「Python 3.9.0」と出力されましたので、これを runtime.txt として 出力させます。
1 |
echo python-3.9.0 > runtime.txt |
尚、Heroku側で使用可能なPythonのバージョンは、
コチラの公式HPより最新のものが分かりますので参考までに。
ちなみに、runtime.txt の中身はこんな感じになっているはず。
はてな
runtime.txt:Heroku側で使用するPythonのバージョンを認識させるために記載
Procfileファイルの作成方法
1 |
echo web: python main.py > Procfile |
この作業により、開発用フォルダに「Procfile」ファイルが作成されてます。
注意ポイント
- main.py の名称は、あなたが作成している pyファイル名称に変更してください。
はてな
Procfileファイルとは、Herokuのプラットフォーム上にあるWebアプリがどのようなコマンドで実行されるのかを記述する指示書のこと。
Heroku用にファイルを追加時の注意点(.txt保存形式を確認)
出力されたメモ帳(.txtファイル)の保存形式がBOM形式だと、デプロイできません。
よって、txtファイルである
- requirements.txt
- runtime.txt
の2つのtxtファイルを 「UTF-8」形式で上書き保存しておきましょう。
Herokuへデプロイ
最後の作業をしていきましょう。
以下のコマンドを順番に、ターミナルで入力していきます。
step
1cdコマンドでローカルリポジトリを設定
1 |
cd 開発フォルダのディレクトリ |
これまでに作成していた開発フォルダのディレクトリ情報を入れてあげましょう。
ちなみに、僕の場合は、以下の記入例の通りです。
記入例:「cd C:\Users\デスクトップ\【開発中】Line通知」
ここまでのディレクトリ構造
【開発中】Line通知
┗ main.py
┗ Procfile
┗ requirements.txt
┗ runtime.txt
リポジトリって何?
リポジトリは「保管場所」という意味に置き換えて覚えておけばOKです。
ローカルリポジトリとは、「あなたのPC上の保管場所」という意味。
STEP3でリモートリポジトリの単語がでますが、
本記事では「Heroku上の保管場所」と理解しておけばOK。
step
2Gitの初期ファイルを作成
1 |
git init |
この作業により、Heroku側でアプリを使用するため必要なフォルダが作成されます。
Git未インストールの人は?
Gitのインストールが未実施の人は、
こちらの公式HPよりダウンロード&インストールしてから「git init」コマンドを実行してください。
「git init」コマンド実行後は、ディレクトリ情報が以下のようになっていますので確認しましょう。
ここまでのディレクトリ構造
【開発中】Line通知
┗ .git ←★追加されてる
┗ main.py
┗ Procfile
┗ requirements.txt
┗ runtime.txt
≪参考:ここまでのフォルダ内-構造≫
step
3ローカルリポジトリに紐づくリモートリポジトリを設定
1 |
heroku git:remote -a <アプリ名> |
事前に、あなたが作成した「アプリ名」に置き換えてコマンドを実行しましょう。
step
4変更したすべてのファイルをインデックスに登録
1 |
git add . |
step
5デプロイする際のコメントを入れる
1 |
git commit -m "あなたの任意のコメントに書き換えてね。" |
step
6デプロイ実行
1 |
git push heroku master |
デプロイ完了後は、ターミナル側で以下の内容が出力されます。
remote: Verifying deploy... done.
画像で表現すると以下の感じ。
≪ターミナル側の出力≫
デプロイしたアプリを実行
デプロイしたアプリの動作確認してみましょう。
ターミナル側で以下のコマンドを実行し動作を確認しましょう。
1 |
heroku run python main.py |
ここまで上手く出来た人は、あなたのLineにYahooファイナンスのヘッドニュースが通知されていると思います。
以上でデプロイ作業と動作確認は終わりとなります。
お疲れさまでした!
(参考)メモ:デプロイしたファイルを変更したい場合の処理
自分用のメモですが、デプロイ後にファイルを変更(更新)したい場合は、
以下手順をターミナル側で実行。
①cdコマンドで開発用フォルダを指定cd 開発用フォルダのディレクトリ(記入例:C:\Users\desktop\【開発中】Line通知)
②ローカルリポジトリに紐づくリモートリポジトリを設定heroku git:remote -a <アプリ名>
③変更したすべてのファイルをインデックスに登録git add .
④デプロイする際のコメントを入れるgit commit -m "任意のコメントに書き換える"
⑤デプロイ実行git push heroku master
(参考)メモ:Heroku側アプリ名称の変更方法
こちらも自分用のメモですが、以下のコマンドで既存アプリ名称を変更できる。
1 |
heroku apps:rename <変更後の名称> --app <変更前の名称> |
終わりに
お疲れさまでした!
今回はここまでとなりますが、PythonをHeroku(サーバー)で動かす感覚を体験できましたでしょうか?
同じ感覚を味わって貰えたのなら、記事作成冥利につきます。
今回、Webスクレイピングの結果をLineで通知する構成でしたが、
Pythonのサードパーティーモジュールに「beautifulsoup4」というのがあり、
Webスクレイピングをする際に楽になるものがありますから、
もし興味があれば、ググってみてると視野が広がるかもしれません。
beautifulsoup4の専門書もたくさん出版されてますからハードルは低いと思います!
ということで、ここまでありがとうございました!
今後ともNakamuraBlogをよろしくお願いいたします。
補足:ちなみにPythonを学べるプログラミングスクールは?
プログラミングスクールはたくさんありますが、Pythonを学べるオススメなスクールは「TechAcademy」ですね。
理由は3つあります。
- Pythonに必要なスキルを体系的に学べる
- 短期集中プランがある
- 無料体験会がある
Pythonを実務レベルで習得するなら、プログラミングスクールを選択するのは、賢い選択の1つです。
(人に聞けるって、楽です。)
決して安い値段では無いので、まずは無料体験会に参加してみると良いと思います。
無料体験会はWeb上で受けられるますので、かなり気楽に受けられます(お菓子食べながらでも。笑)
オススメのプログラミングスクール
正直、時間と気力があれば、Pythonはソコソコ触れるようになりますので、
ショートカットしたい人はプログラミングスクールは如何でしょうか?というお話でした。