デジタル推進課

KNIME・Excel Macro・Power Automateなど日々の業務で使用できる自動化ツールを中心に書き綴ります

Python - 完全自動化!初心者が無料でウェブスクレイピングを定期実行してみた - Mac M1搭載機 ~Heroku / Selenium / Homebrew / Chrome Driver~

f:id:makkynm:20210409084810p:plain
 

 

はじめに

こんにちは、自動化大好きまっきーです。今回はPythonで書いたスクレイピングのコードを無料で定期実行する方法について解説したいと思います。

これを使えばいちいち自分のPCを起動して実行しなくても、クラウド上で勝手に実行してくれるようになります。 

今回使用したPythonコードはこちらです。

https://github.com/makkynm/HerokuBlogMura.git

 

 今回のテーマ ~Heroku~

 Herokuというクラウドサービスの無料枠を使って定期実行を行っていきます。

f:id:makkynm:20210409083419p:plain

引用元:HEROKU https://jp.heroku.com/home

Heroku とは | Heroku

 

覚えてほしいこと

Herokuを使えば無料でPythonを定期実行できる

 

やりたいこと - ブログ村の自動クリック

私はスクレイピングで主にSeleniumを使用していますが、Pythonでコードを書いたものの、ターミナルから自分で定期実行することが面倒で自動化したいと思っています。定期実行したいことはたくさんあり、、

Twitterのいいねを自動で行いたい。

毎日の株価をスクレイピングで取得したい

ブログ村のランキングクリックを自動化したい。

出会い系アプリのフリックを自動で行いたい。

。。。。

その中でも、今回は私のブログのブログ村の自己クリックを定期実行してみたいと思います。

 

もちろん、タスクスケジューラで実行することもできますが、PCを常にONにしておくのは電気代もかかりますし、やりたくありません。

そこで、無料のクラウドサーバーHerokuを使用して定期実行を設定したいと思います。

 

使用環境

使用したMacはこちらです。

f:id:makkynm:20210404115732p:plain

使用環境

 

事前準備

Herokuにアカウント作成

公式サイトから無料でアカウントを作成してください。

Heroku

 

Herokuのインストール

Rosetta2なしでもいけます。やってみましょう。

Step1 - terminal を開く

まずターミナルを開きます。現在使用しているのは、ARM環境のターミナルです。

Windowsでいうコマンドプロンプトですね。

f:id:makkynm:20210404112256p:plain

Step1 - ターミナルを開く

Rosetta2を使用しているか、ARMを使用しているかは下のコードから確認できます。

uname -m

f:id:makkynm:20210404155926p:plain

ARMを使用している場合

 

Step2 - Homebrewのインストール

まず、Homebrewをインストールします。ARMネイティブにも対応したので、下記の記事を参考に、Homebrewをインストールしてみてください。

degitalization.hatenablog.jp

 

Step3 -Heroku CLIをインストールする

下記のコードをコマンドプロンプトに打ち込むと、インストールが開始されます。

brew tap heroku/brew && brew install heroku

f:id:makkynm:20210404171051p:plain

Herokuのインストール

引用:Heroku CLI | Heroku Dev Center

 

Step4 - インストールされているかを確認

最後にインストールされているかどうか確認していきます。

heroku --version

f:id:makkynm:20210404184713p:plain

Step4 - インストールされているかを確認

無事にダウンロード完了してそうですね!

 

 

Heroku実行用コードを準備

1. 必須 - Chromeドライバのパス変更

実際に使用するPythonのコードを少し変更します。Chrome Driverのパスを下記のように書き換えます。

  # heroku用にchromedriverのPATHを指定
  driver_path = '/app/.chromedriver/bin/chromedriver'
  options = webdriver.ChromeOptions()
  options.add_argument('--headless')
  options.add_argument('--disable-gpu')
  options.add_argument('--no-sandbox')
  options.add_argument('--disable-dev-shm-usage')
  options.add_argument('--remote-debugging-port=9222')
  driver = webdriver.Chrome(options=options, executable_path=driver_path)
  driver.set_window_size(950, 800)

HerokuでのChrome Driverの設定と、実際にDelpoyした時にメモリ不足が発生するのを防ぐためにOptionを加えています。

参考:herokuでselenium利用時にクラッシュする場合の解決方法 - Qiita

 

