棋譜をスクレイピング
棋譜の解析をするたびに思うこと。「棋譜を自動で取得したい」ってことでまず公開されている「棋譜」のスクレイピングに挑戦です。
まず、「名人戦」は課金システムなのでかなり複雑・・・なのでSeleniumで行うことにしたのですが、「竜王戦」はそこまで複雑ではないのでこちらで。
Pythonで棋譜GET!
内容的にはこちらのSeleniumのテストと変わらない感じ。
それでも、表示内容から他のURLを取得することをしている。
そこが素人にはわからなかったりした。
ryuou.py
import re from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.get('http://live.shogi.or.jp/ryuou/') assert 'TOPページ|竜王戦中継' in driver.title kif_url_list = driver.find_elements_by_xpath("/html/body/div/div/div[2]/div[1]/div[1]/div[1]/p[1]/a") try: if len(kif_url_list) == 0: print('本日の対戦はありません') exit(1) else: for kif in kif_url_list: kif_href = kif.get_attribute('href') kif_list.append(kif_href) for kif in kif_list: driver.get(re.sub(r".html", ".kif", kif)) kif_text = driver.find_elements_by_tag_name("pre")[0].text print(kif_text) except Exception as e: print(e) pass finally: driver.quit() # ブラウザーを終了する。
(myenv) babanoMacBook-puro:myenv baba$ python ryuou.py
直近の結果が表示されます。
まぁ私はこれをファイルに書き出してそれをRaspberry Piに乗せてタイマー設定して自分のGoogleドライブに保存するまでをしました。
全てが初めてで知恵熱が出そうだわ。
Googleドライブにアップロードしたい
PythonでGoogleのドライブにアップロードするにはどうするのか?
PyDrive
をインストールらしい。
PyDriveのインストール
(myenv) babanoMacBook-puro:mySite baba$ pip install PyDrive Collecting PyDrive Using cached PyDrive-1.3.1.tar.gz Collecting google-api-python-client>=1.2 (from PyDrive) Using cached google_api_python_client-1.6.4-py2.py3-none-any.whl Collecting oauth2client>=4.0.0 (from PyDrive) Using cached oauth2client-4.1.2-py2.py3-none-any.whl Collecting PyYAML>=3.0 (from PyDrive) Using cached PyYAML-3.12.tar.gz Collecting uritemplate<4dev,>=3.0.0 (from google-api-python-client>=1.2->PyDrive) Using cached uritemplate-3.0.0-py2.py3-none-any.whl Collecting six<2dev,>=1.6.1 (from google-api-python-client>=1.2->PyDrive) Using cached six-1.11.0-py2.py3-none-any.whl Collecting httplib2<1dev,>=0.9.2 (from google-api-python-client>=1.2->PyDrive) Using cached httplib2-0.10.3.tar.gz Collecting pyasn1-modules>=0.0.5 (from oauth2client>=4.0.0->PyDrive) Using cached pyasn1_modules-0.1.5-py2.py3-none-any.whl Collecting rsa>=3.1.4 (from oauth2client>=4.0.0->PyDrive) Using cached rsa-3.4.2-py2.py3-none-any.whl Collecting pyasn1>=0.1.7 (from oauth2client>=4.0.0->PyDrive) Using cached pyasn1-0.3.7-py2.py3-none-any.whl Installing collected packages: httplib2, pyasn1, pyasn1-modules, rsa, six, oauth2client, uritemplate, google-api-python-client, PyYAML, PyDrive Running setup.py install for httplib2 ... done Running setup.py install for PyYAML ... done Running setup.py install for PyDrive ... done Successfully installed PyDrive-1.3.1 PyYAML-3.12 google-api-python-client-1.6.4 httplib2-0.10.3 oauth2client-4.1.2 pyasn1-0.3.7 pyasn1-modules-0.1.5 rsa-3.4.2 six-1.11.0 uritemplate-3.0.0
ここからが面倒な感じがする。。。
OAuthクライアントIDを取得する
Googleドライブにアクセスするための「クライアントID」と「クライアントシークレット」の取得を行う。
まず、Google Developers Console にアクセスしてプロジェクトの作成を行う。
プロジェクト名を適当に入力して作成
をクリックする。
認証情報から「OAuthクライアントID」を設定する。
「クライアントID」が未設定の場合にはまず「OAuth同意画面」の入力を行う。
メールアドレス
ユーザーに表示するサービス名
を入力して保存
アプリケーションの種類
をその他
にして名前
を入力して保存
「OAuthクライアント」が表示される。
特にコピーしておくこともないかな?一応テキストに貼ったけど。
認証情報からJSONファイルをダウンロードする。JSONファイルに「クライアントID」と「クライアントシークレット」は記入されている。
ダウンロードしたJSONファイルをmySite
に移動しておく。
Google Drive APIを有効にする
無効の場合、ライブラリ
に「Google Drive API」が表示されるのでクリックし、下の画面で有効にする
をクリックする。
有効にすると
ダッシュボードの画面で無効にする
と表示される。
ここまででGoogleドライブにアクセスする準備が完了となる。
Google Driveにアップロード
settings.yamlファイルの作成
まず、settings.yaml
を作成する。
client_config_backend: settings client_config: client_id: <クライアントID> client_secret: <クライアントシークレット> save_credentials: True save_credentials_backend: file save_credentials_file: credentials.json get_refresh_token: True oauth_scope: - https://www.googleapis.com/auth/drive.file - https://www.googleapis.com/auth/drive.install
「<クライアントID>」「<クライアントシークレット>」に先程メモったコードをコピペして保存する。
サンプルコード
from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive gauth = GoogleAuth() gauth.LocalWebserverAuth() drive = GoogleDrive(gauth) f = drive.CreateFile({'title': 'TEST.TXT'}) f.SetContentString('Hello') f.Upload()
GoogleドライブにTEST.TXT
が作成されていることを確認する。
初回実行時にクレデンシャル情報がローカルフォルダに保存される。
credentials.json
というファイル名になっている。
棋譜情報をファイルに保存する
最初に取得した棋譜をファイルに保存するコードを追加する。
f = open('ryuou.txt','w') f.write(kif_text) f.close()
保存したファイルをGoogle Driveにアップロードする。
保存したファイルをGoogleドライブにアップロード
googleupload.py
from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive gauth = GoogleAuth() gauth.LocalWebserverAuth() drive = GoogleDrive(gauth) f = drive.CreateFile({'title': 'ryuou.txt', 'mimeType': 'text/plain'}) f.SetContentFile('/home/mySite/myenv/ryuou.txt') f.Upload()
実行してGoogle Drive上にあれば成功!
ってことで最低限の実用性ができました。
次・・・Raspberry Piで作動させたいと思います。