VB.netで Html Agility Packを使ってみました。


今まで、VB.netでスクレイピングをするときは、WebRequestを使っていました。
WebRequesでHTMLを取得して、自分で解析するプログラムを書いて…
.NETには、HTMLパーサーが組み込まれていないので、そんなことをしていました。

.NET用のHTMLパーサーといえば、「Html Agility Pack」だという記述を多数見つけたので、使ってみることにしました。

まずは、「HtmlAgilityPackTest」というWindowsフォームアプリケーションを作成

ツール>Nugetパッケージマネージャー>ソリューションのNugetパッケージの管理を開きます。
参照を選択し、「Html Agility Pack」と入力すると、次のように表示されます。

Html Agility Packを選択し、プロジェクト名にチェックを入れて、インストールをクリックします。

参照にHtmlAgilityPackが追加されました。

試しに、Google Currency Converterをスクレイピングして、USDのレートを取得してみます。

URLは、「https://www.google.com/finance/converter?a=1&from=usd&to=JPY」です。
アクセスすると次の画像のように表示されます。

Html Agility Pack を使って「110.5740 JPY」を取得してみます。

btn為替レートテストとRichTextBox1をフォームに配置しました。

コードを書いてみました。

WebClientを使う方法

    Dim sURL As String  
    Dim sHTML As String  
    Dim objWC As System.Net.WebClient  
    Dim objDOC As HtmlAgilityPack.HtmlDocument  
    Dim objNodes As HtmlAgilityPack.HtmlNodeCollection

‘1ドルをGoogle Currency Converterで円に変換するURL
sURL = “https://www.google.com/finance/converter?a=1&from=usd&to=JPY
objWC = New System.Net.WebClient()
sHTML = objWC.DownloadString(sURL)

objDOC = New HtmlAgilityPack.HtmlDocument()
objDOC.LoadHtml(sHTML)

‘HTMLソースは「110.5740 JPY」となっています。
objNodes = objDOC.DocumentNode.SelectNodes(“//span”)

For Each node As HtmlAgilityPack.HtmlNode In objNodes
RichTextBox1.Text += node.InnerText
Next

HttpWebRequestを使う方法

    Dim sURL As String  
    Dim objWReq As System.Net.HttpWebRequest  
    Dim objWRes As System.Net.HttpWebResponse  
    Dim objDOC As HtmlAgilityPack.HtmlDocument  
    Dim objNodes As HtmlAgilityPack.HtmlNodeCollection

‘1ドルをGoogle Currency Converterで円に変換するURL
sURL = “https://www.google.com/finance/converter?a=1&from=usd&to=JPY
objWReq = WebRequest.Create(sURL)
objWRes = objWReq.GetResponse()

objDOC = New HtmlAgilityPack.HtmlDocument()
objDOC.Load(objWRes.GetResponseStream())

‘HTMLソースは「110.5740 JPY」となっています。
objNodes = objDOC.DocumentNode.SelectNodes(“//span”)

For Each node As HtmlAgilityPack.HtmlNode In objNodes
RichTextBox1.Text += node.InnerText
Next

btn為替レートテストをクリックしたら、RichTextBox1に「110.5390 JPY」と表示されました。
(コードを書いている間に、レートが更新されてしまいました。)

Html Agility Pack を使ったら、かなり楽になりました。

ただ、WebClientやHttpWebRequestでアクセスすると、ブラウザだと表示できるのに404エラーが発生したり、

要求は中止されました: SSL/TLS のセキュリティで保護されているチャネルを作成できませんでした

というエラーが発生したりして、スクレイピングできないページが多数存在します。

その辺は、Selenium WebDriverを使えば、うまくいくかもしれないので、今度試してみます。