User Tools

Site Tools

study:anglesharp:20250311-002:index

C# 創建了一個批次過程,從特定網站抓取資訊並發送電子郵件 (2025-03-11)

Local Backup

介紹

  • 某個網站的公告部分是否已更新?由於每次檢查資料都很麻煩,因此我創建了一個批次處理過程來抓取資料並發送電子郵件。
  • 在研究了各種庫之後,我發現一個看起來有用的名為 AngleSharp 的庫,所以我嘗試使用它來實現它。
  • 以下有關 AngleSharp 的文章非常容易理解!謝謝你! ! !
  • 對於郵件伺服器,我們使用了 Gmail 的免費郵件伺服器。

範例程式碼

  • 這次我做的很快,所以目標網站和郵件伺服器的資訊都直接寫在原始碼裡了。
  • 如果要正確地製作它,我認為最好將這些部分製作成外部文件。
  • 另外,我覺得把所有內容都寫在一堂課裡有點奇怪,但請原諒我。
  • using AngleSharp.Html.Dom;
    using AngleSharp.Html.Parser;
    using System;
    using System.Net.Http;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ScrapingApp
    {
    	class Program
    	{
    	    private static readonly HttpClient _client = new();
    	    static async Task Main()
    	    {
    	        var urlstring = "您要抓取的網站的 URL";
    	        using var stream = await _client.GetStreamAsync(new Uri(urlstring));
    	        var parser = new HtmlParser();
    	        // 以流的形式取得指定網站的 HTML
    	        IHtmlDocument doc = await parser.ParseDocumentAsync(stream);
    
    	        // 下面設定到★部分就可以得到我想要取得的資訊了
    	        // 就是全部了,所以這會根據您想要獲得的內容而有所不同。
    	        var tdElements = doc.GetElementById("Id名").QuerySelectorAll("セレクタ");
    	        var yearStr = DateTime.Now.Year.ToString();
    	        // 將要放入電子郵件正文的內容放入 StringBuilder 中
    	        StringBuilder sb = new();
    	        foreach (var tr in tdElements)
    	        {
    	            // 網站上未顯示年份,因此新增了該年份
    	            var dttmText = $"{yearStr}/{tr.QuerySelector("セレクタ").TextContent}";
    	            // 如果應用程式執行前一天內有任何更新,它們將被添加到電子郵件正文中 
    	            // 這次我們將透過電子郵件發送文字和 URL(href)
    	            if (DateTime.Now.AddDays(-1).CompareTo(DateTime.Parse(dttmText)) > 0)
    	                break;
    	            sb.AppendLine($"{tr.QuerySelector("發佈日期").TextContent} 投稿日付:{dttmText}");
    	            sb.AppendLine(tr.QuerySelector("選擇器").GetAttribute("href"));
    	        }
    	        // ★
    
    	        // 從這裡開始,我們使用一個名為 MailKit 的函式庫來傳送電子郵件
    	        var message = new MimeKit.MimeMessage();
    	        message.From.Add(new MimeKit.MailboxAddress("郵件寄件者姓名", "郵件寄件者地址"));
    	        message.To.Add(new MimeKit.MailboxAddress("信箱名稱", "信箱位址"));
    	        message.Subject = "我正在向您發送有關此內容的通知...";
    	        var textPart = new MimeKit.TextPart(MimeKit.Text.TextFormat.Plain)
    	        {
    	            Text = string.IsNullOrEmpty(sb.ToString()) 
    	                ? "我去尋找新的 XX,但沒有找到(;´∀`)\n抱歉給你發了一封無用的電子郵件m(__)m"
    	                : sb.ToString()
    	        };
    	        message.Body = textPart;
    
    	        using var client = new MailKit.Net.Smtp.SmtpClient();
    	        try
    	        {
    	            await client.ConnectAsync("smtp.gmail.com", 587);
    	            await client.AuthenticateAsync("Gmail電子郵件地址", "Gmail帳戶密碼");
    	            await client.SendAsync(message);
    	            await client.DisconnectAsync(true);
    	        }
    	        catch (Exception ex)
    	        {
    	            Console.WriteLine(ex.ToString());
    	        }
    	    }
    	}
    }
  • 因此,我將其設定到任務規劃程序中,並等待它每天早上 7 點和下午 6 點發送。

結論

  • 不過,AngleSharp 非常棒,因為它讓抓取變得如此簡單! !
  • 如果您有機會在工作中進行抓取,請嘗試使用這個庫! !
  • 新增於 2021/09/23
    • 最後經過重構和增加功能之後,變成了這樣:
    • (從電子郵件更改為 LINE、部署在 AWS 上而不是使用本機 PC 上的任務排程器等)

Permalink study/anglesharp/20250311-002/index.txt · Last modified: 2025/03/11 08:18 by jethro

oeffentlich