新幹線の空席情報をスクレイピング

rfushimi.hatenablog.jp

import datetime
import os
import time

import requests
from bs4 import BeautifulSoup


def say(text):
    print(text)

    os.system(
        rf'powershell -NoProfile -ExecutionPolicy Unrestricted .\speech.ps1 -Arg1 "{text}"'
    )


url = "http://www1.jr.cyberstation.ne.jp/csws/Vacancy.do"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko",
    "Referer": "http://www1.jr.cyberstation.ne.jp/csws/VacancyReinput.do",
}

# 日付
dt = datetime.date(2020, 1, 7)

# 時間範囲
time_range = range(6, 15)

payload = {
    "script": 1,
    "month": dt.month,
    "day": dt.day,
    "hour": "06",
    "minute": "00",
    "train": 1,
    "dep_stn": "福山",
    "arr_stn": "東京",
    "dep_stnpb": 6220,
    "arr_stnpb": 4000,
}

for i in time_range:

    payload["hour"] = f"{i:02}"

    try:
        r = requests.post(url, headers=headers, data=payload)

    except:
        time.sleep(10)
        continue

    soup = BeautifulSoup(r.content, "html.parser")

    table = soup.find(
        "table",
        attrs={"width": "550", "cellspacing": "1", "border": "3", "bgcolor": "#ffffff"},
    )

    for tr in table.find_all("tr", recursive=False)[2:-1]:

        tds = [td.get_text(strip=True) for td in tr.find_all("td")]

        if tds[3] != "×":
            say(f"普通車に空席があります: {tds[1]}, {tds[0]}")

        if tds[5] != "×":
            say(f"グリーン車に空席があります: {tds[1]}, {tds[0]}")

    time.sleep(5)

speech.ps1

Param(
    [String]$Arg1= "テキストがありません"
)

Add-Type -AssemblyName System.speech

$s = New-Object System.Speech.Synthesis.SpeechSynthesizer
$s.Speak($Arg1)