PythonでWebスクレイピング結果を自動でLINEに送る方法 ~写経用コードあり~

LINE吹き出し

 

別記事「機械にWeb予約を任せるため4つのステップ」では、機械にWeb予約を任せるための4つのステップということで、Pythonにブラウザ操作の自動化をさせることについて紹介しました。

 

そして、同記事に辿り着いた人の中には、ブラウザ操作の自動化を、実際にPythonでやってみたいと考えている方がいることと思います。

 

ということで、今回の記事では、

  • Pythonによるブラウザ操作の自動化に興味がある
  • 興味はあるけど何をやったらいいかわからないから最初はコードを写経から始めたい

 

という人に向けて、「指定した時間にWebページにスクレイピングを行い、その結果をLINEメッセージで送る方法」を、実際のPythonコードとともに紹介していきます。

 

 

PythonでWebスクレイピング結果を自動でLINEに送る方法

てるてる坊主

 

① LINE Notify トークンの取得

1. LINE Notify トークンの発行

 

今回は、スクレイピング結果をLINEに送ることから、LINE Notifyと呼ばれるサービスを利用していきます。

そのため、はじめに上記リンク先より、LINE Notifyのサービス利用登録および、アクセストークンの発行を行います。

 

LineNotifyWebSite画面

 

ここで発行されたトークンは、忘れずにコピーするように注意してください。

 

 

 2. LINEにメッセージを送付するテスト

 

トークンが取得できたら、さっそくPythonでLINEにメッセージを送れるかどうかを試します。

次のコードでLINEにメッセージを送ることができます。

なお、コード6行目には、みなさんがそれぞれ発行を受けたアクセストークンを指定する必要があります。

 

#ライブラリのインポート
import requests

#LINE通知用の関数
def line_notify(message):
    line_notify_token = '(発行されたトークンを設定)'
    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_notify("Hello World")

 

上記プログラムを実行した結果、LINEアプリで、

 [(トークン名)] Hello World 

というメッセージが表示されたら、テストは成功です。

 

では次からは、実際に存在するサイトにアクセスした結果をLINEに自動送付させるプログラムについて紹介していきます。

 

 

② LINEへのメッセージ送付

 

今回、例題として、YAHOO! Japanの天気予報のサイトの情報を、LINEにメッセージを送る方法を紹介していきます。

ここでLINEで通知させる情報は、指定エリアの天気予報のキャプチャ画面(次の画像のような)と、都道府県別の「天気予報」と「概況」の2つの情報とします。

 

Yahoo天気画面

 

プログラムの大まかな流れは次の通りです。

  1. 指定した時間に自動的にYahooの天気サイトにクローリングを行う
  2. 神奈川県東部の本日の天気(気温&降水確率)を画面キャプチャを行い、予報概況をスクレイピングする
  3. 画像ファイルを添付し、LINEメッセージを送る

 

 

1. ライブラリのインポート

 

はじめに、使用するライブラリの設定を行います。

import requests
from bs4 import BeautifulSoup
from selenium import webdriver
import sched, time, datetime

 

 

2. 画像データをLINEメッセージで送るための関数

 

テストで用いたのはメッセージのみ送る関数でしたが、ここでは、画像ファイルをLINEで送るための関数を用意します。

def line_notify_with_image(message,filename):
    line_notify_token = '(発行されたトークンを設定)'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    payload = {'message': message}
    headers = {'Authorization': 'Bearer ' + line_notify_token}
    files = {'imageFile': open(filename, 'rb')}
    requests.post(line_notify_api, data=payload, headers=headers, files=files)

 

 

3. クローラを起動させLINEにメッセージを送付させる関数

 

ブラウザ操作の自動化を行う「Selenium(セレニウム)」を用い、Yahooの天気サイトに入り、画面キャプチャと情報のスクレイピングを行うコードを用意します。

 

def check_today_weather():
    filename = "本日の天気.png"

    # クローラーの起動
    driver = webdriver.Firefox()

    #指定したドライバの要素が見つかるまでの待ち時間を10秒に設定
    driver.implicitly_wait(10)

    # Yahooの天気サイトにアクセス(かながわ)
    driver.get('https://weather.yahoo.co.jp/weather/jp/14/?day=1')

    # ソースコードを取得
    html = driver.page_source
    
    driver.get('https://weather.yahoo.co.jp/weather/jp/14/4610.html')
    #申込結果の画面をキャプチャする
    driver.save_screenshot(filename)
    # ブラウザを終了する
    driver.quit()

    # HTMLをパースする
    soup = BeautifulSoup(html, 'lxml') # または、'html.parser'

    # スクレイピングした《今日の日本の天気予報の概況》を変数に格納
    message = soup.select_one('#condition > p.text').get_text()

    # LINEに通知させる
    line_notify_image(message,filename)

 

これで、スクレイピングの実行に必要な関数の準備ができました。

 

 

 4. 指定した時間にプログラムを実行させる

 

最後は、指定した時間にプログラムを実行させるコードを用意します。

ここでは、イベントスケジューラー「sched」を使用し、朝6時にプログラムが自動的に実行されるコードとしました。

 

#自動実行プログラム本体
s = sched.scheduler(time.time, time.sleep)
 
et = datetime.datetime(2021, 8, 29, 6, 0) 
et = int(time.mktime(et.timetuple()))  
 
s.enterabs(et, 1, check_today_weather_only_text) #新しいイベントをスケジュール
s.run() #全てのスケジュールされたイベントを実行

 

これで、寝る前にプログラムを実行させておけば、次の日の朝など、指定した日時に、天気予報の情報がLINEで届くようになります。

 

ということで、コメントアウトを除き、たった28行のコードでプログラムを作ることが来ました。

1つ注意点として、プログラムを実行させた場合でも、深夜の時間帯にWindows Updateやスタンバイモードに入ってしまうと、Pythonの実行タスクが途切れてしまうため、そのようなことにならないように、実行の前にはパソコンの設定を確認するようにしてください。

 

 

まとめ

 

今回の記事では、「指定した時間にWebページにスクレイピングを行い、その結果をLINEメッセージで送る方法」について、実際のPythonのコードとともに紹介していきました。

 

今回は、天気予報の情報をLINEに送る方法を紹介しましたが、Seleniumの操作を応用させることで、Webサイト上の自動予約なども可能となります。

 

もし、あなたが定期的に行っているブラウザ操作の処理があるとすれば、それはPythonに任せることができるかもしれません。

Pythonはデータサイエンスで注目を集めているプログラミング言語ですが、Pythonはデータサイエンスに限らず、あなたの作業生産性を上げてくれる武器になるかもしれないプログラミング言語となりますので、Pythonを習得してみてはいかがでしょうか?

 

関連記事

機械にWeb予約を任せるため4つのステップ

Pythonで散布図の特異なデータを色分け表示させる方法

ABOUTこの記事をかいた人

パラレルキャリア研究会創設メンバー 岩手県出身。東北大学工学部卒、同大学院工学研究科修了。半導体メーカーに入社後、エンジニアとして半導体製品の企画・開発に10年以上従事。独学&パラ研の場でPythonや統計学を学習中。1児のパパ。趣味は日本酒、ロードバイク。中小企業診断士。