C# 爬取网页上的数据

时间:2022-03-31 07:41:34

       最近工作中需求定时爬取不同城市每天的温度。其实就是通过编程的方法去抓取不同网站网页进行分析筛选的过程。.NET提供了很多类去访问并获得远程网页的数据,比如WebClient类和HttpWebRequest类。这些类对于利用HTTP去访问远端的网页并且下载下来是很有用的,但在对于所下载下来的HTML的解析能力方面,,则显得功能很弱了。推荐一个开源的组件HTML Agility Pack(),它的设计目标是尽可能简化对HTML文档的读和写。这个包本身是利用了DOM文档对象模型去解析HTML的。在此顺便记录一下最近收集的爬取历史和当前天气的网站备用:

      编程使用示例如下:我们要获取如下网页中的天气信息:

    

     下载HTML Agility Pack组件,新建控制台程序,在你的工程中引用相应framework版本对应的组件,示例代码如下:        

string url = @""; 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请求的response。设置断点发现resp.ContentEncoding为空。因此通过HttpWebRequest来下载数据,示例代码如下:

string url = @""; 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();

代码运行效果如下: