一小时掌握:使用ScrapySharp和C#打造新闻下载器

亿牛云

引言

爬虫技术是指通过编程的方式,自动从互联网上获取和处理数据的技术。爬虫技术有很多应用场景,比如搜索引擎、数据分析、舆情监测、电商比价等。爬虫技术也是一门有趣的技术,可以让你发现网络上的各种有价值的信息。

本文将介绍如何使用ScrapySharp和C#语言,打造一个简单的新闻下载器,可以从指定的新闻网站上抓取新闻标题、摘要、正文、作者、发布时间等信息,并保存到本地文件中。本文的目的是让你在一小时内掌握ScrapySharp和C#的基本用法,以及爬虫技术的基本原理和技巧。

ScrapySharp和C#的介绍

ScrapySharp是一个基于.NET的爬虫框架,它提供了一系列的类和方法,可以方便地实现爬虫的功能,比如发送请求、解析响应、提取数据、保存数据等。ScrapySharp的核心类是ScrapingBrowser,它模拟了一个浏览器的行为,可以执行JavaScript、处理Cookie、设置代理等。ScrapySharp还支持CSS选择器和XPath语法,可以灵活地定位网页中的元素。

C#是一种面向对象的编程语言,它是.NET平台的主要语言,可以运行在Windows、Linux、Mac等操作系统上。C#语言简洁、强大、高效,拥有丰富的类库和工具,可以开发各种类型的应用程序,包括桌面应用、网站、移动应用、游戏等。C#还支持多线程编程,可以充分利用CPU的资源,提高程序的性能。

新闻下载器的设计

本文的新闻下载器的设计思路如下:

  • 首先,定义一个News类,用来存储新闻的各种属性,比如标题、摘要、正文、作者、发布时间等。
  • 然后,定义一个NewsDownloader类,用来实现新闻下载器的主要逻辑,包括以下几个方法:
    • 构造方法,用来初始化ScrapingBrowser对象,设置代理、超时、用户代理等参数。
    • GetNewsUrls方法,用来从指定的新闻网站的首页上,获取所有新闻的链接,并返回一个字符串列表。
    • GetNewsContent方法,用来从指定的新闻链接上,获取新闻的内容,并返回一个News对象。
    • SaveNews方法,用来将一个News对象保存到本地文件中,文件名为新闻的标题,文件格式为txt。
    • DownloadNews方法,用来下载所有新闻,并保存到本地文件夹中,文件夹名为新闻网站的域名。
  • 最后,定义一个Program类,用来作为程序的入口,创建一个NewsDownloader对象,并调用其DownloadNews方法,传入要爬取的新闻网站的地址。

新闻下载器的代码

