Search 4 Truth

Search 4 Truth

Pythonと仮想通貨

【Python】LINEに電車の遅延情報を送る

さて、前回の続きです。

s4t.hatenablog.com

今回は上記の記事の発展版であるスクレイピングしたデータをLINEに送る、というプログラムを作っていきます。対象となるサイトは、鉄道運行情報様のサイトです。

こちらのサイトをスクレイピングしてLINE NotifyのAPIを使い指定した時間に通知を送る、というところまでが今回の目標です。まずは前回の記事を参考にしてLINEで任意の文字列を送るところまでやってみてください。

使用した環境

  • MacBook Air Early 2015 Sierra 10.12.6
  • Python 3.6.2
  • iTerm2(コマンドプロント)
  • 前回の記事で取得したアクセストークン
  • Chrome(htmlを読むため)
  • 鉄道運行情報で通知を送りたい路線のURL(今回は中央線を使用)

モジュール

  • 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によってその都度変わるのでこれに関しては以下の記事を参考にしてみて下さい。上記のコードによく使う正規表現の型かきましたが今回は使わないのでコメントアウトしました。

qiita.com


正直な話どの記事を読んでもの正規表現は理解できなかったのでいつもノリでやっています。

とりあえず中央線の運行情報が乗ったURLを関数Soupのurlに代入してhtmlを取り出してみます。

f:id:lisbeths:20180110105859p:plain

矢印のところを抜き出したいのですが、いちいちこの文字列を探すのが面倒なのでChromeを使いhtmlを視覚的に見える要素から、それがどのhtmlなのかを探す方法を紹介します。

中央線のページを使ってやっていきます。まずは右クリックで検証をクリック。

f:id:lisbeths:20180110110749p:plain

右にhtmlがズラッとでてきました。そしてなんにもない空白をクリックしてhtml側に標準を合わせます。(表現がわからないからわかって)

f:id:lisbeths:20180110111413p:plain

「command + f」を押す。

f:id:lisbeths:20180110111837p:plain

抽出したい文字列を入力。→ 一致。

f:id:lisbeths:20180110150955p:plain

簡単にまとめるとこう。

f:id:lisbeths:20180110112920p:plain

このような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

できた〜

f:id:lisbeths:20180110131352p:plain

これをcrontabを使って指定した時間に通知が来るように設定すれば便利です。

s4t.hatenablog.com

寝る