今まで、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エラーが発生したり、
というエラーが発生したりして、スクレイピングできないページが多数存在します。
その辺は、Selenium WebDriverを使えば、うまくいくかもしれないので、今度試してみます。