本文的新闻下载器的代码如下:

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
{// 定义一个News类,用来存储新闻的各种属性public class News{public string Title { get; set; } // 标题public string Summary { get; set; } // 摘要public string Content { get; set; } // 正文public string Author { get; set; } // 作者public string Time { get; set; } // 发布时间}// 定义一个NewsDownloader类,用来实现新闻下载器的主要逻辑public class NewsDownloader{private ScrapingBrowser browser; // 定义一个ScrapingBrowser对象,用来模拟浏览器的行为//亿牛云 设置爬虫代理加强版private string proxyDomain = "http://www.16yun.cn"; // 定义代理的域名private int proxyPort = 9010; // 定义代理的端口private string proxyUser = "16YUN"; // 定义代理的用户名private string proxyPass = "16IP"; // 定义代理的密码// 构造方法,用来初始化ScrapingBrowser对象,设置代理、超时、用户代理等参数public NewsDownloader(){browser = new ScrapingBrowser();browser.Timeout = TimeSpan.FromSeconds(10); // 设置超时时间为10秒browser.UserAgent = new FakeUserAgent("Chrome", 88.0); // 设置用户代理为Chrome 88.0browser.UseDefaultCookiesParser = false; // 禁用默认的Cookie解析器browser.Proxy = new WebProxy(proxyDomain, proxyPort); // 设置代理browser.Proxy.Credentials = new NetworkCredential(proxyUser, proxyPass); // 设置代理的凭证}// GetNewsUrls方法,用来从指定的新闻网站的首页上,获取所有新闻的链接,并返回一个字符串列表public List<string> GetNewsUrls(string url){List<string> newsUrls = new List<string>(); // 定义一个字符串列表,用来存储新闻的链接try{WebPage homePage = browser.NavigateToPage(new Uri(url)); // 使用ScrapingBrowser对象访问新闻网站的首页,并获取WebPage对象HtmlNode homeNode = homePage.Html; // 从WebPage对象中获取HtmlNode对象,表示网页的HTML文档IEnumerable<HtmlNode> newsNodes = homeNode.CssSelect("a[href*='/news/']"); // 使用CSS选择器,从HtmlNode对象中获取所有包含'/news/'的a标签的HtmlNode对象,表示新闻的链接foreach (HtmlNode newsNode in newsNodes) // 遍历所有新闻的链接{string newsUrl = newsNode.GetAttributeValue("href", null); // 从HtmlNode对象中获取href属性的值,表示新闻的链接if (newsUrl != null && !newsUrls.Contains(newsUrl)) // 如果新闻的链接不为空,且不在字符串列表中{newsUrls.Add(newsUrl); // 将新闻的链接添加到字符串列表中}}}catch (Exception ex) // 捕获异常{Console.WriteLine("GetNewsUrls error: " + ex.Message); // 在控制台输出异常信息}return newsUrls; // 返回字符串列表}// GetNewsContent方法,用来从指定的新闻链接上,获取新闻的内容,并返回一个News对象public News GetNewsContent(string url){News news = new News(); // 定义一个News对象,用来存储新闻的内容try{WebPage newsPage = browser.NavigateToPage(new Uri(url)); // 使用ScrapingBrowser对象访问新闻的链接,并获取WebPage对象HtmlNode newsNode = newsPage.Html; // 从WebPage对象中获取HtmlNode对象,表示网页的HTML文档HtmlNode titleNode = newsNode.CssSelect("h1").FirstOrDefault(); // 使用CSS选择器,从HtmlNode对象中获取第一个h1标签的HtmlNode对象,表示新闻的标题HtmlNode summaryNode = newsNode.CssSelect("p.summary").FirstOrDefault(); // 使用CSS选择器,从HtmlNode对象中获取第一个p标签,且class属性为summary的HtmlNode对象,表示新闻的摘要HtmlNode contentNode = newsNode.CssSelect("div.article-content").FirstOrDefault(); // 使用CSS选择器,从HtmlNode对象中获取第一个div标签,且class属性为article-content的HtmlNode对象,表示新闻的正文HtmlNode authorNode = newsNode.CssSelect("span.author").FirstOrDefault(); // 使用CSS选择器,从HtmlNode对象中获取第一个span标签,且class属性为author的HtmlNode对象,表示新闻的作者HtmlNode timeNode = newsNode.CssSelect("span.time").FirstOrDefault(); // 使用CSS选择器,从HtmlNode对象中获取第一个span标签,且class属性为time的HtmlNode对象,表示新闻的发布时间if (titleNode != null) // 如果标题节点不为空{news.Title = titleNode.InnerText.Trim(); // 从HtmlNode对象中获取文本内容,并去除两端的空白字符,赋值给News对象的Title属性}if (summaryNode != null) // 如果摘要节点不为空{news.Summary = summaryNode.InnerText.Trim(); // 从HtmlNode对象中获取文本内容,并去除两端的空白字符,赋值给News对象的Summary属性}if (contentNode != null) // 如果正文节点不为空{news.Content = contentNode.InnerText.Trim(); // 从HtmlNode对象中获取文本内容,并去除两端的空白字符,赋值给News对象的Content属性}if (authorNode != null) // 如果作者节点不为空{news.Author = authorNode.InnerText.Trim(); // 从HtmlNode对象中获取文本内容,并去除两端的空白字符,赋值给News对象的Author属性}if (timeNode != null) // 如果时间节点不为空{news.Time = timeNode.InnerText.Trim(); // 从HtmlNode对象中获取文本内容,并去除两端的空白字符,赋值给News对象的Time属性}}catch (Exception ex) // 捕获异常{Console.WriteLine("GetNewsContent error: " + ex.Message); // 在控制台输出异常信息}return news; // 返回News对象}// SaveNews方法,用来将一个News对象保存到本地文件中,文件名为新闻的标题,文件格式为txtpublic void SaveNews(News news, string folder){try{string fileName = news.Title + ".txt"; // 定义文件名为新闻的标题加上.txt后缀string filePath = Path.Combine(folder, fileName); // 定义文件路径为文件夹和文件名的组合using (StreamWriter writer = new StreamWriter(filePath, false, Encoding.UTF8)) // 使用StreamWriter对象,以UTF-8编码,覆盖模式,打开或创建文件{writer.WriteLine("标题:" + news.Title); // 写入新闻的标题writer.WriteLine("摘要:" + news.Summary); // 写入新闻的摘要writer.WriteLine("正文:" + news.Content); // 写入新闻的正文writer.WriteLine("作者:" + news.Author); // 写入新闻的作者writer.WriteLine("时间:" + news.Time); // 写入新闻的时间}}catch (Exception ex) // 捕获异常{Console.WriteLine("SaveNews error: " + ex.Message); // 在控制台输出异常信息}}// DownloadNews方法,用来下载所有新闻,并保存到本地文件夹中,文件夹名为新闻网站的域名public void DownloadNews(string url){try{Uri uri = new Uri(url); // 定义一个Uri对象,表示新闻网站的地址string folder = uri.Host; // 定义文件夹名为Uri对象的Host属性,表示新闻网站的域名if (!Directory.Exists(folder)) // 如果文件夹不存在{Directory.CreateDirectory(folder); // 创建文件夹}List<string> newsUrls = GetNewsUrls(url); // 调用GetNewsUrls方法,获取所有新闻的链接Parallel.ForEach(newsUrls, newsUrl => // 使用Parallel类的ForEach方法,对所有新闻的链接进行并行处理,提高采集效率{News news = GetNewsContent(newsUrl); // 调用GetNewsContent方法,获取新闻的内容SaveNews(news, folder); // 调用SaveNews方法,将新闻保存到本地文件中Console.WriteLine("Downloaded: " + news.Title); // 在控制台输出下载成功的新闻的标题});Console.WriteLine("Download completed!"); // 在控制台输出下载完成的提示}catch (Exception ex) // 捕获异常{Console.WriteLine("DownloadNews error: " + ex.Message); // 在控制台输出异常信息}}}// 定义一个Program类,用来作为程序的入口class Program{static void Main(string[] args){NewsDownloader downloader = new NewsDownloader(); // 创建一个NewsDownloader对象downloader.DownloadNews("https://www.bbc.com/news"); // 调用其DownloadNews方法,传入要爬取的新闻网站的地址Console.ReadKey(); // 等待用户按键}}
}

