LoginSignup
31
29

More than 3 years have passed since last update.

yahoo路線の運行情報を取得したい

Last updated at Posted at 2019-12-14

背景

とあるTwitterのBot作成で、どーしても、電車の運行情報が必要となった。
どこからか、無料で特定の路線のみの運行情報を引っ張って来れないかな〜と色々考えた結果、
yahoo路線からスクレイピングするのが最適解だと分かった。

運行状況を配信しているapiやらサイトやら

色々調べて、現在、路線の運行情報を配信しているのは
1. 鉄道遅延情報のjson (json形式で、遅延などが生じている路線を集計して、返してくれる)
2. 駅すぱあとのapi (優秀そう!でも有料有料)
3. yahoo路線の運行状況 (一番馴染みのあるやつ、でもapiない!!!)

結局の話、無料でやるならば、鉄道遅延情報のjsonyahoo路線の運行状況になってくる。
前者の場合、全国の遅延している路線情報が返ってくる。あとは情報の更新が10分ごと...朝の通勤ラッシュでは10分でさえも命とり。

後者のyahoo路線、実は中身が駅すぱあとだったりする....笑(意外と知られていない)
路線ごとに運行情報もあるし、正確かつリアルタイムで早い!じゃあ
apiがないんだったらスクレイピングしてしまえ!

yahoo路線の運行情報をスクレイピング

スクレイピングの「す」もやったことのない筆者がスクレイピングをやってみる。
どうやら「BeautifulSoup」ってのを使うらしい...
すばっらしいスープを見せてもらおうじゃないかっ!

BeautifulSoupってなーに??

BeautifulSoupはHTMLやXMLファイルからデータを取得するPythonのライブラリ。
どうやら、取ってきたHTMLから、パーサーってものを使ってHTMLの要素を検索できたりする。
細かいことは分からないから、早速やってみよう!

レッツ!スクレイピング!

今回スクレイピングしたいサイトはこちら!
yahoo路線 東海道線の運行状況
まずは、ページのhtmlを覗いてみよう
スクリーンショット 2019-12-14 11.46.02.png
遅延時のHTMLを見てみると、ddタグのtroubleクラスがある

<div id="mdServiceStatus">
  <dl>
  <dt>
  <span class="icnAlertLarge">[!]</span>列車遅延</dt>
  <dd class="trouble">
   <p>宇都宮線内で線路内点検を行った影響で、下り線(熱海方面行)の一部列車に遅れが出ています。 <span>(12月14日 09時25分掲載)</span></p>
 </dd>
 </dl>
</div><!--/#mdServiceStatus-->

一方で、通常時のHTMLを覗いてみるとddタグのnormalクラスがある

<div class="elmServiceStatus">
    <dl>
    <dt><span class="icnNormalLarge">[○]</span>平常運転</dt>
    <dd class="normal">
        <p>現在、事故・遅延に関する情報はありません。</p>
    </dd>
    </dl>
</div>

つまり
遅延時: troubleクラスのddタグ
通常時: normalクラスのddタグ

このddタグを元に、遅延か、通常運転かを判別ができそう!
さっそくやってみよう!

インストール

まずはpipでBeautifulSoupを入れる

$ pip install beautifulsoup4 

コード

import requests
from bs4 import BeautifulSoup

#東海道線の運行状況のURL
ToukaidouLine_URL = 'https://transit.yahoo.co.jp/traininfo/detail/27/0/'

#Requestsを利用してWebページを取得する
ToukaidouLine_Requests = requests.get(ToukaidouLine_URL)

# BeautifulSoupを利用してWebページを解析する
ToukaidouLine_Soup = BeautifulSoup(ToukaidouLine_Requests.text, 'html.parser')

#.findでtroubleクラスのddタグを探す
if ToukaidouLine_Soup.find('dd',class_='trouble'):
    message = '東海道線は遅延しています'
else:
    message = '東海道線は通常運転です'

print(message)

実行結果

東海道線は遅延しています

感想

めっちゃ簡単じゃない??webページから情報を持ってこれるのは夢広がる!
後日談:yahooの人に見せたら、「グレーゾーンだね」と言われたのは内緒

31
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
29