
棋譜をスクレイピング
棋譜の解析をするたびに思うこと。「棋譜を自動で取得したい」ってことでまず公開されている「棋譜」のスクレイピングに挑戦です。
まず、「名人戦」は課金システムなのでかなり複雑・・・なので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で作動させたいと思います。