国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一小時(shí)掌握:使用ScrapySharp和C#打造新聞下載器

這篇具有很好參考價(jià)值的文章主要介紹了一小時(shí)掌握:使用ScrapySharp和C#打造新聞下載器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一小時(shí)掌握:使用ScrapySharp和C#打造新聞下載器,爬蟲代理,C#,爬蟲技術(shù),c#,開發(fā)語(yǔ)言,ScrapySharp,下載器,新聞,爬蟲代理,動(dòng)態(tài)HTTP代理

引言

爬蟲技術(shù)是指通過(guò)編程的方式,自動(dòng)從互聯(lián)網(wǎng)上獲取和處理數(shù)據(jù)的技術(shù)。爬蟲技術(shù)有很多應(yīng)用場(chǎng)景,比如搜索引擎、數(shù)據(jù)分析、輿情監(jiān)測(cè)、電商比價(jià)等。爬蟲技術(shù)也是一門有趣的技術(shù),可以讓你發(fā)現(xiàn)網(wǎng)絡(luò)上的各種有價(jià)值的信息。

本文將介紹如何使用ScrapySharp和C#語(yǔ)言,打造一個(gè)簡(jiǎn)單的新聞下載器,可以從指定的新聞網(wǎng)站上抓取新聞標(biāo)題、摘要、正文、作者、發(fā)布時(shí)間等信息,并保存到本地文件中。本文的目的是讓你在一小時(shí)內(nèi)掌握ScrapySharp和C#的基本用法,以及爬蟲技術(shù)的基本原理和技巧。

ScrapySharp和C#的介紹

ScrapySharp是一個(gè)基于.NET的爬蟲框架,它提供了一系列的類和方法,可以方便地實(shí)現(xiàn)爬蟲的功能,比如發(fā)送請(qǐng)求、解析響應(yīng)、提取數(shù)據(jù)、保存數(shù)據(jù)等。ScrapySharp的核心類是ScrapingBrowser,它模擬了一個(gè)瀏覽器的行為,可以執(zhí)行JavaScript、處理Cookie、設(shè)置代理等。ScrapySharp還支持CSS選擇器和XPath語(yǔ)法,可以靈活地定位網(wǎng)頁(yè)中的元素。

C#是一種面向?qū)ο蟮木幊陶Z(yǔ)言,它是.NET平臺(tái)的主要語(yǔ)言,可以運(yùn)行在Windows、Linux、Mac等操作系統(tǒng)上。C#語(yǔ)言簡(jiǎn)潔、強(qiáng)大、高效,擁有豐富的類庫(kù)和工具,可以開發(fā)各種類型的應(yīng)用程序,包括桌面應(yīng)用、網(wǎng)站、移動(dòng)應(yīng)用、游戲等。C#還支持多線程編程,可以充分利用CPU的資源,提高程序的性能。

新聞下載器的設(shè)計(jì)

本文的新聞下載器的設(shè)計(jì)思路如下:

  • 首先,定義一個(gè)News類,用來(lái)存儲(chǔ)新聞的各種屬性,比如標(biāo)題、摘要、正文、作者、發(fā)布時(shí)間等。
  • 然后,定義一個(gè)NewsDownloader類,用來(lái)實(shí)現(xiàn)新聞下載器的主要邏輯,包括以下幾個(gè)方法:
    • 構(gòu)造方法,用來(lái)初始化ScrapingBrowser對(duì)象,設(shè)置代理、超時(shí)、用戶代理等參數(shù)。
    • GetNewsUrls方法,用來(lái)從指定的新聞網(wǎng)站的首頁(yè)上,獲取所有新聞的鏈接,并返回一個(gè)字符串列表。
    • GetNewsContent方法,用來(lái)從指定的新聞鏈接上,獲取新聞的內(nèi)容,并返回一個(gè)News對(duì)象。
    • SaveNews方法,用來(lái)將一個(gè)News對(duì)象保存到本地文件中,文件名為新聞的標(biāo)題,文件格式為txt。
    • DownloadNews方法,用來(lái)下載所有新聞,并保存到本地文件夾中,文件夾名為新聞網(wǎng)站的域名。
  • 最后,定義一個(gè)Program類,用來(lái)作為程序的入口,創(chuàng)建一個(gè)NewsDownloader對(duì)象,并調(diào)用其DownloadNews方法,傳入要爬取的新聞網(wǎng)站的地址。

