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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

3回答

4813閲覧

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

YaKa

総合スコア25

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

2クリップ

投稿2019/03/18 04:23

編集2019/03/18 07:16

表題にあるアクションを実行してみたく調べてみました。
参考になりそうな以下のページを見つけましたが、どのようにコードを編集したらよいのかわかりませんでした。(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についてはネットで調べた程度です。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yut148

2019/03/18 05:04

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

2019/03/18 07:15

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

回答3

0

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

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

投稿2019/03/18 10:13

yut148

総合スコア752

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YaKa

2019/03/19 01:50

どうもありがとうございます。 ただ、pythonのコードをGASに応用するちからがなく… javascriptを勉強すべきでしょうか?
yut148

2019/03/19 01:56

GASとjavascriptは別物です。javascriptで得た知見があってもGASに応用しにくい箇所もあります。勉強すべきという点では知っているに越したことはないのですが、pythonを触った事があるという事でしたので、目的の達成という点ではどうでしょうか?ちょっと第三者からはわからない問題です。
papinianus

2019/03/19 02:11

横から失礼 GASは、古いjavascriptですし、apiを見ても基本構文はjsを知っていることが前提です。ただ、yut148様が仰るとおり、特に現在流通しているjsとはスタイルが違うこともあり、「pythonはこうjsにする」みたいな資料が上手いことあったとしても、それでgasにもっていけるわけではないと思います。 それよりも、ここまで目的に近いコードがあるのですから、yut148様ご指摘のように、「目的を達成するための最短手段」で考えたとき、自分のPCを電源を入れっぱなしにして、Pythonで動かす、というのは非常に魅力的に思います。
YaKa

2019/03/19 02:20

GASとjavascriptが別物という点、承知しました。GASを学びたければ、特にjavascriptに寄り道する必要はないのですね。GASを学ぶ書籍があまり充実してないように思えた点も今回の質問(参考書籍はないか)につながりました。 コメントいただいたように目的の達成にはGASにこだわらないほうがいいかもしれませんね。 pythonのほうではログイン処理、googleスプレッドシートにサイトtitleを出力くらいまでは実行できたのですが、googleスプレッドシートだけで完結できたほうが使い勝手がいいのではと思いGASに寄り道し始めました。どちらで実行すべきかもう少し考えてみます。
YaKa

2019/03/19 02:25

papinianus様の投稿を確認する前に送ってしまいました。 学習コストも考えるとやはりpythonですかね…
guest

0

ベストアンサー

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/18 07:49

編集2019/03/19 02:08
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YaKa

2019/03/19 01:59

ありがとうございます。 確かにコメントしがたい質問でした。 まずログイン処理の部分。 SBI用に書き直してみたのですが、実行がうまくいっているのかの確認方法がわかりません。 また価格を取得する部分。 例ではpdfを取得しているようですが、これを価格を取得することに応用する方法が分かりません。 SBIのサイト先ではテーブルのようになっているなかの一部分なのです。サイトの要素?をお示しすべきかもしれませんが、個人情報を載せないように晒すことに自信がありません。 勉強のサイトありがとうございました。こちらでも勉強します。
YaKa

2019/03/19 02:03

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

2019/03/19 02:34

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

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

投稿2019/12/11 23:55

YaKa

総合スコア25

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問