【PythonでWebスクレイピング】初めてのプログラムがスクレイピング〜実用編〜

f:id:kisokoji:20171106104119p:plain:w400

棋譜をスクレイピング

棋譜の解析をするたびに思うこと。「棋譜を自動で取得したい」ってことでまず公開されている「棋譜」のスクレイピングに挑戦です。

まず、「名人戦」は課金システムなのでかなり複雑・・・なのでSeleniumで行うことにしたのですが、「竜王戦」はそこまで複雑ではないのでこちらで。

Pythonで棋譜GET!

www.around50th-woman.me

内容的にはこちらの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 にアクセスしてプロジェクトの作成を行う。

f:id:kisokoji:20171106112305p:plain:w300

プロジェクト名を適当に入力して作成をクリックする。

認証情報から「OAuthクライアントID」を設定する。

f:id:kisokoji:20171106112607p:plain:w500

「クライアントID」が未設定の場合にはまず「OAuth同意画面」の入力を行う。

f:id:kisokoji:20171106113601p:plain:w500

メールアドレスユーザーに表示するサービス名を入力して保存

f:id:kisokoji:20171106113843p:plain:w500

アプリケーションの種類その他にして名前を入力して保存

「OAuthクライアント」が表示される。

特にコピーしておくこともないかな?一応テキストに貼ったけど。

f:id:kisokoji:20171106114137p:plain:w400

認証情報からJSONファイルをダウンロードする。JSONファイルに「クライアントID」と「クライアントシークレット」は記入されている。

f:id:kisokoji:20171106114924p:plain:w400

ダウンロードしたJSONファイルをmySiteに移動しておく。


Google Drive APIを有効にする

無効の場合、ライブラリに「Google Drive API」が表示されるのでクリックし、下の画面で有効にするをクリックする。

f:id:kisokoji:20171106122223p:plain:w500

有効にすると

f:id:kisokoji:20171106122243p:plain:w500

ダッシュボードの画面で無効にすると表示される。

ここまでで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で作動させたいと思います。