2. 必須 - requirements.txtでライブラリ指定

Importするライブラリをここで指定します。コマンドでテキストファイルを作る場合は下記を入力します。

echo selenium > requirements.txt

いちいち面倒だなーという人は、下記のコードを打ち込めば現在LocalのPythonでImportされているライブラリを全出力することができます。

pip3 freeze > requirements.txt

バージョンを指定する場合は、下記のように記述します。

numpy
selenium==3.141.0

テキストファイルを作ってしまって直接打ち込んでしまった方が楽かもですね。

 

3. 必須- Prockfileでコマンド指定

HerokuでPythonのファイルを実行する際に入力するコマンドを指定するファイルを用意します。個人的には必須かどうかは?です。

web: python ファイル名

があればOKです。拡張子はなしのファイルみたいです。コマンドでファイルを作る場合は下記を入力します。

echo web: python HerokuBlogMura.py > Prockfile

 

4. 任意 - rentime.txtでバージョン指定

私は準備しませんでした。

このファイルはPythonのバージョンを指定するファイルです。このファイル自体なかったらHeroku側で定義されたデフォルトのバージョンを使用されます。

python-3.9.4

Herokuで対応可能なPythonのバージョン情報については下記のページを要確認

Heroku Python Support | Heroku Dev Center

 

Gitに定期実行したいコードをPush

事前準備として、Gitに定期実行したいファイルがPushされたリモートリポジトリを用意しておきます。

Gitは、M1 Macは基本デフォルトですでにインストールされているので割愛しています。

f:id:makkynm:20210404182639p:plain

Gitはすでにインストールされている

GitHubの使い方が分からない方は、こちらの記事がオススメです。

【GitHub超初心者入門】この前初めてGitHubを使い始めたエンジニア見習いが書くGitHubの使い方と実践~とりあえず一緒に動かしてみようぜ!~ - Qiita

 

例として、Seleniumスクレイピングを行うPythonのファイルを使用します。このPythonファイルのコードは下記で公開されています。このリモートリポジトリを定期実行に使用します。

https://github.com/makkynm/HerokuBlogMura.git

 ローカルリポジトリからリモートリポジトリへ

mkdir HerokuBlogMura
cd HerokuBlogMura
git init
git add HerokuBlogMura.py
git commit -m "This version is for Heroku schedule run"
git remote add origin https://github.com/makkynm/HerokuBlogMura.git
git push origin master

 

 

Herokuで定期実行を設定

さて、インストールが終わったのでこれからは実際にPythonファイルをHerokuで定期実行する方法について触れたいと思います。

 

必要ファイルをGitにPushする

定期実行に必要なファイルは、下記の3ファイルです。

  • *.py -(必須)Pythonファイル
  • requirements.txt  -(必須)ライブラリの指定ファイル
  • Prockfile - (必須?) コマンドの指定ファイル
  • rentime.txt - (任意)バージョン指定ファイル

これらをGitでPushしていきます。

git init
git add *
git commit -m "This version is for Heroku schedule run"
git remote add origin https://github.com/makkynm/HerokuBlogMura.git
git push origin master

https://github.com/makkynm/HerokuBlogMura.git

 

Herokuにアプリを作成して連携する

さて、事前準備が整ったので早速定期実行を設定していきましょう。

Herokuにログイン

まず下記をTerminalに打ち込んでHerokuにログインします。下記のコードを実行して、Enterを押すと、ログイン用ページがブラウザで開きます。ログインして閉じます。 

heroku login

f:id:makkynm:20210407074531p:plain

Herokuにログイン
Herokuにアプリ作成

下記のコマンドでアプリを作成します。herokublogmura という部分がアプリの名前になります。小文字のみで、英字から始まっている必要があります。英数字が指定できます。

heroku create herokublogmura

確認

HerokuにWebからログインして、アプリが作成されていることを確認します。

f:id:makkynm:20210407075950p:plain

アプリが作成されていることを確認
ChromeDriverとChromeを使えるようにする

この時点では、まだスクレイピングできない状態にあるので、アプリの設定から変更していきます。

WebからHerokuにログインして、Settingsを開いてください。

f:id:makkynm:20210407080124p:plain

アプリの設定

アプリの設定から、Buildpacksという項目にいき、下記の2つのURLを追加します。

