VBAで株価スクレイピングしようかと思ったんですが、検索すると圧倒的にPythonがヒットするので、どれだけ高速なのか調査も兼ねてPythonの開発環境を整備して、ある程度動作できるところまでやってみました。
ただ、もう面倒くさい。インタープリターベースの言語がなんでこんなに人気があるのか理解できないです。記述もなんというか美しくないんですよね。新たに言語を覚えるならコンパイラベースのC#とかVB#がいいと思うんですが、どうなんでしょうね。もしかして、エクセルは高くて買えないから無料のPythonということなんでしょうか。それなら無償版Visual Studio使えばいいわけで、とにかくこれ以上時間を無駄にするのも意味がないのでVBAでコードを書いてみました。
ヤフーファイナンスは、スクレイピングを禁止しているので株式投資メモ さんをデータソースにしました。
これは本当に適当なテストハーネスです。 stocksテーブルをMySQLで構築しておいて、SELECT instrument_id FROM stocks; みたいな感じでADOでループさせてもいいし、CSVファイルに4000銘柄持っておいてループさせてもいいし、自分のニーズに合わせて記述すればいいでしょう。FileStreamクラスとGetHTMLTextは別記事を参照のこと。
Public Sub foo() DownloadStock "1801", "2016", "2019" End Sub |
ダウンロードしてCSVファイルに書き出すモジュールです。 ダウンロードした4本値をMySQLに直接書き出してもいいし、ワークシートに書き出してもいいでしょう。
Public Sub DownloadStock(pStockID As String, pYearFrom As String, pYearTo As String) Dim sURL As String Dim oStream As Stream
' ---- Open CSV File
' ---- ループ: pYearFrom - pYearTo sURL = "https://kabuoji3.com/stock/" & pStockID & "/" & sYear & "/" Set oPrices = New prices ' ---- レコードトップまで読み飛ばす
' ---- レコードを読み込む 'oRec.Add pStockID & ":" & oPrices.timestamp, oPrices With oPrices sYear = sYear + 1 oFile.CloseStream End Sub
Private Function parseString(pBuff As String, pKey1 As String, pKey2 As String) As String Dim iPos1 As Long iPos1 = InStr(pBuff, pKey1) If iPos1 + iPos2 = 0 Then End Function |
クラス:prices
Option Explicit Public timestamp As String |
クラス:Stream
Option Explicit Private m_sBlock As String
' --------------------------------------------- Public Function ReadLine() As String Dim iPos As Long
iPos = InStr(m_iCurrentPos, m_sBlock, vbLf) iLen = Len(m_sBlock) End Function Public Function EOF() As Boolean If m_iCurrentPos < Len(m_sBlock) Then End Function |
余談:楽天マーケットスピードIIをデータソースにすることも可能ですが、VBAのSendKeysもScript HostのSendKeysも安定しません。4本値以外にもアナリティクスが取れるので何とか実現したいものです。EnumerateChildWindowsでウィンドウクラスを拾って・・・とも思いましたが、コールバック関数のアドレスなんて最低でもVB6じゃないと無理だし、あきらめました。っていうか、楽天がAPIを公開してくれてもよさそうなんですけどね。