天気予報をPythonでスクレイピングしてTwitter APIで自動投稿する方法!

2020年10月14日

Python
スクレイピング
自動化

天気予報をスクレイピングしてTwitterに自動ツイートするBotを作成してみた!!

どうも、テック備忘LOGのYuki(@tech_bibo_log)です!!

今回はWebスクレイピングで取得したYahoo 天気!の情報をTwitter APIを使用して自動ツイートしてくれる、 Botを作成するまでの手順を紹介していきたいと思います。


Yuki

この記事で分かること

  • Webスクレイピングの方法
  • Twitter APIの使用方法
  • Pythonプログラムを定期実行する方法


先日Twitterのアカウントを開設したので、自動でツイートできるBotが作ってみました。
せっかくなので紹介していきたいと思います!!
実行環境があれば手順通りの作業であなたも実装できますよ。

では、始めましょう!!

▽▽▽ ツイート解析プログラムを作成した時のお話し ▽▽▽



[ 目次 (開く) ]

まずは環境を整える

今回使用した環境は次の通りです:
1. ConoHa VPS(CentOS8)
2. python 3.6.8
3. pip 20.0.2 (from /usr/local/lib/python3.6/site-packages/pip (python 3.6))
4. beautifulsoup4 4.9.0
5. requests 2.20.0


まだLinux環境が無い方は次の記事を参考にしてください。

▽▽▽ サーバーを用意した時のお話し ▽▽▽



1.tweepyなど各種モジュールをインストールしよう!!

まずは、後々Twitter APIからツイートをする際に使用するtweepyやその他必要なモジュールをインストールしておきます。

requestsはhttpリクエストを実行し、beautifulsoup4でスクレイピングしたページのHTMLから必要な部分を抽出します。
次のコマンドを実行しましょう。

# pip install tweepy
# pip install requests
# pip install beautifulsoup4

バージョンの確認方法は次のようにします。

# pip show tweepy
# pip show requests
# pip show beautifulsoup4

Twitter Developerに登録する

次にTwitterに外部からツイートしたりするために必要なTwitter APIを使用するために、 Twitter Developerに登録しましょう!

Twitter Developer画面

実はこのAPIの利用目的に関して英語で質問に答える必要があるうえ、利用審査に落ちる人も少なくないそうです。 巷では審査が厳しいと言われるTwitter Developer登録完了までの全体の流れは次の通りです。

Twitter Developer登録までの流れ

  • Twitterのアカウント開設
  • Twitter Developerで開発者アカウントを登録、利用申請
  • Twitter社とメールで詳細のやり取り(審査落ちなどの場合)



1.Developerサイトにアクセスしよう!

まずはTwitterにログインした状態で、Twitter Developerのサイトにアクセスします。

2.appを登録しよう!

「Create an app」ボタンをクリックします。 Twitter Developer画面

3.Developer toolsの主な使用用途を選択しよう!

今回はツイッターBotを作成したいので「Making a bot」を選択します。
また、その2つ下の「Exploring the API」など目的に近いもので構いません。 Twitter Developer画面

4.ユーザー情報を設定しよう!

「住んでいる国」と「ニックネーム(適当)」を記入します。
アップデート情報のメールの有無を選択したら次へ進みます。 Twitter Developer画面

5.利用目的に回答しよう!(英作文)

さてここが最も大変なところでしょう。
Twitter APIの使用目的に関する最大5問の質問に英文で回答する必要があります。
※日本語で回答しても審査に通ったという方もいる様ですが...

質問1: 「In English, please describe how you plan to use Twitter data and/or APIs...(Twitter APIまたはTwitterデータの利用方法を教えて下さい)」
ここでは、APIを使ってどの様なことをしたいのか説明してください。
Twitter Developer画面

質問2: 「Are you planning to analyze Twitter data?(ツイッターのデータを利用しますか?)」
ここでは、APIを使ってTwitterのデータを分析するか、しないかを回答してください。
分析する場合は、100文字以上の英文で「どの様にデータを分析するのか」を回答してください。
Twitter Developer画面

