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」の別バージョン。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です