HTMLファイルをダウンロード

HTMLファイルをダウンロードして何をしたいのかは人それぞれですが、私がやっているのは株価をダウンロードしてMySQLに落とし込むとか、適宜開示情報や格付け情報の監視などでしょうか。

 

HTMLファイルをダウンロードするには大きく2つの方法があります。
1.Webクエリ
2.HTMLドキュメントを直接ダウンロード

 

Webクエリは、データメニュー >> Webクエリ >> このようなダイアログが出るので、取り込みボタンでワークシートにある程度Webページのフォーマットが保持されたデータがダウンロードできます。

f:id:gungnir46:20191106231609p:plain

 

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"pURLFalse
    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にすると回避できるっぽいです。