C#编程之C# 爬取网页上的数据
小标 2018-10-22 来源 : 阅读 1584 评论 0

摘要:本文主要向大家介绍了C#编程之C# 爬取网页上的数据,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

本文主要向大家介绍了C#编程之C# 爬取网页上的数据,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

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

支持历史天气查询的中文网站://lishi.tianqi.com/             
类似网站://tianqi.2345.com/wea_history/59287.htm  (最近2-3年数据)
网站://www.wunderground.com/history/   (最近18年数据)
这个网站支持的时间更长: //www.tutiempo.net/en/Climate/

      编程使用示例如下:我们要获取如下网页中的天气信息:
     
     下载HTML Agility Pack组件,新建控制台程序,在你的工程中引用相应framework版本对应的组件,示例代码如下:        

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

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

代码运行效果如下:
 
 that‘s ok!!!

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程