今まで、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を使う方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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を使う方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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を使えば、うまくいくかもしれないので、今度試してみます。