質問3: APIを使用してツイート、リツイート、いいね(省略)を行いますか?
ここは、そのままの意味ですので「Yes」「No」を選択し、「Yes」の場合は予定している利用方法を100文字以上の英文で説明してください。
Twitter Developer画面

質問4: 「Do you plan to display Tweets or aggregate data about Twitter content outside of Twitter?(Twitter以外のTwitterコンテンツに関するツイートを表示したり集計データを表示するか?)」
今回は利用しないため「No」にします。
Twitter Developer画面

質問5: 「Will your product, service or analysis make Twitter content or derived information available to a government entity?(あなたの製品・サービス,または分析によって,Twitterコンテンツまたは派生情報が政府機関が利用可能になりますか?)」
今回は利用しないため「No」にします。
Twitter Developer画面

全てに回答したら確認画面に進みます。
内容を確認してさらに次へ進みましょう。

最後に利用規約に同意して「Submit Application」をクリックすれば申請完了です。
Twitter Developer画面

「You did it!!」 この画面が表示されれば申請は終わりです。
Twitter Developer画面

あとは審査結果を待ちましょう!

Yuki



早ければ既にTwitterからの本登録メールが届いているので、メールに記載されているURLにアクセスして登録が完了です。 Twitter Developer画面

続いてアプリケーション登録とAPIキー、トークンの取得へと進みます。

Twitter Developerサイトで各種キー・トークンの取得

Twetter APIを使用するためには「アクセスキー」「アクセストークン」での認証が必要になるので、Developerサイトからこれらを取得します。

各種キー・トークン取得までの流れ

  • アプリケーションを登録
  • APIキー、アクセストークンを取得



1.Developerサイトにアクセスしよう!

まずはTwitterにログインした状態で、Twitter Developerのサイトにアクセスします。

2.アプリケーションを登録しよう!(その1)

画面の操作によって若干手順が異なるかもしれませんが、「Create an app」や次のようなアプリケーションを登録する画面に行きます。
まずは、32文字以内のアプリケーション名(適当)を決め「Get keys」をクリックします。
Twitter Developer画面

3.アプリケーションを登録しよう!(その2)

ダッシュボードでまとめて取得できるので、「Skip to dashboard」をクリックします。 Twitter Developer画面

4.各種キー・トークンを取得しよう!

ダッシュボード画面より作成したアプリケーション名の「鍵アイコン」をクリックして、「API Key」「API Key secret」「Access token」「Access token secret」を生成(Generate)・取得します。
メモ帳などにコピーしておきましょう!簡単なので説明は省きます。 Twitter Developer画面

Twitter Developer画面

Twitter Developer画面

Twitter Developer画面

天気予報をスクレイピングして、指定時刻に自動ツイートするBotを作成

続いては、Pythonを使用したスクレイピング処理とTwitter APIを使用した外部からのツイートをcronを利用して定期実行するBotシステムを構築していきましょう。

今回はYahoo天気のページをスクレイピングしました。
※お天気情報配信サービスに関わらず、Webページ上の情報を抜き出して再利用することを利用規約で禁じているサイトもあります。 そういったサイトの情報をスクレイピングで抜き出した場合、法的に訴えられることもあるため注意が必要です。

1.Pythonプログラムファイルを作成しよう!

コードを書いていくためのPythonファイルを作成します。
今回は次のディレクトリ構成で実行するとします。

ディレクトリ構成: /opt/scripts/weatherBot/
Pythonファイル名: weatherBot.py
Pythonファイル フルパス: /opt/scripts/weatherBot/weatherBot.py

前提:
1. /opt/scripts というディレクトリを作成済み


# cd /opt/scripts/
# mkdir weatherBot ← ディレクトリを作成
# touch weatherBot.py ← Python実行ファイルを作成
# vi weatherBot.py ← Python実行ファイルを編集



ソースコードのサンプルは、次の通りです。

#!/usr/bin/python3
import tweepy
import requests from bs4 import BeautifulSoup


# Twitter APIを使用するためのConsumerキー、アクセストークン設定
Consumer_key = 'APIキー'
Consumer_secret = 'APIシークレットキー'
Access_token = 'アクセストークン'
Access_secret = 'アクセスシークレットトークン'

