読者です 読者をやめる 読者になる 読者になる

もなかアイスの試食品

「とりあえずやってみたい」そんな気持ちが先走りすぎて挫折が多い私のメモ書きみたいなものです.

【Python】スクレイピングで電車の運行情報を取得してみた

Python

はじめに

最近、Slackというチャットサービスを個人的に利用していて

Slack APIを使って電車の運行情報をチャットで流せないかなーて考え中

電車の運行情報のAPIを公開されているけどお金がかかる・・・

プライベートで公開されている方もいるけど、こだわり始めるとその方のサーバに負荷かけそう

大手サイトのWEBページから取得できたらいいなーと思っていたら、

Qiitaに情報が載っていた

qiita.com


このサイトを見るまで「スクレイピング」という単語を知らなかった・・・

情報元

電車の運行情報で、時々利用するのが以下のサイト。

Pythonを動かしているときにちょうど遅延情報が出ていた。

transit.yahoo.co.jp

江ノ島電鉄線は利用したこと無いけど

見た目はこんな感じ

f:id:monakaice88:20170122124201p:plain


htmlの構造はこんな感じ

f:id:monakaice88:20170122124522p:plain


このサイトから、Python3.5とライブラリ「Beautiful Soup4」を利用して運行情報を取得する

環境構築の準備

私はAnacondaをWindowsにインストールしているため、以下のコマンドで今回用の環境を構築

conda create -n py35 python=3.5 anaconda
activate py35
pip install beautifulsoup4

実装

あまり深く考えず、参考にしたサイトを見よう見真似でコード作成

# -*- coding: utf-8 -*-

import urllib.request
import bs4

url = 'http://transit.yahoo.co.jp/traininfo/detail/148/0/'
html = urllib.request.urlopen(url).read()
soup = bs4.BeautifulSoup(html, 'lxml')

informationElement = soup.find('div', {'id': 'mdServiceStatus'})
information = informationElement.find('p').find(text=True, recursive=False)

postingDateElement = informationElement.find('p').find('span')
postingDate = ''
if postingDateElement is not None:
    postingDate = postingDateElement.find(text=True, recursive=False)

print(information + postingDate)


実行結果

f:id:monakaice88:20170122125611p:plain

とりあえず運行情報が取得できるようになったので、DBも利用してSlackを通して運行情報を知らせるサーバを構築しよう