Help us understand the problem. What is going on with this article?

函館バスロケーションシステムおぼえがき

函館バスのロケーションシステム

APIはない。
バス停名は正式なものを入れないとだめなので、バス停名を調べる。

キーワードからバス停名取得

ひらすらフォームでキーワードを指定すればいいっぽい。
乗車地点のfromsearchと降車地点のtosearchでファイルを分けているのが謎。

curl -X POST -F 'term=五稜郭' -F 'language=ja' -F 'gps=false' -F 'mapFlag=false' https://hakobus.bus-navigation.jp/wgsys/wgp/fromsearch.htm
[
  {
    "stopName": "五稜郭",
    "stopType": "1",
    "latitude": null,
    "longitude": null
  },
  {
    "stopName": "五稜郭駅前",
    "stopType": "1",
    "latitude": null,
    "longitude": null
  },
  {
    "stopName": "五稜郭公園入口",
    "stopType": "1",
    "latitude": null,
    "longitude": null
  },
  {
    "stopName": "五稜郭公園裏",
    "stopType": "1",
    "latitude": null,
    "longitude": null
  },
  {
    "stopName": "五稜郭タワー前",
    "stopType": "1",
    "latitude": null,
    "longitude": null
  },
  {
    "stopName": "五稜郭病院前",
    "stopType": "1",
    "latitude": null,
    "longitude": null
  },
  {
    "stopName": "五稜郭公園",
    "stopType": "2",
    "latitude": null,
    "longitude": null
  },
  {
    "stopName": "五稜郭タワー",
    "stopType": "2",
    "latitude": null,
    "longitude": null
  },
  {
    "stopName": "JR五稜郭駅",
    "stopType": "2",
    "latitude": null,
    "longitude": null
  },
  {
    "stopName": "函館五稜郭病院",
    "stopType": "2",
    "latitude": null,
    "longitude": null
  }
]

"stopType"が1はバス停、2はランドマーク名。
どっちでもいいっぽい。

接近情報取得

htmlで帰って来て最悪。

curl 'https://hakobus.bus-navigation.jp/wgsys/wgp/bus.htm?tabName=searchTab&selectedLandmarkCatCd=&selectfiftySoundCharacter=&from=五稜郭&fromType=&to=函館駅前&toType=1&locale=ja&fromlat=&fromlng=&tolat=&tolng=&fromSignpoleKey=&routeLayoutCd=&bsid=1&fromBusStopCd=&toBusStopCd=&mapFlag=false&existYn=N&routeKey=&nextDiagramFlag=&diaRevisedDate='

fromとtoに取ってきたバス停名を入れればいいみたい。

欲しい情報を抜きとる

div.route_box>tableに入っているのでがんばる。
吐き出されるhtmlには を多様するなど、職人の技が光る。

bus.py
from bs4 import BeautifulSoup
import re
with open('bus.html') as html_file:
    soup = BeautifulSoup(html_file, 'html.parser')

buses = soup.select("div.route_box")
for bus in buses:
    b = bus.find_all("td")
    route = re.sub("\s", "", b[1].text)
    via = re.sub("\s|経由", "", b[2].text)
    to = re.sub("\s|行き", "", b[3].text)
    departure_stop = re.sub("\s|発", "", b[8].text)
    scheduled_departure = re.sub("\s|予定時刻", "", b[9].text)
    estimated_departure = re.sub("\s|発車予測", "", b[10].text)
    arrival_stop = re.sub("\s|着", "", b[12].text)
    scheduled_arrival = re.sub("\s|予定時刻", "", b[13].text)
    estimate_arrival = re.sub("\s|到着予測", "", b[14].text)
    approximately = re.sub("\s|所要時間:|分", "", b[18].text)
    change = re.sub("\s|乗り換え:", "", b[19].text)
    bus_type = re.sub("\s|車種:", "", b[20].text)
    waiting = re.sub("\s|約|分で発車します", "", b[24].text)
    print(route, via, to, departure_stop, scheduled_departure, estimated_departure, arrival_stop,
          scheduled_arrival, estimate_arrival, approximately, change, bus_type, waiting)

欲しい情報をスクレイピングするとこんな感じになった。

25系統 五稜郭・函館駅 函館駅前・函館バスセンター 五稜郭 20:03 20:10 函館駅前 20:16 20:24 14 なし  まもなく発車します
91A系統  函館駅前・バスセンター 五稜郭 20:08 20:10 函館駅前 20:23 20:26 16 なし ノンステップ まもなく発車します
91A系統  函館駅前・バスセンター 五稜郭 20:09 20:12 函館駅前 20:23 20:26 14 なし ノンステップ まもなく発車します
67系統 松風町 函館駅前 五稜郭 20:08 20:13 函館駅前 20:26 20:26 13 なし ノンステップ 4
67系統 松風町 函館駅前 五稜郭 20:11 20:15 函館駅前 20:26 20:26 11 なし ノンステップ 6
33系統 五稜郭 函館駅前・函館バスセンター 五稜郭 20:18 20:19 函館駅前 20:32 20:34 15 なし ノンステップ 10
33系統 五稜郭 函館駅前・函館バスセンター 五稜郭 20:19 20:20 函館駅前 20:32 20:34 14 なし ノンステップ 11
60A系統 松風町 函館駅前・函館バスセンター 五稜郭 20:28 20:31 函館駅前 20:42 20:46 15 なし ノンステップ 22
60A系統 松風町 函館駅前・函館バスセンター 五稜郭 20:29 20:32 函館駅前 20:42 20:46 14 なし ノンステップ 23
19系統  函館駅前・函館バスセンター 五稜郭 20:30 20:36 函館駅前 20:46 20:49 13 なし ノンステップ 27

正気か?

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away