質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.60%

SBI証券にログインして、保有資産評価合計をgoogleスプレッドシートに出力したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,505

score 19

表題にあるアクションを実行してみたく調べてみました。
参考になりそうな以下のページを見つけましたが、どのようにコードを編集したらよいのかわかりませんでした。(urlやログインIDを変えることくらいで、他は全然手を付けられませんでした。)

Google SpreadSheet のGAS(JavaScript)でスクレイピング(Webデータゲット)
https://qiita.com/standard-software/items/16214dc4e64d28952c2d

Google Apps Scriptでクレジットカード利用明細を毎月自動で奥さんにメール送信する
https://qiita.com/takeruko/items/5fed0f7acc1a60d1df76

これについて解説してくださる神回答まで求めるのは図々しいかと思いますので(もちろん嬉しいですが)、勉強するためのサイトや書籍だけでも教えていただければ幸いです。

SBI証券のログインページです。
https://www.sbisec.co.jp/ETGate/?_ControlID=WPLETacR001Control&_PageID=DefaultPID&_DataStoreID=DSWPLETacR001Control&_ActionID=DefaultAID&getFlg=on

以下は私のバックグラウンドです。


VBAとpythonは触ったことがあります。ptythonは勉強中です。
javascript、GASは未経験です。
HTMLの構造については初心者向けの解説本をみた程度です。
HTTPについてはネットで調べた程度です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yut148

    2019/03/18 14:04

    肝心のSBI証券のURL、HTMLソース等がなければ誰も何も回答できないと思います。

    キャンセル

  • YaKa

    2019/03/18 16:15

    情報足らずで申し訳ありません。SBI証券のURLを追加しました。
    参考URL中のコードの中身がほとんどわからなかったので、このあたりを理解するための参考書籍など教えていただければ幸いです。

    キャンセル

  • 退会済みユーザー

    2019/03/18 20:13

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 3

checkベストアンサー

+2

Google Apps Scriptでクレジットカード利用明細を毎月自動で奥さんにメール送信する
https://qiita.com/takeruko/items/5fed0f7acc1a60d1df76

これについて解説してくださる

Qiitaが解説だと思うのですが、どこが分からないのですか?

勉強するためのサイト

Apps Script


まずログイン処理の部分。
SBI用に書き直してみたのですが、実行がうまくいっているのかの確認方法がわかりません。

ログインのところだけやっても分かりません。
PDFにするという処理のところで、PDFにしてみて、ログイン後の画面が取れるかどうか、がログインできたことの検証になります(必ずしもPDFにする必要はないですが、responseを解析するよりも、PDFにするコードがあるなら、実際問題PDFで見るのが手っ取り早い方法だと思います)

また価格を取得する部分。
例ではpdfを取得しているようですが、これを価格を取得することに応用する方法が分かりません。
SBIのサイト先ではテーブルのようになっているなかの一部分なのです。サイトの要素?をお示しすべきかもしれませんが、個人情報を載せないように晒すことに自信がありません。

前提としてPDFで(全体を取得して)欲しい部分が取れていることを確認してください。というのは、ブラウザで見ることを前提にページが作られている場合URLFETCHAPPではどうしても取れないデータが発生します。理由はajaxというような技法(技法ってほどでもないですが)で、漸次取得しているデータは、取り切れないからです。

