会社行きたくなかったんです。

自由になりたくて会社辞めました

IT Visual Studio プログラミング

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ソースは「<span class=bld>110.5740 JPY</span>」となっています。
        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ソースは「<span class=bld>110.5740 JPY</span>」となっています。
        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を使えば、うまくいくかもしれないので、今度試してみます。

-IT, Visual Studio, プログラミング

Copyright© 自由になりたくて会社辞めました , 2024 AllRights Reserved Powered by AFFINGER4.