「ふもとっぱら」の空き状況をスクレイピング

note.com

ysdyt.hatenablog.jp

seleniumなしでスクレイピング

import time

import pandas as pd
import requests
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
}

payload = {"j_id0:fSearch": "j_id0:fSearch", "j_id0:fSearch:searchBtn": "検索"}

dfs = []

with requests.Session() as s:

    r = s.get("https://fumotoppara.secure.force.com/", headers=headers)
    r.raise_for_status()

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

    months = [i.get("value") for i in soup.select("select#f_nengetsu > option")]

    for i, month in enumerate(months):

        if i > 0:

            payload["f_nengetsu"] = month

            time.sleep(3)

            r = s.get(
                "https://fumotoppara.secure.force.com/RS_Top",
                headers=headers,
                params=payload,
            )
            r.raise_for_status()

        df_tmp = pd.read_html(r.text)[0]
        df_tmp["月"] = month

        dfs.append(df_tmp[:-1])

df0 = pd.concat(dfs).reset_index(drop=True)

df_date = (
    (df0["月"] + df0["日付"])
    .str.extract("(\d{4})年(\d{1,2})月(\d{1,2})日")
    .rename(columns={0: "year", 1: "month", 2: "day"})
    .astype(int)
)

df0["日付"] = pd.to_datetime(df_date)

df0.drop("月", axis=1, inplace=True)

df0.set_index(["日付", "曜日"], inplace=True)

df0

# 日付別予約可能

df1 = df0[
    df0.isin(["○", "△"]).any(axis=1)
].copy()

df1

df1.to_csv("fumotoppara.csv", encoding="utf_8_sig")

一覧

曜日指定

df1.xs("金", level="曜日")
日付 キャンプサイト コテージ柏 翠山荘 毛無山荘
2021-12-03 00:00:00 × × ×
2021-12-10 00:00:00 × ×
2021-12-17 00:00:00 ×
2021-12-24 00:00:00 × × ×
2022-01-07 00:00:00 × × ×
2022-01-14 00:00:00 × ×
2022-01-21 00:00:00 ×
2022-02-04 00:00:00 × ×
2022-02-18 00:00:00 ×

施設別

df2 = df0.stack().reset_index().set_axis(["日付", "曜日", "施設", "状況"], axis=1)

df3 = df2[df2["状況"].isin(["○", "△"])].copy().reset_index(drop=True)

金曜日

df3[df3["曜日"] == "金"]
日付 曜日 施設 状況
5 2021-12-03 00:00:00 キャンプサイト
13 2021-12-10 00:00:00 キャンプサイト
14 2021-12-10 00:00:00 毛無山荘
27 2021-12-17 00:00:00 キャンプサイト
28 2021-12-17 00:00:00 翠山荘
29 2021-12-17 00:00:00 毛無山荘
39 2021-12-24 00:00:00 キャンプサイト
43 2022-01-07 00:00:00 キャンプサイト
55 2022-01-14 00:00:00 キャンプサイト
56 2022-01-14 00:00:00 毛無山荘
70 2022-01-21 00:00:00 キャンプサイト
71 2022-01-21 00:00:00 翠山荘
72 2022-01-21 00:00:00 毛無山荘
97 2022-02-04 00:00:00 キャンプサイト
98 2022-02-04 00:00:00 毛無山荘
128 2022-02-18 00:00:00 キャンプサイト
129 2022-02-18 00:00:00 翠山荘
130 2022-02-18 00:00:00 毛無山荘

キャンプサイト&金曜日

df3[(df3["施設"] == "キャンプサイト") & (df3["曜日"] == "金")]

# 日付リスト化
df3.loc[(df3["施設"] == "キャンプサイト") & (df3["曜日"] == "金"), "日付"].dt.date.unique().tolist()
日付 曜日 施設 状況
5 2021-12-03 00:00:00 キャンプサイト
13 2021-12-10 00:00:00 キャンプサイト
27 2021-12-17 00:00:00 キャンプサイト
39 2021-12-24 00:00:00 キャンプサイト
43 2022-01-07 00:00:00 キャンプサイト
55 2022-01-14 00:00:00 キャンプサイト
70 2022-01-21 00:00:00 キャンプサイト
97 2022-02-04 00:00:00 キャンプサイト
128 2022-02-18 00:00:00 キャンプサイト

キャンプサイト以外