1つ目のリンクにある

      var searchTag = '/contributions"><span class="userActivityChart_statCount">';
      var index = html.indexOf(searchTag)
      if (index !== -1) {
        var html = html.substring(index + searchTag.length);
        var index = html.indexOf('</span>');


のところの、searchTagの右辺や、 html.indexOf('</span>')</span>を、欲しい情報の前後にあって曖昧性のないものにすれば、必要な部分だけ切り出すことができると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/19 10:59

    ありがとうございます。
    確かにコメントしがたい質問でした。

    まずログイン処理の部分。
    SBI用に書き直してみたのですが、実行がうまくいっているのかの確認方法がわかりません。

    また価格を取得する部分。
    例ではpdfを取得しているようですが、これを価格を取得することに応用する方法が分かりません。
    SBIのサイト先ではテーブルのようになっているなかの一部分なのです。サイトの要素?をお示しすべきかもしれませんが、個人情報を載せないように晒すことに自信がありません。

    勉強のサイトありがとうございました。こちらでも勉強します。

    キャンセル

  • 2019/03/19 11:03

    「サイトのtitleを取得する」ことはできたのですが、サイト内の情報を任意に取得する方法が調べきれませんでした。

    キャンセル

  • 2019/03/19 11:34

    papinianus様
    ありがとうございます。
    以前試したpythonのコードでは実際にブラウザが動く様子がみれていたのですが、GASの例ではなにも動きがみられず不安な状態でした。確かにログイン先を全体取得などすれば確認できましたね。

    キャンセル

+2

ログインについてはこちらに方法がありました。
https://nehori.com/nikki/2017/04/30/post-4370/

プログラムの話からは外れますが、自己責任でお願い申し上げます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/19 11:11

    横から失礼
    GASは、古いjavascriptですし、apiを見ても基本構文はjsを知っていることが前提です。ただ、yut148様が仰るとおり、特に現在流通しているjsとはスタイルが違うこともあり、「pythonはこうjsにする」みたいな資料が上手いことあったとしても、それでgasにもっていけるわけではないと思います。

    それよりも、ここまで目的に近いコードがあるのですから、yut148様ご指摘のように、「目的を達成するための最短手段」で考えたとき、自分のPCを電源を入れっぱなしにして、Pythonで動かす、というのは非常に魅力的に思います。

    キャンセル

  • 2019/03/19 11:20

    GASとjavascriptが別物という点、承知しました。GASを学びたければ、特にjavascriptに寄り道する必要はないのですね。GASを学ぶ書籍があまり充実してないように思えた点も今回の質問(参考書籍はないか)につながりました。

    コメントいただいたように目的の達成にはGASにこだわらないほうがいいかもしれませんね。
    pythonのほうではログイン処理、googleスプレッドシートにサイトtitleを出力くらいまでは実行できたのですが、googleスプレッドシートだけで完結できたほうが使い勝手がいいのではと思いGASに寄り道し始めました。どちらで実行すべきかもう少し考えてみます。

    キャンセル

  • 2019/03/19 11:25

    papinianus様の投稿を確認する前に送ってしまいました。

    学習コストも考えるとやはりpythonですかね…

    キャンセル

0

-*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import pandas as pd
import schedule
import time
from datetime import datetime as dt
import gspread
import json

def sisankaki():

options = Options()

ヘッドレスモード(chromeを表示させないモード)

options.add_argument('--headless')

driver = webdriver.Chrome(executable_path='XXXX', options=options)

driver.get('https://www.sbisec.co.jp/ETGate')

スクリーンショットをとって確認することも可

driver.save_screenshot('sbi.png')

ユーザーネームとパスワードを設定

username = "XXX"
password = "XXX"

ユーザーネームテキストボックスを選択

user_id = driver.find_element_by_id("user_input")

ユーザーネームを入力

user_id.find_element_by_name("user_id").send_keys(username)

パスワードテキストボックスを選択

user_pass = driver.find_element_by_id("password_input")

パスワードを入力

user_pass.find_element_by_name("user_password").send_keys(password)

ログインを押下

driver.find_element_by_class_name("ov").click()

口座管理に遷移

driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/div/ul/li[3]/a/img").click()

print(driver.current_url)

文字コードをUTF-8に変換

html = driver.page_source.encode('utf-8')

BeautifulSoupでパース

soup = BeautifulSoup(html, "html.parser")

table = soup.find_all("table", border="0", cellspacing="0", cellpadding="0", width="340")

pd.read_html()はListに格納されて戻されることに注意

df_table = pd.read_html(str(table))[9]
print(df_table)
print(type(df_table))

必要な行・列のみ抽出(信用ポジがある場合iloc[9,1]にする)

sousisan = df_table.iloc[8, 1]

print(sousisan)

ブラウザーを閉じる

driver.quit()

   

ここからスプレッドシート操作#####

ServiceAccountCredentials:Googleの各サービスへアクセスできるservice変数を生成します。

from oauth2client.service_account import ServiceAccountCredentials

2つのAPIを記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない

scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']

認証情報設定

ダウンロードしたjsonファイル名をクレデンシャル変数に設定(秘密鍵、Pythonファイルから読み込みしやすい位置に置く)

credentials = ServiceAccountCredentials.from_json_keyfile_name('XXX', scope)

OAuth2の資格情報を使用してGoogle APIにログインします。

gc = gspread.authorize(credentials)

共有設定したスプレッドシートキーを変数[SPREADSHEET_KEY]に格納する。

SPREADSHEET_KEY = 'XXX'

共有設定したスプレッドシートのシート1を開く

worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1

A4セルの値に表示させる

worksheet.update_cell(3,1, sousisan)

ima = dt.now()
imastr = ima.strftime('%H:%M:%S')
print(imastr)
print("I'm writing...")

sisankaki()

定期実行するジョブをライブラリに登録(実行時間も管理する)

schedule.every(15).minutes.do(sisankaki)

 

登録したジョブを実行させるための処理?

while True:

   schedule.run_pending()

   time.sleep(1)

   #もし15:15こえたらブレイク

   if (15 - dt.now().hour <=0) and (15 - dt.now().minute <= 0) :

       print('終了します。')

       break

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る