新聞下載器的代碼

本文的新聞下載器的代碼如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using HtmlAgilityPack;
using ScrapySharp.Extensions;
using ScrapySharp.Network;

namespace NewsDownloader
{
    // 定義一個(gè)News類,用來(lái)存儲(chǔ)新聞的各種屬性
    public class News
    {
        public string Title { get; set; } // 標(biāo)題
        public string Summary { get; set; } // 摘要
        public string Content { get; set; } // 正文
        public string Author { get; set; } // 作者
        public string Time { get; set; } // 發(fā)布時(shí)間
    }

    // 定義一個(gè)NewsDownloader類,用來(lái)實(shí)現(xiàn)新聞下載器的主要邏輯
    public class NewsDownloader
    {
        private ScrapingBrowser browser; // 定義一個(gè)ScrapingBrowser對(duì)象,用來(lái)模擬瀏覽器的行為
        //億牛云 設(shè)置爬蟲代理加強(qiáng)版
        private string proxyDomain = "http://www.16yun.cn"; // 定義代理的域名
        private int proxyPort = 9010; // 定義代理的端口
        private string proxyUser = "16YUN"; // 定義代理的用戶名
        private string proxyPass = "16IP"; // 定義代理的密碼

        // 構(gòu)造方法,用來(lái)初始化ScrapingBrowser對(duì)象,設(shè)置代理、超時(shí)、用戶代理等參數(shù)
        public NewsDownloader()
        {
            browser = new ScrapingBrowser();
            browser.Timeout = TimeSpan.FromSeconds(10); // 設(shè)置超時(shí)時(shí)間為10秒
            browser.UserAgent = new FakeUserAgent("Chrome", 88.0); // 設(shè)置用戶代理為Chrome 88.0
            browser.UseDefaultCookiesParser = false; // 禁用默認(rèn)的Cookie解析器
            browser.Proxy = new WebProxy(proxyDomain, proxyPort); // 設(shè)置代理
            browser.Proxy.Credentials = new NetworkCredential(proxyUser, proxyPass); // 設(shè)置代理的憑證
        }

        // GetNewsUrls方法,用來(lái)從指定的新聞網(wǎng)站的首頁(yè)上,獲取所有新聞的鏈接,并返回一個(gè)字符串列表
        public List<string> GetNewsUrls(string url)
        {
            List<string> newsUrls = new List<string>(); // 定義一個(gè)字符串列表,用來(lái)存儲(chǔ)新聞的鏈接
            try
            {
                WebPage homePage = browser.NavigateToPage(new Uri(url)); // 使用ScrapingBrowser對(duì)象訪問新聞網(wǎng)站的首頁(yè),并獲取WebPage對(duì)象
                HtmlNode homeNode = homePage.Html; // 從WebPage對(duì)象中獲取HtmlNode對(duì)象,表示網(wǎng)頁(yè)的HTML文檔
                IEnumerable<HtmlNode> newsNodes = homeNode.CssSelect("a[href*='/news/']"); // 使用CSS選擇器,從HtmlNode對(duì)象中獲取所有包含'/news/'的a標(biāo)簽的HtmlNode對(duì)象,表示新聞的鏈接
                foreach (HtmlNode newsNode in newsNodes) // 遍歷所有新聞的鏈接
                {
                    string newsUrl = newsNode.GetAttributeValue("href", null); // 從HtmlNode對(duì)象中獲取href屬性的值,表示新聞的鏈接
                    if (newsUrl != null && !newsUrls.Contains(newsUrl)) // 如果新聞的鏈接不為空,且不在字符串列表中
                    {
                        newsUrls.Add(newsUrl); // 將新聞的鏈接添加到字符串列表中
                    }
                }
            }
            catch (Exception ex) // 捕獲異常
            {
                Console.WriteLine("GetNewsUrls error: " + ex.Message); // 在控制臺(tái)輸出異常信息
            }
            return newsUrls; // 返回字符串列表
        }

