Webサイトのスクレイピングを作ってみる
「スクレイビング」だと思っていたのに「スクレイピング」だった…
製作環境
VisualStudio2022、.Net4.7.2、NuGet(HtmlAgilityPack1.5.0.1、System.Text.Encoding7.0.0)
参考サイト
C# + Html Agility Pack で基本的なことを少し触ってみる
製作
取りあえず、ボタンをクリックしたら動くように作ってみた。
URL欄はダミー。
結果。
タイトルとリンクを取得。
コード
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.Http; using System.Diagnostics; using HtmlAgilityPack; namespace WebAgility1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private async void SearchButtonClicked(object sender, EventArgs e) { var builder = new UriBuilder("https://news.yahoo.co.jp/"); var client = new HttpClient(); client.Timeout = TimeSpan.FromSeconds(10.0); string htmlString = await client.GetStringAsync(builder.Uri); HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument(); html.LoadHtml(htmlString); var root = html.DocumentNode; var nodes = root.SelectNodes("//*[@id=\"uamods-topics\"]/div/div/div/ul/li[1 or 8]/a") .Select(s => new { ctxt = s.InnerText.Trim(), href = s.Attributes["href"].Value.Trim() }); foreach (var item in nodes) { var ndbuilder = new UriBuilder(item.href); var ndclient = new HttpClient(); ndclient.Timeout = TimeSpan.FromSeconds(10.0); string ndString = await ndclient.GetStringAsync(ndbuilder.Uri); HtmlAgilityPack.HtmlDocument ndhtml = new HtmlAgilityPack.HtmlDocument(); ndhtml.LoadHtml(ndString); var ndroot = ndhtml.DocumentNode; var title = ndroot.SelectNodes("//*[@id=\"uamods-pickup\"]/div[2]/a/p") .Select(s => new { ctxt = s.InnerText.Trim() }); foreach (var tl in title) { Console.WriteLine(tl.ctxt); } var link = ndroot.SelectNodes("//*[@id=\"uamods-pickup\"]/div[2]/div/p/a") .Select(s => new { ctxt = s.InnerText.Trim(), href = s.Attributes["href"].Value.Trim() }); foreach(var lk in link) { Console.WriteLine(lk.ctxt + " " + lk.href); } /* var title = ndroot.SelectSingleNode("//*[@id=\"uamods-pickup\"]/div[2]/a/p"); Console.WriteLine(title.InnerText.Trim()); var link = ndroot.SelectSingleNode("//*[@id=\"uamods-pickup\"]/div[2]/div/p/a"); Console.WriteLine(link.Attributes["href"].Value.Trim()); */ } } } }
下のコメント部分は上の「title」「link」の別バージョン。