结论

本文介绍了如何使用ScrapySharp和C#语言,打造一个简单的新闻下载器,可以从指定的新闻网站上抓取新闻标题、摘要、正文、作者、发布时间等信息,并保存到本地文件中。本文的目的是让你在一小时内掌握ScrapySharp和C#的基本用法,以及爬虫技术的基本原理和技巧。

本文的技术文章和代码仅供参考,你可以根据自己的需求和兴趣,修改或扩展它们,实现更多的功能,比如添加异常处理、日志记录、数据清洗、数据分析等。希望本文能对你的学习和开发有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/624154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 142 环形链表II

题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使…

C语言经典算法之简单选择排序算法

目录 前言 建议&#xff1a; 简介&#xff1a; 一、代码实现 二、时空复杂度&#xff1a; 时间复杂度&#xff1a; 空间复杂度&#xff1a; 三、算法的特性&#xff1a; 四、总结 前言 建议&#xff1a; 1.学习算法最重要的是理解算法的每一步&#xff0c;而不是记住…

MySQl导入与导出远程备份

文章目录 一. navicat导入导出 二. mysqldump命令导入导出导入导出 三. load data infile命令导入导出导入导出 四. 远程备份导入导出思维导图 一. navicat 导入 右键——>运行SQL文件 导出 选中要导出的表➡右键➡转储SQL文件➡数据和结构 二. mysqldump命令导入导出…

Oracle全系列版本官网下载保姆及教程

Oracle全系列版本官网下载方法 下面以下载Oracle12cR2为例说明下载的整个过程。 基本步骤如下&#xff1a; 先注册一个Oracle账号并登录&#xff1b;进入到客户下载页面搜索要下载的数据库版本&#xff1b;得到Oracle下载器(Oracle_SSN_DML_xxxxx.exe)&#xff0c;注意&#xf…

智慧公厕:颠覆传统公共厕所管理的未来之路

公共卫生设施一直是城市管理中的重要环节&#xff0c;而智慧公厕作为一种全新的公用卫生设施&#xff0c;以其融合了物联网、大数据、云计算等新型信息技术的特点&#xff0c;引起了人们的广泛关注。通过智能化手段的管理和服务&#xff0c;智慧公厕不仅解决了传统公厕中存在的…

微机原理常考填空以及注意事项

以下&#xff1a; 1&#xff0c;两条高位地址线未参加地址译码&#xff0c;则对应的地址范围它的容量是多少倍&#xff1f; 答&#xff1a;公式CPU的地址线&#xff08;假设16位&#xff09;&#xff08;它的低位地址线一般进入片内A0~A10&#xff0c;高位A11就是A、A12就是B、…

DNS

目录 一、名字解析介绍和DNS 1.1.什么是DNS 1.2.域名体系结构 1.3.DNS查询方式 1.4.DNS解析过程 1.5.DNS服务器类型 二、安装配置 2.1.DNS软件bind 2.2.修改权限 和 监听地址 2.3.手写域名配置文件 2.4.手写数据库配置文件 2.5检测文件格式的命令 一、名字解析介绍和…

【OpenCV学习笔记12】- 更改颜色空间

关于 OpenCV 官方文档的核心操作告一段落&#xff0c;接下来开始图像处理的学习。学习笔记中会记录官方给出的例子&#xff0c;也会给出自己根据官方的例子完成的更改代码&#xff0c;同样彩蛋的实现也会结合多个知识点一起实现一些小功能&#xff0c;来帮助我们对学会的知识点…

