c#抓取网页数据(就是通过编程的方法去抓取不同网站网页进行分析筛选)
优采云 发布时间: 2022-03-05 08:21c#抓取网页数据(就是通过编程的方法去抓取不同网站网页进行分析筛选)
近期工作需要定期爬取不同城市的每日气温。其实就是通过编程爬取不同的网站网页进行分析筛选的过程。 .NET 提供了许多类来访问和从远程网页获取数据,例如 WebClient 类和 HttpWebRequest 类。这些类对于使用 HTTP 访问远程网页并下载它们很有用,但它们在解析下载的 HTML 方面非常薄弱。推荐使用开源组件 HTML Agility Pack(),其设计目标是尽可能简化 HTML 文档的读写。包本身利用 DOM 文档对象模型来解析 HTML。顺便记录一下最近采集的爬取历史和当前天气网站备份:
编程示例如下:我们要获取以下网页中的天气信息:
下载HTML Agility Pack组件,新建一个控制台程序,在你的项目中引用对应框架版本对应的组件。示例代码如下:
string url = @"http://lishi.tianqi.com/beijing/201701.html";
var webGet = new HtmlWeb();
var document = webGet.Load(url);
var div = document.DocumentNode.SelectNodes("//div[@class=‘tqtongji2‘]/ul");
foreach (HtmlNode node in div)
{
var tmpNode = node.SelectNodes("li");
Console.WriteLine(string.Format("{0}-----------{1}---------{2}----------{3}",
tmpNode[0].InnerText,
tmpNode[1].InnerText,
tmpNode[2].InnerText,
tmpNode[3].InnerText));
}
Console.ReadKey();
程序运行效果:汉字出现乱码,如下图
通过分析HTML Agility Pack源码,在HtmlWeb类的Get(Uri uri, string method, string path, HtmlDocument doc)方法中,局部变量resp为http请求的响应。设置断点发现resp.ContentEncoding为空。因此,数据是通过 HttpWebRequest 下载的。示例代码如下:
string url = @"http://lishi.tianqi.com/beijing/201701.html";
HttpWebRequest req = WebRequest.Create(new Uri(url)) as HttpWebRequest;
req.Method = "GET";
WebResponse rs = req.GetResponse();
Stream rss = rs.GetResponseStream();
HtmlDocument doc = new HtmlDocument();
doc.Load(rss);
var div = doc.DocumentNode.SelectNodes("//div[@class=‘tqtongji2‘]/ul");
foreach (HtmlNode node in div)
{
var tmpNode = node.SelectNodes("li");
Console.WriteLine(string.Format("{0}-----------{1}---------{2}----------{3}",
tmpNode[0].InnerText,
tmpNode[1].InnerText,
tmpNode[2].InnerText,
tmpNode[3].InnerText));
}
Console.ReadKey();
代码运行如下:
没关系!!!
原文: