川崎市の「ふれあいネット」という公共施設の利用予約サイトがあるんですが、どうにもこうにも使いづらいので思い立ってスクレイピングしてみました。
pythonのmechanize + BeautifulSoupでこんな感じ。
※引数01がコート番号を受け取って富士見のコートの予約を6週分引っこ抜く
※ちなみに富士見のテニスコートの予約検索専用機
pythonのmechanize + BeautifulSoupでこんな感じ。
#!/usr/bin/env python # -*- coding=utf-8 -*- import mechanize import re from BeautifulSoup import BeautifulSoup import sys def main(): browser = mechanize.Browser() browser.addheaders = [('User-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.29.13 (KHTML, like Gecko) Versio')] browser.set_handle_equiv(False) browser.set_handle_gzip(False) browser.set_handle_robots(False) browser.set_handle_referer(False) browser.set_handle_refresh(False) browser.set_debug_redirects(False) browser.set_debug_http(False) url = "https://www.fureai-net.city.kawasaki.jp/reselve/k_index.do" browser.open(url) browser.select_form(name = "searchObjForm") browser.form.set_all_readonly(False) browser["rsvtyp"] = "1" browser.submit() browser.select_form(name = "searchObjForm") browser.form.set_all_readonly(False) browser["rsvptnflg"] = "1" browser.form.action = "https://www.fureai-net.city.kawasaki.jp/reselve/k_CtgSelInitial.do" browser.submit() browser.select_form(name = "searchObjForm") browser.form.set_all_readonly(False) browser["prptyp"] = "11" browser["startindex"] = "0" browser["prptypflg"] = "3" browser["prpmvflg"] = "0" browser.form.action = "https://www.fureai-net.city.kawasaki.jp/reselve/k_PrpCtgSelInitial.do" browser.submit() browser.select_form(name = "searchObjForm") browser.form.set_all_readonly(False) browser["prpcod"] = "0005" browser["startindex"] = "0" browser["prptypflg"] = "3" browser["prpmvflg"] = "0" browser.form.action = "https://www.fureai-net.city.kawasaki.jp/reselve/k_GovSelInitial.do" browser.submit() browser.select_form(name = "searchObjForm") browser.form.set_all_readonly(False) browser["facide"] = "0010309" # 富士見テニスコート browser["startindex"] = "0" browser.form.action = "https://www.fureai-net.city.kawasaki.jp/reselve/k_ObjSelInitial.do" browser.submit() browser.select_form(name = "searchObjForm") browser.form.set_all_readonly(False) browser["objide"] = "001030901" + sys.argv[1] # 富士見テニスコート1 末尾が01〜12にコート毎に変わる browser["objtyp"] = "1" browser["startindex"] = "0" browser.form.action = "https://www.fureai-net.city.kawasaki.jp/reselve/k_ObjRsvListInitial.do" browser.submit() print_schedule(browser.response()) for x in xrange(6): browser.select_form(name = "searchObjForm") browser.form.set_all_readonly(False) browser["dateFlg"] = "2" browser.form.action = "https://www.fureai-net.city.kawasaki.jp/reselve/k_ObjRsvListInitial.do" browser.submit() print_schedule(browser.response()) def print_schedule(response): soup = BeautifulSoup(response) print soup.find('td', {'class': 'HEADINFO'}).string schedules = [] for n in xrange(1, 8): schedule = {} d1 = soup.find(id='DAY' + str(n)) values = [v for v in d1.find('div', {'class': 'DAYTX'}).findAll(text=True) if len(v) > 1] schedule['date'] = values[0].strip() schedule['day'] = values[1].strip() idx = 1 for e in d1.findAll('td', {'class': 'KOMASTS4'}): if e.find('img', {'title':u'申し込み期間外です'}): schedule['t' + str(idx)] = '-' elif e.find('img', {'title':u'予約できません'}): schedule['t' + str(idx)] = 'x' else: schedule['t' + str(idx)] = 'o' idx += 1 schedules.append(schedule) for s in schedules: print s['date'], s['day'], s['t1'], s['t2'], s['t3'], s['t4'] if __name__ == "__main__": main()
実行例
場所は 富士見テニスコート の 富士見テニス場12 です。 5月26日 (日曜日) - - - - 5月27日 (月曜日) - - - - 5月28日 (火曜日) - - - - 5月29日 (水曜日) - - - - 5月30日 (木曜日) x x x x 5月31日 (金曜日) x o x x 6月1日 (土曜日) x x x x 場所は 富士見テニスコート の 富士見テニス場12 です。 6月2日 (日曜日) x x x x 6月3日 (月曜日) x x x x 6月4日 (火曜日) x o x x 6月5日 (水曜日) x x x x 6月6日 (木曜日) x x x x 6月7日 (金曜日) x x x x 6月8日 (土曜日) x x x x 場所は 富士見テニスコート の 富士見テニス場12 です。 6月9日 (日曜日) x x x x 6月10日 (月曜日) x x x x 6月11日 (火曜日) x x x x 6月12日 (水曜日) x x x x 6月13日 (木曜日) x x x x 6月14日 (金曜日) x x x x 6月15日 (土曜日) x x x x 場所は 富士見テニスコート の 富士見テニス場12 です。 6月16日 (日曜日) x x x x 6月17日 (月曜日) x x x x 6月18日 (火曜日) x x x x 6月19日 (水曜日) x o x x 6月20日 (木曜日) x x o x 6月21日 (金曜日) x x x o 6月22日 (土曜日) x x x x 場所は 富士見テニスコート の 富士見テニス場12 です。 6月23日 (日曜日) x x x x 6月24日 (月曜日) x x x x 6月25日 (火曜日) x x x x 6月26日 (水曜日) x x x x 6月27日 (木曜日) x x o x 6月28日 (金曜日) x x x x 6月29日 (土曜日) x x x x 場所は 富士見テニスコート の 富士見テニス場12 です。 6月30日 (日曜日) x x x x 7月1日 (月曜日) - - - - 7月2日 (火曜日) - - - - 7月3日 (水曜日) - - - - 7月4日 (木曜日) - - - - 7月5日 (金曜日) - - - - 7月6日 (土曜日) - - - - 場所は 富士見テニスコート の 富士見テニス場12 です。 7月7日 (日曜日) - - - - 7月8日 (月曜日) - - - - 7月9日 (火曜日) - - - - 7月10日 (水曜日) - - - - 7月11日 (木曜日) - - - - 7月12日 (金曜日) - - - - 7月13日 (土曜日) - - - -
※引数01がコート番号を受け取って富士見のコートの予約を6週分引っこ抜く
※ちなみに富士見のテニスコートの予約検索専用機