【数学建模美赛M奖速成系列】数据可视化(二)

数据可视化&#xff08;二&#xff09; 写在前面百分比堆叠线条图优点缺点实现pythonmatlab 火山图优点实现pythonmatlab 最后 写在前面 上一篇文章为大家分享了山脊图和气泡图的绘图方法与代码&#xff0c;这里学姐为继续为大家分享百分比堆叠线条图和火山图&#xff0c;包含…

R语言【文章复现】——集成式地绘制高分辨率的多样性分布图,对方法的检验和优化,以及处理思路的思考

参考文献 本文对一篇 2022 年发表在 New Phytologist 的绘图方法文章中的技术路线进行复现。 An integrated high-resolution mapping shows congruent biodiversity patterns of Fagales and Pinales Summary 文中,作者针对在全球尺度上绘制物种分布图提出了一种全新的方法…

华为网络设备 通过路由器子接口 Dot1q终结子接口实现跨VLAN通信

(二层交换机直接跳过三层交换价接入路由器时才使用该配置。推荐使用三层交换机建立VLANIF配置更简洁明了。如果VLAN较少可直接配置&#xff1b;路由器接口&#xff0c;一个物理接口一个VLAN) S1配置 vlan batch 2 to 3interface GigabitEthernet0/0/1port link-type trunkpor…

为什么代码里需要try/catch

throw 语句用来抛出一个用户自定义的异常,在抛出错误时&#xff0c;throw 之后的语句将不会执行 const getApi (data) > {if (isNaN(data)) {throw new Error(Parameter is not a number!);console.log(bar) // 这句永远不会执行&#xff0c;throw之后的代码都不会}}情况一…

[Python练习]使用Python爬虫爬取豆瓣top250的电影的页面源码

1.安装requests第三方库 在终端中输入以下代码&#xff08;直接在cmd命令提示符中&#xff0c;不需要打开Python&#xff09; pip install requests -i https://pypi.douban.com/simple/ 从豆瓣网提供的镜像网站下载requests第三方库 pip install requests 是从国外网站下…

喜报 ,思迈特荣获广东省“专精特新”企业认定,再创新高

近日&#xff0c;广东省工业和信息化厅发布 2023年专精特新中小企业名单&#xff0c;思迈特软件凭借专业技术实力、创新研发能力、行业影响力以及卓越的企业文化&#xff0c;经过层层选拔&#xff0c;荣获广东省“专精特新”企业认定。思迈特商业智能与大数据分析软件成功上架&…

智能制造工业互联网建设方案——青创智通工业物联网

智能制造已经成为工业发展的重要趋势。智能制造系统架构与工业物联网建设方案作为实现智能制造的关键环节&#xff0c;对于推动工业转型升级和提升企业竞争力具有重要意义。青创智通工业物联网重点探讨智能制造系统架构与工业物联网建设方案的核心要素、实施步骤和未来发展方向…

MySQL进阶篇(六)InnoDB 引擎

一、逻辑存储结构 &#xff08;1&#xff09;表空间 表空间是 InnoDB 存储引擎逻辑结构的最高层&#xff0c; 如果用户启用了参数 innodb_file_per_table(在 8.0版本中默认开启) &#xff0c;则每张表都会有一个表空间&#xff08;xxx.ibd&#xff09;&#xff0c;一个 mysql 实…

可视可交互!在全志H618上用OpenCV读取图像显示到PyQt5窗口上

OpenCV能够处理图像、视频、深度图像等各种类型的视觉数据&#xff0c;在某些情况下&#xff0c;尽管OpenCV可以显示窗口&#xff0c;但PyQt5可能更适合用于创建复杂的交互式应用程序&#xff0c;而自带GPU的H618就成为了这些图像显示的最佳载体。 这里分享一个代码&#xff0…

高精度PWM脉宽调制信号转模拟信号隔离变送器1Hz~10KHz转0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…

云联接:揭开SD-WAN神秘面纱,颠覆你对网络的认知!

云联接&#xff08;Cloud Connect&#xff09;源于软件定义广域网&#xff08;SD-WAN&#xff09;。 软件定义广域网由于技术应用性强&#xff0c;近年来从一个由软件定义网络&#xff08;SDN&#xff09;部分衍生的分支概念发展为大规模普适的实践技术&#xff0c;已成为建立…

Detection-friendly dehazing: object detection in real-world hazy scenes

Detection-friendly dehazing: object detection in real-world hazy scenes 摘要 提出了一种联合架构BAD-Net&#xff0c;将去雾模块和检测模块连接成一个端到端的方法。另外&#xff0c;设计了了两个分支结构&#xff0c;用注意力融合模块来充分结合有雾和去雾特征&#xf…