df4 = df3[df3["施設"].isin(["コテージ柏", "翠山荘", "毛無山荘"])].copy()
df4

# 日付リスト化
df4["日付"].dt.date.unique().tolist()
日付 曜日 施設 状況
3 2021-12-02 00:00:00 翠山荘
4 2021-12-02 00:00:00 毛無山荘
8 2021-12-06 00:00:00 翠山荘
9 2021-12-06 00:00:00 毛無山荘
14 2021-12-10 00:00:00 毛無山荘
16 2021-12-12 00:00:00 翠山荘
17 2021-12-12 00:00:00 毛無山荘
19 2021-12-13 00:00:00 毛無山荘
21 2021-12-14 00:00:00 コテージ柏
22 2021-12-14 00:00:00 毛無山荘
24 2021-12-15 00:00:00 毛無山荘
26 2021-12-16 00:00:00 毛無山荘
28 2021-12-17 00:00:00 翠山荘
29 2021-12-17 00:00:00 毛無山荘
32 2021-12-20 00:00:00 毛無山荘
35 2021-12-22 00:00:00 翠山荘
36 2021-12-22 00:00:00 毛無山荘
38 2021-12-23 00:00:00 毛無山荘
45 2022-01-10 00:00:00 毛無山荘
47 2022-01-11 00:00:00 翠山荘
48 2022-01-11 00:00:00 毛無山荘
50 2022-01-12 00:00:00 翠山荘
51 2022-01-12 00:00:00 毛無山荘
53 2022-01-13 00:00:00 翠山荘
54 2022-01-13 00:00:00 毛無山荘
56 2022-01-14 00:00:00 毛無山荘
58 2022-01-16 00:00:00 毛無山荘
60 2022-01-17 00:00:00 毛無山荘
62 2022-01-18 00:00:00 翠山荘
63 2022-01-18 00:00:00 毛無山荘
65 2022-01-19 00:00:00 翠山荘
66 2022-01-19 00:00:00 毛無山荘
68 2022-01-20 00:00:00 翠山荘
69 2022-01-20 00:00:00 毛無山荘
71 2022-01-21 00:00:00 翠山荘
72 2022-01-21 00:00:00 毛無山荘
74 2022-01-23 00:00:00 翠山荘
75 2022-01-23 00:00:00 毛無山荘
77 2022-01-24 00:00:00 翠山荘
78 2022-01-24 00:00:00 毛無山荘
80 2022-01-25 00:00:00 翠山荘
81 2022-01-25 00:00:00 毛無山荘
86 2022-01-31 00:00:00 翠山荘
87 2022-01-31 00:00:00 毛無山荘
89 2022-02-01 00:00:00 翠山荘
90 2022-02-01 00:00:00 毛無山荘
92 2022-02-02 00:00:00 翠山荘
93 2022-02-02 00:00:00 毛無山荘
95 2022-02-03 00:00:00 翠山荘
96 2022-02-03 00:00:00 毛無山荘
98 2022-02-04 00:00:00 毛無山荘
100 2022-02-06 00:00:00 翠山荘
101 2022-02-06 00:00:00 毛無山荘
103 2022-02-07 00:00:00 翠山荘
104 2022-02-07 00:00:00 毛無山荘
106 2022-02-08 00:00:00 翠山荘
107 2022-02-08 00:00:00 毛無山荘
109 2022-02-09 00:00:00 翠山荘
110 2022-02-09 00:00:00 毛無山荘
112 2022-02-10 00:00:00 毛無山荘
114 2022-02-13 00:00:00 翠山荘
115 2022-02-13 00:00:00 毛無山荘
117 2022-02-14 00:00:00 翠山荘
118 2022-02-14 00:00:00 毛無山荘
120 2022-02-15 00:00:00 翠山荘
121 2022-02-15 00:00:00 毛無山荘
123 2022-02-16 00:00:00 翠山荘
124 2022-02-16 00:00:00 毛無山荘
126 2022-02-17 00:00:00 翠山荘
127 2022-02-17 00:00:00 毛無山荘
129 2022-02-18 00:00:00 翠山荘
130 2022-02-18 00:00:00 毛無山荘
132 2022-02-20 00:00:00 毛無山荘
134 2022-02-21 00:00:00 翠山荘
135 2022-02-21 00:00:00 毛無山荘
137 2022-02-22 00:00:00 翠山荘
138 2022-02-22 00:00:00 毛無山荘