|
カテゴリ:KATS(自動売買プログラム)
あと4営業日でクリック証券のWebサービスAPIは提供を終了します。
APIを使っていた自動売買プログラムの開発者は、再来週以降は嫌でも別の発注方法を 選択するしかありません。 いくつかの代案が存在する中、私はモバイルサイトのスクレイピングを採用すると思います。 鴉揚羽さんのブログでも書かれていた通り、約定番号が一意にならない点?や 保有銘柄一覧などが5銘柄ずつ次ページ処理になる点などがあるようで単純には いかないという事は分かっていますが。 鴉揚羽さんは一覧などの取得にPC用Webサイトを利用しているらしく、モバイルサイトと 併用する事によってデメリットをうまくカバーしているようです。 私は今の所、岡三オンライン証券のモバイルサイトを操作するつもりでいます。 理由は単純に、手数料がクリック証券より安いからです。 ただ、まだ口座開設申し込みが終わったところなので、実際にアカウントが出来て ログインしてみないとスクレイピング出来そうかどうか分からないので、判断はもう少し 後になりそうです。 まあ最近はKATSの運用はしてなかったので、それほど焦らず構えようと思います。 シミュレーションにはWebサービスAPIは必要ないので、日々のデータ取得やロジックの 検証は引き続き行う事が出来ます。 岡三オンライン証券の口座開設を待っている間、何もしないのはもったいないので それまでにスクレイピングについて検証してみようという事で、今はクリック証券の モバイルサイトを使って色々試したりしています。 私はスクレイピングは初めてで、どうやるのがセオリーなのかも分からないのですが、 自分なりに感じたポイントや方法についてちょっと書いてみます。 リクエスト送信は基本的にWebサービスAPIを呼び出していた時と同じだと思います。 問題は返って来るのがXMLではなくHTMLページそのものなので、 その中から自分が必要な情報をどう見つけて取得するのかがポイントです。 ではクリック証券モバイルサイトで余力情報を取得するのに私が取った方法を 書いてみます。 経験者の方は是非「そうじゃない!」「こうすべきだ」等、ご意見頂けたらと思います。 まずはモバイルサイトのログイン画面のURLをWebブラウザに入力します。 「https://sec-sso.click-sec.com/mk/」です。 するとログイン画面が表示されますが、マウスの右クリックで「ソースの表示」とし、 ログイン画面のHTMLソースをテキストエディタ(メモ帳など)で開きます。 ・・・ちなみに、HTMLが全く分からない人はスクレイピングは不可能だと思います。 このソースを見ればクリック証券にログインするためのデータが盛り込まれています。 HTTPリクエストを送信する時に必要な情報はINPUTタグとして入っています。 例えばユーザー名は「j_username」、パスワードは「j_password」です。 必要なリクエストパラメータを全て与え、URLを「{ログイン画面のURL}+"sso-redirect"」として 送信すればトップページが表示されます。 表示されない場合はURLが間違っているかリクエストパラメータが足りないのでしょう。 HTTPリクエストの送信が分からない人は、僭越ながら私が連載していた 「VB.NETで自動売買」入門の「クリック証券Webサービスで発注する」で紹介した HttpPost()メソッドを参考にして下さい。 Webブラウザで実際にログインし、トップページから「株式取引メニュー」をクリックして下さい。 すると次のページに「余力確認」があります。 このリンクをクリックするのと同様の操作をプログラムにさせる訳ですので、 また「ソースの表示」でHTMLソースを覗いてみましょう。 すると、リンク(Aタグ)にURLが書いてあります。しかも余力情報の取得をするのに パラメータはありません。じゃあこのURLを送信するだけで簡単に余力情報のページに 飛ぶ事が・・・出来るのですが、そんなに甘くはありません(苦笑)。 このURLはログイン時に動的に変更されるのです。 ログイン後のブラウザのURLには 「https://sec-sso.click-sec.com/mk/xxxxxx/dispKabuMenu.do」と表示されていますが、 「xxxxxx」(sec~)の部分は毎回変わります。 WebサービスAPIの時にもありましたよね。つまり、ログイン後のURLから「dispKabuMenu.do」を 取り除いた部分を「baseURL」として保持し、次以降のリクエストではそれを使います。 実装方法については私の連載記事を読んで頂ければ分かると思います。 なので、余力情報の表示でプログラムが送信するURLは 「{baseURL}+"/dispPaUserSheet.do"」です。 Webブラウザでリンクをクリックすると余力確認のページが表示されます。 今回はページの中で「現物買付余力」を取得する事にします。 例の如く、HTMLソースを開いてみます。 これまではリクエストパラメータやURLなどエッセンスを目で読み取って活用すれば 良かったですが今回は違います。HTMLページにある文字列をプログラムで抽出しないと いけません。これは煩雑です(^-^; HTMLソースで現物買付余力の部分はこんな感じになっています。 <li>現物買付余力 <div align="right"> 82円 </div> </li> ・・・ここからどうやって金額を取りましょうか? 正直、手掛かりはラベルやHTMLタグしか無いと思います。 まずはHTMLソースから「現物買付余力」という文字列の位置を取得します。 次にその位置以降で「>」を検索します。DIVタグの開始タグの終了位置です。 この次以降が金額の入っている部分ですね。 さらに今度は金額の「円」を探しましょう。「円」の位置までが金額です。 金額の前には思いっきり空白が入っているので、それを取り除けば取得出来ます。 ソースコードはこんな感じになります。 Dim infoIndex As Integer = html.IndexOf("現物買付余力") Dim startIndex As Integer = html.IndexOf(">", infoIndex) + 1 Dim endIndex As Integer = html.IndexOf("円", startIndex) Dim yoryoku As Integer = CInt(html.Substring(startIndex, endIndex - startIndex).Trim) 「html」はHTMLページの文字列を表す変数です。 以上のように、Webブラウザ上で操作するのと同様のリクエスト送信をプログラムで 行うために調査する作業と、戻って来たHTMLページを目で確認する代わりにプログラムが それを解釈する作業。大きく2つの作業が必要です。 余力の確認は比較的簡単ですが、発注部分についてはもう少し複雑になりそうです。 URLやHTMLソースを見る限り間違いなくStrutsというWebアプリケーションフレームワークを 使っています。 「注文入力(銘柄情報)」をクリックしてHTMLソースを確認すれば分かりますが、 「org.apache.struts.taglib.html.TOKEN」というINPUTタグが埋め込まれています。 これはトランザクショントークンと呼ばれるもので、正しい画面遷移でオペレーションが 行われている事を保証するためのもので、いきなり発注画面の操作を行おうとしても 上手くいきません。携帯画面で操作するのと同じ手順で画面遷移させないと 受け付けてくれない仕組みになっています。 なので、正しい画面遷移の手順を踏み、HTMLページに含まれているトークンを 次のリクエストでちゃんと送信してあげないと画面遷移エラーになる恐れがあります。 ・・・とか言いながらWebブラウザで操作を確かめると、暗証番号入力後に実際 発注が行われた後で「戻る」ボタンによりもう一度暗証番号を入力するなど、 限られた条件以外ではエラーを返さない事が分かりました(汗)。 トークンは埋め込まれているものの、クリック証券サイドでのエラーチェックは 最小限になっているかも知れません。 以上、私がWebスクレイピングを試してみた結果です。 識者から色々アドバイスを頂けたらなぁと期待していますw あと、私に答えられる事であれば答えたいと思っていますので、もしご不明な点があれば 遠慮なく質問して頂けたらと思います。 お気に入りの記事を「いいね!」で応援しよう
[KATS(自動売買プログラム)] カテゴリの最新記事
|