こんにちは、皆さん!

今回はデータをオンライン上から引っ張ってくるスクレイピングをHerokuで行う方法を紹介しようと思います。


トピック


Herokuでスクレイピングする必要性

スクレイピングは好きなサイトから情報を集めてきてくれるので、自分が欲しい情報によって、スクレイピングをすれば、必要な情報を簡単に集めることができます。ただローカルでしかこれをやることできない場合、自分がパソコンにアクセスでき、そして、十分なWi-Fi環境がないといけません。

しかし、Heroku上でスクレイピングすれば、自分の好きな情報を好きな時に通知してくれるようなアプリを作ることができ、それによって、いつでも好きな情報を受け取ることができるようになります。

その他にもここでスクレイピングした情報をデータベースに保存して、ご自身のアプリ内で活用することもできます。


セットアップ

今回はPythonでスクレイピングをしていきます。

大事になってくるのはローカルではオンライン上からダウンロードしたChromeのスクレイピング用ドライバーをHeroku上でどうするかという部分です。これはスクライピングする時に使うSeleniumの型になります(つまりどのブラウザでスクレイピングするか)。

結論から行きますと、下記のChromeのパッケージとそのドライバーをHerokuアプリに導入する必要があります。


幸い、どちらもHerokuが用意してくれたものですので、そのままHerokuのコンソールからアプリに追加することができます。

まずはHerokuアプリ内のsettingsに行き、そこからAdd buildpackを選びます。

Buildpackの追加画面

そしたら、そこに先ほどのGithubのURLをそれぞれ入れます。

Chromedriverの追加

Chromeの追加

これが完了したら、あとはアプリ内からこれらにアクセスできるように環境変数でそれぞれのPathを追加しましょう。

  • CHROMEDRIVER_PATH = /app/.chromedriver/bin/chromedriver
  • GOOGLE_CHROME_BIN = /app/.apt/usr/bin/google-chrome

Herokuでの環境変数がわからない方はこちらを参照してください↓


ここまで来たらあとはPythonコードの中でこれらにアクセスすれば良いです。

ここではドライバーをセットアップしてくれる関数でそのドライバーを返したいと思います。

import os
from selenium import webdriver

def driver_setup():
    chrome_options = webdriver.ChromeOptions()
    chrome_options.binary_location = os.environ.get("GOOGLE_CHROME_BIN")
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--disable-dev-shm-usage")
    chrome_options.add_argument("--no-sandbox")
    driver = webdriver.Chrome(executable_path=os.environ.get("CHROMEDRIVER_PATH", "/usr/local/bin/chromedriver"), chrome_options=chrome_options)
    return driver

os.environ.get()の部分で環境変数の値を取ってきています。それぞれがバイナリの場所そして、ドライバー情報を担当するようになっています。

ここではSeleniumのGithub上に載っているような簡単なセットアップにしました。そのほかで追加したものとしてはchrome_options.add_argument("--headless")くらいです。こうすることで、実際にブラウザで何が起きているかをUIで表示する必要がなくなりますので、スピードが上がります。元々Heroku上でやる分には見えないので、当然の設定ですね。


そしたら、下記のようにドライバーを作り、それで特定のURLのウェブサイト内容を引っ張ってこれます。

driver = driver_setup()
driver.get("https://kabutan.jp/stock/?code=7203")

この例では株探というサイトからトヨタ自動車の株価情報が載っているサイトの内容を引っ張ってきています。

ドライバーでウェブサイト内容を手に入れた後にどのように処理をしていくのかどうかはPythonでスクレイピングする方法等で検索してください。


Herokuである時間になったら、そのスクレイピングが始まるようにしたい場合はHeroku SchedulerというHeroku内の無料のアドオンを使って、このスクレイピングのコードが入ったPythonファイルを指定した時間に呼び出しましょう。

Heroku Schedulerに関してはこちらの記事にまとめましたので、ぜひ参考にしてみてください↓


注意点

最後にHerokuでスクレイピングしていく上で注意していただきたいことを述べておこうと思います。


スクレイピングが30分以上かかる場合は途中で止まる

デフォルトの無料のHerokuのアプリですと、制約の30分アクセスがなかった場合にスリープするというものがあります。これはスクレイピングの時にも同様に適用されるようで、スクレイピングに30分以上かかるようでしたら、自動的に途中で止まってしまいます。

そのような大きなスクレイピングを行いたい場合は月7ドルくらいのHobbyプランに移行してください。そしたら、もうスリープしないので、うまくいくはずです。

Heroku内に生成したファイルを保存することはできない

次にデータベースではなく、例えば、CSVファイルにスクレイピングした結果を保存したい場合、Herokuがエフェメラルファイルシステム(ephemeral file system)を使用しているため、Heroku内で生成したファイルたちは保存されませんので、注意が必要です。

解決策としてはAWSのS3に生成したファイルをアップロードするというものがあります。


まとめ

今回はHerokuでスクレイピングする方法をご紹介させていただきました。導入部分のやり方と簡単な説明だけになりますが、これで皆さんのアプリがHeroku上でうまく機能すると嬉しいです。

僕は最初、自動で全ての株価を確認して、そのうちで僕が作ったアルゴリズムに該当するものだけを毎日調べて通知してくれるようなアプリを作りたかったので、Heroku上でスクレイピングを始めました。とても便利で、毎日普通に過ごしていると、決まった時間に通知をくれて、一部分の銘柄だけを確認すればよかったので、とても助かりました。

スクレイピングには2時間かかってしまっていたので、課金は余儀なくすることになりましたが。。。


皆さんの役に立つことを願います!
では、また次回まで✌
記事更新はツイッターで告知するので、ツイッターの方でもフォローお願いします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です