それぞれ、ChromedriverとGoogle Chromeを使えるようにするためのものです。

https://github.com/heroku/heroku-buildpack-chromedriver.git

https://github.com/heroku/heroku-buildpack-google-chrome.git

f:id:makkynm:20210407080154p:plain

BuildpacksからURLを追加

f:id:makkynm:20210407080219p:plain

BuildpacksからURLを追加
Herokuにファイルを同期させる

最後に、ターミナルに戻ってファイルをHerokuに連携します。下記コードでPushされます。

git push heroku master

コンパイルのような作業をしているようです。完了まで時間かかります。

 

実行してみる

下記コマンドで実行できます。

heroku run python HerokuBlogMura.py

Heroku上で実行できたと思います。 

 

定期実行の設定を行う

さて、最後に定期実行のスケジュールを設定していきます。

クレジットカードの登録

定期実行する場合はAddonを追加する必要があります。そしてそのためにはクレジットカードの登録が必要です。プランを変えない限り課金されることはないみたいです!

登録方法は、アカウントアイコンからAccount settingsを選び、Billingを選択するとクレジットカード登録画面があります。

f:id:makkynm:20210408085542p:plain

クレジットカードの登録

f:id:makkynm:20210408085558p:plain

クレジットカードの登録

 

Add onを追加する

下記コマンドを打ち込むと、Add onが追加されます。クレジットカードを登録していないと、エラーで怒られます。

heroku addons:create scheduler:standard

f:id:makkynm:20210409074329p:plain

実行画面
Add onの設定画面を開く

 Add onの設定から定期実行の時間を指定していきます。下記コマンドを打つと、設定画面が開きます。

heroku addons:open scheduler

Webからこの画面に行くことも可能です。

f:id:makkynm:20210409074807p:plain

定期実行の設定画面に飛ぶ
定期実行を設定

最後に、Create jobのボタンから定期実行の設定をしていきます。

f:id:makkynm:20210409074913p:plain

定期実行を設定

スケジューラの設定は

  • タイミング
  • コマンド
  • マシンスペック

を指定すると完了です。

 

タイミングの設定

このタイミングの時間は、UTCで設定されます。朝6時に定期実行したい。とすると、UTCは+9時間なので、15時に設定します。

今回は毎日実行を選択しましたが、数時間ごととかも可能です。

 

コマンドを設定

次に実行コマンドの設定です。Prockfileと同じような書き方で問題ないでしょう。

python HerokuBlogMura.py

マシンスペックの設定 

何も考えず、デフォルトのStandard-1Xでいいと思います。

f:id:makkynm:20210409075213p:plain

スケジューラの設定

 

 

結果の確認

定期実行できているか確認してみましょう。 0時を超えた時点で自分のPCから自己クリックしておきました。

ブログ村のアクセスはIPアドレスで特定しているので、Herokuで定期実行すると、自己クリックではなく、他人がクリックしたことになります。 

なので、INポイント、OUTポイントが朝6時を過ぎたら10から20になれば定期実行されていることになります。なってそうですね。

f:id:makkynm:20210408090853p:plain

結果の確認

 

 

おわりに

 お疲れ様でした。今回はPythonの無料定期実行について解説しました。定期実行がクラウド上でできるようになると、スクレイピングの活用の幅がかなり広がりますよね!

使っていきたいです。

本ブログでは自動化に関する内容を紹介しています。よかったら見てください。ではまた!

degitalization.hatenablog.jp

 

 

 

余談 

Mac M1を購入している方へのおすすめをあげておきます。 

おすすめTypeC変換器: 7 in 1 

私はこちらを購入しました。HDMIVGAがついているので、拡張画面や発表するときには安心ですよね。また、USBポートはもちろん、TypeC、SDカードも含まれているので、これさえあれば最低限カバーできるはずです!

 

TypeC変換器 その2: 10 in 1 

有線のLANケーブルのポートも欲しいという方はこちらをお勧めします。また、USBポートが3つついていることも魅力ですね。

先ほどあげた、SDカード・HDMIVGA・TypeCも含まれているので、これさえあれば充分ですね!

 

Macbook用バック

あんまり傷つけたくないですよね。保護できるカバーも少しスマートに見えそうなものを選びました。

 

参考リンク