        // GetNewsContent方法,用來(lái)從指定的新聞鏈接上,獲取新聞的內(nèi)容,并返回一個(gè)News對(duì)象
        public News GetNewsContent(string url)
        {
            News news = new News(); // 定義一個(gè)News對(duì)象,用來(lái)存儲(chǔ)新聞的內(nèi)容
            try
            {
                WebPage newsPage = browser.NavigateToPage(new Uri(url)); // 使用ScrapingBrowser對(duì)象訪問新聞的鏈接,并獲取WebPage對(duì)象
                HtmlNode newsNode = newsPage.Html; // 從WebPage對(duì)象中獲取HtmlNode對(duì)象,表示網(wǎng)頁(yè)的HTML文檔
                HtmlNode titleNode = newsNode.CssSelect("h1").FirstOrDefault(); // 使用CSS選擇器,從HtmlNode對(duì)象中獲取第一個(gè)h1標(biāo)簽的HtmlNode對(duì)象,表示新聞的標(biāo)題
                HtmlNode summaryNode = newsNode.CssSelect("p.summary").FirstOrDefault(); // 使用CSS選擇器,從HtmlNode對(duì)象中獲取第一個(gè)p標(biāo)簽,且class屬性為summary的HtmlNode對(duì)象,表示新聞的摘要
                HtmlNode contentNode = newsNode.CssSelect("div.article-content").FirstOrDefault(); // 使用CSS選擇器,從HtmlNode對(duì)象中獲取第一個(gè)div標(biāo)簽,且class屬性為article-content的HtmlNode對(duì)象,表示新聞的正文
                HtmlNode authorNode = newsNode.CssSelect("span.author").FirstOrDefault(); // 使用CSS選擇器,從HtmlNode對(duì)象中獲取第一個(gè)span標(biāo)簽,且class屬性為author的HtmlNode對(duì)象,表示新聞的作者
                HtmlNode timeNode = newsNode.CssSelect("span.time").FirstOrDefault(); // 使用CSS選擇器,從HtmlNode對(duì)象中獲取第一個(gè)span標(biāo)簽,且class屬性為time的HtmlNode對(duì)象,表示新聞的發(fā)布時(shí)間
                if (titleNode != null) // 如果標(biāo)題節(jié)點(diǎn)不為空
                {
                    news.Title = titleNode.InnerText.Trim(); // 從HtmlNode對(duì)象中獲取文本內(nèi)容,并去除兩端的空白字符,賦值給News對(duì)象的Title屬性
                }
                if (summaryNode != null) // 如果摘要節(jié)點(diǎn)不為空
                {
                    news.Summary = summaryNode.InnerText.Trim(); // 從HtmlNode對(duì)象中獲取文本內(nèi)容,并去除兩端的空白字符,賦值給News對(duì)象的Summary屬性
                }
                if (contentNode != null) // 如果正文節(jié)點(diǎn)不為空
                {
                    news.Content = contentNode.InnerText.Trim(); // 從HtmlNode對(duì)象中獲取文本內(nèi)容,并去除兩端的空白字符,賦值給News對(duì)象的Content屬性
                }
                if (authorNode != null) // 如果作者節(jié)點(diǎn)不為空
                {
                    news.Author = authorNode.InnerText.Trim(); // 從HtmlNode對(duì)象中獲取文本內(nèi)容,并去除兩端的空白字符,賦值給News對(duì)象的Author屬性
                }
                if (timeNode != null) // 如果時(shí)間節(jié)點(diǎn)不為空
                {
                    news.Time = timeNode.InnerText.Trim(); // 從HtmlNode對(duì)象中獲取文本內(nèi)容,并去除兩端的空白字符,賦值給News對(duì)象的Time屬性
                }
            }
            catch (Exception ex) // 捕獲異常
            {
                Console.WriteLine("GetNewsContent error: " + ex.Message); // 在控制臺(tái)輸出異常信息
            }
            return news; // 返回News對(duì)象
        }

