HTMLファイルをダウンロード
HTMLファイルをダウンロードして何をしたいのかは人それぞれですが、私がやっているのは株価をダウンロードしてMySQLに落とし込むとか、適宜開示情報や格付け情報の監視などでしょうか。
HTMLファイルをダウンロードするには大きく2つの方法があります。
1.Webクエリ
2.HTMLドキュメントを直接ダウンロード
Webクエリは、データメニュー >> Webクエリ >> このようなダイアログが出るので、取り込みボタンでワークシートにある程度Webページのフォーマットが保持されたデータがダウンロードできます。
2の直接ダウンロードとは、"Microsoft Internet Controls"とか"Microsoft XML 3.0"などのライブラリを利用して直接文字列を取得する方式です。1の方が直感的に理解しやすいし、分かりやすいロジックを書くことができます。ディメリットとしては、若干処理時間が遅くなることと、使えば使うほど遅くなる遅延問題があります(*1)。2は、処理スピードが早いのですが、HTMLの理解が必要になります。対象となるHTMLの記述が変わると対応できなくなるといった問題があります。
1:Webクエリ
Application.CutCopyMode = False
Application.StatusBar = "ウェブ情報取り込み処理: "
sURL = "https://stocks.finance.yahoo.co.jp/stocks/detail/?code=9984.T"
With wksTmp.QueryTables.Add(Connection:="URL;" & sURL, Destination:=wksTmp.Range("$A$10"))
'.CommandType = 0
.Name = "deleteme"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = False '<<<<
.RefreshOnFileOpen = False
.BackgroundQuery = False '<<<<
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = False '<<<<
.AdjustColumnWidth = False '<<<<
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
2:HTMLファイル直接ダウンロード(Microsoft XML 3.0)
Public Function GetHTMLText(pURL As String) As String
Dim buff As String
Dim xmlHttp As MSXML2.xmlHttp
GetHTMLText = ""
Set xmlHttp = CreateObject("Msxml2.XMLHTTP")
xmlHttp.Open "GET", pURL, False
xmlHttp.send
GetHTMLText = xmlHttp.responseText
Set xmlHttp = Nothing
End Function
Public Sub Test()
Dim buff As String
Dim sURL As String
Dim iPos1 As Long
Dim iPos2 As Long
sURL = "https://stocks.finance.yahoo.co.jp/stocks/detail/?code=9984.T"
buff = GetHTMLText(sURL)
iPos1 = Instr(buff, "<dd")
If iPos1 > 0 Then iPos2 = Instr(iPos1, buff, ">")
End Sub
ツールメニュー▶▶参照設定で"Microsoft XML 6.0"を選択すること。
結論:
どちらでも好きな方法でダウンロードしてください。HTMLの中にテーブルがあって、その内容をソートしてから処理したい等の要件がある場合は、Webクエリのほうが圧倒的に簡単なのは明白です。ダウンロードしたHTMLの中に銘柄コードがあって、その現値をRSSで拾いたいといった場合もWebクエリが簡単でしょう。単純にHTMLファイルの中のデータを切り出す程度の処理であれば、直接ダウンロードで文字列パースがよいです。
*1 遅延問題に関しては「Webクエリのダウンロード時間がかかるようになった」を参照してください。
スクレイピング対策で「わたしはロボットではありません」的なページをはさんでくるウェブページがありますが、Microsoft XML 6.0にすると回避できるっぽいです。