コミュニティサイクルの利用履歴をスクレイピング

#はじめに
個人的に(東京の)[中央区コミュニティサイクル](http://docomo-cycle.jp/chuo/ "中央区コミュニティサイクル")をよく利用しています。
現在、[自転車シェアリング広域実験](http://docomo-cycle.jp/tokyo-project/ "自転車シェアリング広域実験")というのを実施中で、4区(中央区・千代田区・港区・江東区)を自由に行き来したり、借りた場所とは異なるサイクルポートに返却ができたりするとても利便性の高いレンタサイクルです。

#やってみたこと
「いつ、どこからどこに乗ったんだっけ?」ということはWebで確認できるのですが、このあたりのことを自動化したいなーと思い、Python3 + BeautifulSoup4 + Selenium + Firefox で作ってみました。Windows環境で動作確認済みです。
(とりあえず、私は中央区で登録しているので、中央区登録者向けのスクリプトになっています)

```docomo-cycle.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import urllib.request
from bs4 import BeautifulSoup
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
import csv

MEMBERID = "(自分のユーザID)"
PASSWORD = "(自分のパスワード)"

driver = webdriver.Firefox()
driver.get("https://tcc.docomo-cycle.jp/cycle/TYO/cs_web_main.php?AreaID=2")

mid = driver.find_element_by_name('MemberID')
mid.send_keys(MEMBERID)
password = driver.find_element_by_name('Password')
password.send_keys(PASSWORD)
password.send_keys(Keys.RETURN)

obj1 = WebDriverWait(driver,5).until(
    EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "Billing")))
obj1.click()

time.sleep(3)

data = driver.page_source.encode('utf-8')
soup = BeautifulSoup(data, "html.parser")

table = soup.findAll("table",{"class":"rnt_ref_table"})[0]
rows = table.findAll("tr")

csvFile = open("docomo-cycle.csv", 'wt', newline='', encoding='utf-8')
writer = csv.writer(csvFile)
try:
  for row in rows:
    csvRow = []
    for cell in row.findAll(['td', 'th']):
      csvRow.append(cell.get_text().replace('\n',''))
    writer.writerow(csvRow)
finally:
  csvFile.close()

driver.close()
```

上記スクリプトを実行すると、利用履歴が docomo-cycle.csv として出力されます。
こんな感じです。

```docomo-cycle.csv
1,2016/5/2 07:22,B3-01.中央区役所B3-01.Chuo City Office,→,2016/5/2 07:35,A3-02.カーサノーヴァショップ（楓ビル）A3-02.CASA NOUVA SHOP(Kaede Building)
2,2016/5/2 18:29,A3-02.カーサノーヴァショップ（楓ビル）A3-02.CASA NOUVA SHOP(Kaede Building),→,2016/5/2 18:50,B4-03.桜の散歩道（晴海トリトンスクエア前）B4-03.Sakura no sanpomichi(In front of Harumi Triton Square)
3,2016/5/5 21:32,B3-03.銀座6丁目－ＳＱＵＡＲＥ（木挽町通り）B3-03.Ginza 6-chome SQUARE(Kobikicho Dori),→,2016/5/5 21:48,B4-03.桜の散歩道（晴海トリトンスクエア前）B4-03.Sakura no sanpomichi(In front of Harumi Triton Square)
4,2016/5/6 07:28,B4-03.桜の散歩道（晴海トリトンスクエア前）B4-03.Sakura no sanpomichi(In front of Harumi Triton Square),→,2016/5/6 07:41,B2-02.柳通り（東京スクエアガーデン前）B2-02.Yanagi-dori St. (In front of TOKYO SQUARE GARDEN)
5,2016/5/8 05:00,B4-03.桜の散歩道（晴海トリトンスクエア前）B4-03.Sakura no sanpomichi(In front of Harumi Triton Square),→,2016/5/8 05:08,H1-02.豊洲駅H1-02.Toyosu Station
6,2016/5/9 07:25,B4-03.桜の散歩道（晴海トリトンスクエア前）B4-03.Sakura no sanpomichi(In front of Harumi Triton Square),→,2016/5/9 07:48,A3-02.カーサノーヴァショップ（楓ビル）A3-02.CASA NOUVA SHOP(Kaede Building)
7,2016/5/10 08:18,B4-03.桜の散歩道（晴海トリトンスクエア前）B4-03.Sakura no sanpomichi(In front of Harumi Triton Square),→,2016/5/10 08:40,A3-02.カーサノーヴァショップ（楓ビル）A3-02.CASA NOUVA SHOP(Kaede Building)
```
#今後のこと
「自動」って視点からするとFirefoxが立ち上がって画面遷移していくのは無駄な動作なのでPhantomJSとかを使ってサイレントに動作させてみたいと思います。そして、cronとかで定時にスクレイピングさせるとか、Googleスプレッドシートに自動追記させるとか。。。

#参考
・[『PythonによるWebスクレイピング』オライリー・ジャパン、ISBN978-4-87311-761-4](http://www.oreilly.co.jp/books/9784873117614/)
・CSVファイル化については[これ](https://github.com/REMitchell/python-scraping/blob/master/chapter5/3-scrapeCsv.py)を参考にさせていただきました。

#蛇足
東京都中央区以外のコミュニティサイクルであっても、同じシステムで管理されているっぽいので、**driver.get**行のURLを以下の内容に書き換えると同じことができるかも知れません。

・江東区
　https://tcc.docomo-cycle.jp/cycle/TYO/cs_web_main.php?AreaID=4
・千代田区
　https://tcc.docomo-cycle.jp/cycle/TYO/cs_web_main.php?AreaID=1
・港区
　https://tcc.docomo-cycle.jp/cycle/TYO/cs_web_main.php?AreaID=3
・横浜
　https://tcc.docomo-cycle.jp/cycle/YKH/cs_web_main.php
・仙台
　https://tcc.docomo-cycle.jp/cycle/SND/cs_web_main.php
・広島
　https://tcc.docomo-cycle.jp/cycle/HRS/cs_web_main.php
・神奈川県西
　https://tcc.docomo-cycle.jp/cycle/KNS/cs_web_main.php
・甲州
　https://tcc.docomo-cycle.jp/cycle/KSH/cs_web_main.php
・神戸
　https://tcc.docomo-cycle.jp/cycle/kob/cs_web_main.php