        // SaveNews方法,用來(lái)將一個(gè)News對(duì)象保存到本地文件中,文件名為新聞的標(biāo)題,文件格式為txt
        public void SaveNews(News news, string folder)
        {
            try
            {
                string fileName = news.Title + ".txt"; // 定義文件名為新聞的標(biāo)題加上.txt后綴
                string filePath = Path.Combine(folder, fileName); // 定義文件路徑為文件夾和文件名的組合
                using (StreamWriter writer = new StreamWriter(filePath, false, Encoding.UTF8)) // 使用StreamWriter對(duì)象,以UTF-8編碼,覆蓋模式,打開或創(chuàng)建文件
                {
                    writer.WriteLine("標(biāo)題:" + news.Title); // 寫入新聞的標(biāo)題
                    writer.WriteLine("摘要:" + news.Summary); // 寫入新聞的摘要
                    writer.WriteLine("正文:" + news.Content); // 寫入新聞的正文
                    writer.WriteLine("作者:" + news.Author); // 寫入新聞的作者
                    writer.WriteLine("時(shí)間:" + news.Time); // 寫入新聞的時(shí)間
                }
            }
            catch (Exception ex) // 捕獲異常
            {
                Console.WriteLine("SaveNews error: " + ex.Message); // 在控制臺(tái)輸出異常信息
            }
        }

        // DownloadNews方法,用來(lái)下載所有新聞,并保存到本地文件夾中,文件夾名為新聞網(wǎng)站的域名
        public void DownloadNews(string url)
        {
            try
            {
                Uri uri = new Uri(url); // 定義一個(gè)Uri對(duì)象,表示新聞網(wǎng)站的地址
                string folder = uri.Host; // 定義文件夾名為Uri對(duì)象的Host屬性,表示新聞網(wǎng)站的域名
                if (!Directory.Exists(folder)) // 如果文件夾不存在
                {
                    Directory.CreateDirectory(folder); // 創(chuàng)建文件夾
                }
                List<string> newsUrls = GetNewsUrls(url); // 調(diào)用GetNewsUrls方法,獲取所有新聞的鏈接
                Parallel.ForEach(newsUrls, newsUrl => // 使用Parallel類的ForEach方法,對(duì)所有新聞的鏈接進(jìn)行并行處理,提高采集效率
                {
                    News news = GetNewsContent(newsUrl); // 調(diào)用GetNewsContent方法,獲取新聞的內(nèi)容
                    SaveNews(news, folder); // 調(diào)用SaveNews方法,將新聞保存到本地文件中
                    Console.WriteLine("Downloaded: " + news.Title); // 在控制臺(tái)輸出下載成功的新聞的標(biāo)題
                });
                Console.WriteLine("Download completed!"); // 在控制臺(tái)輸出下載完成的提示
            }
            catch (Exception ex) // 捕獲異常
            {
                Console.WriteLine("DownloadNews error: " + ex.Message); // 在控制臺(tái)輸出異常信息
            }
        }
    }

    // 定義一個(gè)Program類,用來(lái)作為程序的入口
    class Program
    {
        static void Main(string[] args)
        {
            NewsDownloader downloader = new NewsDownloader(); // 創(chuàng)建一個(gè)NewsDownloader對(duì)象
            downloader.DownloadNews("https://www.bbc.com/news"); // 調(diào)用其DownloadNews方法,傳入要爬取的新聞網(wǎng)站的地址
            Console.ReadKey(); // 等待用戶按鍵
        }
    }
}

結(jié)論

本文介紹了如何使用ScrapySharp和C#語(yǔ)言,打造一個(gè)簡(jiǎn)單的新聞下載器,可以從指定的新聞網(wǎng)站上抓取新聞標(biāo)題、摘要、正文、作者、發(fā)布時(shí)間等信息,并保存到本地文件中。本文的目的是讓你在一小時(shí)內(nèi)掌握ScrapySharp和C#的基本用法,以及爬蟲技術(shù)的基本原理和技巧。

本文的技術(shù)文章和代碼僅供參考,你可以根據(jù)自己的需求和興趣,修改或擴(kuò)展它們,實(shí)現(xiàn)更多的功能,比如添加異常處理、日志記錄、數(shù)據(jù)清洗、數(shù)據(jù)分析等。希望本文能對(duì)你的學(xué)習(xí)和開發(fā)有所幫助。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-790942.html

到了這里,關(guān)于一小時(shí)掌握:使用ScrapySharp和C#打造新聞下載器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包