【Python】LINEに電車の遅延情報を送る
さて、前回の続きです。
今回は上記の記事の発展版であるスクレイピングしたデータをLINEに送る、というプログラムを作っていきます。対象となるサイトは、鉄道運行情報様のサイトです。
こちらのサイトをスクレイピングしてLINE NotifyのAPIを使い指定した時間に通知を送る、というところまでが今回の目標です。まずは前回の記事を参考にしてLINEで任意の文字列を送るところまでやってみてください。
使用した環境
モジュール
- BeautifulSoup(コマンドプロンプトにて pip3 install BeautifulSoup4 でインストール)
- urllib(標準モジュールのためインストール不要)
- re(”)
コード
私がスクレイピングする際にいつも使っている型を紹介します。
from bs4 import BeautifulSoup as bs import urllib.request as ur import re def Soup(): url = 'url' req = ur.urlopen(url) html = bs(req,"html.parser") return html #def Re(): #pa = '正規表現' #ma = re.findall(pa,Soup()) #return ma
簡単に説明すると、関数Soupでリンク先のhtmlを取得して関数Reの正規表現で欲しい情報だけを抽出するというものです。大体のhtmlは上記の関数Soupで抜けます。正規表現は抽出するhtmlによってその都度変わるのでこれに関しては以下の記事を参考にしてみて下さい。上記のコードによく使う正規表現の型かきましたが今回は使わないのでコメントアウトしました。
正直な話どの記事を読んでもの正規表現は理解できなかったのでいつもノリでやっています。
とりあえず中央線の運行情報が乗ったURLを関数Soupのurlに代入してhtmlを取り出してみます。
矢印のところを抜き出したいのですが、いちいちこの文字列を探すのが面倒なのでChromeを使いhtmlを視覚的に見える要素から、それがどのhtmlなのかを探す方法を紹介します。
中央線のページを使ってやっていきます。まずは右クリックで検証をクリック。
右にhtmlがズラッとでてきました。そしてなんにもない空白をクリックしてhtml側に標準を合わせます。(表現がわからないからわかって)
「command + f」を押す。
抽出したい文字列を入力。→ 一致。
簡単にまとめるとこう。
このようなhtmlがとれました。
<div class="corner_block_row_detail_d" style="padding-left:5px;"> 現在、平常通り運転しています。</div>
この中にある「現在、平常通り運転しています」という文字列を抽出していきます。
from bs4 import BeautifulSoup as bs import urllib.request as ur import re def Soup(): url = 'http://www.jikokuhyo.co.jp/search/detail/line_is/kanto_chuokaisoku' req = ur.urlopen(url) html = bs(req,"html.parser") return html #BeautifulSoupでhtmlを取得して変数htmlを戻り値としました match = Soup().find(class_="corner_block_row_detail_d").string.replace('\n','') #変数matchに正規表現を書きました #htmlが<div class>となっていたのでclassを指定します classとするとエラーがでるのでclass_とします #クラス名を先程取得した"corner_block_row_detail_d"をいれます。 #.stringでクラス内の文字列を抽出 無駄な改行があったので空白とreplaceしました #出力します print(match) #「現在、平常通り運転しています。」、又は遅延情報など運行情報が出たら成功
実際に遅延情報をLINEに送ってみる
前回の記事のコードをそのまま流用しました。
from bs4 import BeautifulSoup as bs import urllib.request as ur import re import requests def line(Me): line_notify_token = 'アクセストークン' line_notify_api = 'https://notify-api.line.me/api/notify' message = '\n' + Me payload = {'message': message} headers = {'Authorization': 'Bearer ' + line_notify_token} line_notify = requests.post(line_notify_api, data=payload, headers=headers) def Soup(): url = 'http://www.jikokuhyo.co.jp/search/detail/line_is/kanto_chuokaisoku' req = ur.urlopen(url) html = bs(req,"html.parser") return html match = Soup().find(class_="corner_block_row_detail_d").string.replace('\n','') text = '中央線快速の運行情報\n> ' + match #変数textで実際にLINEに送るテキストを編集しました line(text)
実行
先程のコードを"LINE.py"として保存しました。実行してみます。
python3 LINE.py
できた〜
これをcrontabを使って指定した時間に通知が来るように設定すれば便利です。
寝る