# ツイートのテンプレート文 content = """ おはようございます! 今日もまた、一歩前進しましょう。 今日の天気予報は...? ※自作Bot by CentOS8 + Python3 + Twitter API + cronで実行 """

# URLを指定 urls = { '札幌市 ' : 'https://weather.yahoo.co.jp/weather/jp/1b/1400.html', '東京  ' : 'https://weather.yahoo.co.jp/weather/jp/13/4410.html', '名古屋市' : 'https://weather.yahoo.co.jp/weather/jp/23/5110.html', '大阪市 ' : 'https://weather.yahoo.co.jp/weather/jp/27/6200.html', '福岡市 ' : 'https://weather.yahoo.co.jp/weather/jp/40/8210.html', }

def twitter_auth(): """Authenticate Twitter API account with Consumer_key, Consumer_secret, Access_token, Access_secret Returns: Twitter API authenticated session. """ #Twitter 認証 auth = tweepy.OAuthHandler(Consumer_key, Consumer_secret) auth.set_access_token(Access_token, Access_secret) api = tweepy.API(auth, wait_on_rate_limit = True) return api

def tweet(api): """Tweet contents""" str = '' for city, url in urls.items(): # requestsでHTTPリクエスト結果を取得し、BeautifulSoupで扱えるように変換 r = requests.get(url) soup = BeautifulSoup(r.content, 'html.parser') # 今日の天気 tenki_today = soup.select_one('#main > div.forecastCity > table > tr > td > div > p.pict') str += f'{city}: {tenki_today.text}\n' # ツイート api.update_status(content + '\n' + str)

################################ ## 処理を行う ## ################################ if __name__ == '__main__': ← アンダースコア(_)を半角に直してください。 api = twitter_auth() tweet(api)



以上で、天気情報のスクレイピングとAPIから投稿する機能の実装は完成です!!

あと少ぉぉぉぉぉぉし!!頑張りましょう。

Yuki



cronで定期実行

続いて、先程作成したプログラムを定期実行するためにcronを設定していきたいと思います。

1.ファイルの権限を変更しよう!

まずはその前に、ディレクトリ含めPython実行ファイルの権限を変更しておきましょう。
※環境によってはcronからの実行に失敗する場合があるため

chmod -R 755 /opt/scripts/weatherBot

2.cronを設定して定期実行しよう!

最後にcrontab -eコマンドを実行し、以下の設定をします。
ここでは毎日、AM07時00分、08時00分、09時00分と3回にわたって実行するようにセットしています。

# Twitter天気ボット
00 7,8,9 * * * /usr/bin/python3 /opt/scripts/weatherBot/weatherBot.py


まとめ

これで「天気予報をPythonでスクレイピングしてTwitter APIで自動投稿する方法」の説明は以上です。
いかがでしたでしょうか?!

実際にやっていることは実はそんなに難しいことではありません!!
スクレイピングの部分もとてもシンプルですし、Twitter APIをコールする部分も「tweepy」モジュールを使用しているので簡潔に書くことが出来ました。

初心者の方は是非、一度上記のコードをコピペして動かしてみて、さらに一つ一つ理解しながらリタイピングしてみてくださいね!!
ご指摘や質問があれば(@tech_bibo_log)までお願い致します。
※私もPythonは勉強中なのでもっと良い書き方があればぜひ教えてください!よろしくお願いします。

Yuki



では、最後にもう手順を一度おさらいしましょう。

今回行った作業の流れ

  • Twitterのアカウント開設
  • Twitter Developerで開発者アカウントを登録、利用申請
  • Twitter社とメールで詳細のやり取り(審査落ちなどの場合)
  • アプリケーションを登録
  • APIキー、アクセストークンを取得
  • Pythonプログラムを作成&&ファイルの権限変更
  • cronを設定



私にやってみて欲しいネタとかあれば(@tech_bibo_log)までDMお待ちしております!!
それでは、ありがとうございました!

▽▽▽ Twitter Botを作成した時のお話し ▽▽▽