由于最近台风挺多,公司网站上需要挂上台风预报信息,就整了个抓取台风数据(至于抓数据的概念和实践手册我以前写的一篇博客里面有介绍:分享一套抓数据小程序,客户资料、实时新闻、股票数据…随心抓)的服务,做调试阶段,发现个诡异的问题。如下:

需要抓取的数据是个xml文件,地址如下:http://typhoon.weather.gov.cn/Typhoon/data/20130041.xml,这是政府气象网发布的最近某个台风的数据信息,具体代表什么意思不是本文研究的范畴,有兴趣的可以研究研究。

1. 首先我用WebClient去请求此地址,核心代码如下:

  WebClient wc = new WebClient();
wc.Encoding = Encoding.UTF8;
string str = wc.DownloadString("http://typhoon.weather.gov.cn/Typhoon/data/20130041.xml");

获取到的数据节点如下:

<typhoon>
<key YMDHM="" V05="11.6" V06="143.1" V07="" V08="" V09="" V11="" V12="NW" V21="" V22="">...</key>
<key YMDHM="" V05="11.2" V06="142.8" V07="" V08="" V09="" V11="" V12="NW" V21="" V22="">...</key>
<key YMDHM="" V05="11.1" V06="142.7" V07="" V08="" V09="" V11="" V12="NNW" V21="" V22="">...</key>
<key YMDHM="" V05="11.3" V06="142.7" V07="" V08="" V09="" V11="" V12="NNW" V21="" V22="">...</key>
<key YMDHM="" V05="12.1" V06="142.8" V07="" V08="" V09="" V11="" V12="NNW" V21="" V22="">...</key>
<key YMDHM="" V05="13.1" V06="142.6" V07="" V08="" V09="" V11="" V12="NNW" V21="" V22="">...</key>
<key YMDHM="" V05="13.8" V06="142.2" V07="" V08="" V09="" V11="" V12="NNW" V21="" V22="">...</key>
<key YMDHM="" V05="14.2" V06="" V07="" V08="" V09="" V11="" V12="NW" V21="" V22="">...</key>
<key YMDHM="" V05="15.2" V06="141.8" V07="" V08="" V09="" V11="" V12="NW" V21="" V22="">...</key>
<key YMDHM="" V05="15.9" V06="141.1" V07="" V08="" V09="" V11="" V12="NW" V21="" V22="">...</key>
<key YMDHM="" V05="16.1" V06="140.5" V07="" V08="" V09="" V11="" V12="NW" V21="" V22="">...</key>
<key YMDHM="" V05="16.7" V06="139.7" V07="" V08="" V09="" V11="" V12="NW" V21="" V22="">...</key>
<key YMDHM="" V05="17.1" V06="139.1" V07="" V08="" V09="" V11="" V12="NW" V21="" V22="">...</key>
<key YMDHM="" V05="17.5" V06="138.3" V07="" V08="" V09="" V11="" V12="NW" V21="" V22="">...</key>
<key YMDHM="" V05="17.8" V06="137.7" V07="" V08="" V09="" V11="" V12="NNW" V21="" V22="">...</key>
<key YMDHM="" V05="18.4" V06="137.3" V07="" V08="" V09="" V11="" V12="NNW" V21="" V22="">...</key>
<key YMDHM="" V05="18.8" V06="136.8" V07="" V08="" V09="" V11="" V12="NNW" V21="" V22="">...</key>
</typhoon>
和从浏览器中打开显示的数据总是少最后两个节点(如下),至于为什么少两个节点,和几个大牛探讨了下,猜测可能是由于官方网站为了保护他自己的最新数据,提高了获取数据的门槛。

<key YMDHM="" V05="19.3" V06="136.6" V07="" V08="" V09="" V11="" V12="NNW" V21="" V22="">...</key>
<key YMDHM="" V05="19.7" V06="136.2" V07="" V08="" V09="" V11="" V12="NNW" V21="" V22="">...</key>
2.此路不通,换个方法,这次我选择使用Http请求去获取,核心代码如下:

        /// <summary>
/// 传入get请求地址,和页面编码格式,返回该页面html源文件,返回wrong则出现异常。
/// </summary>
/// <param name="tUrl">传入url</param>
/// <param name="encodeType">传入 页面的编码格式</param>
/// <returns></returns>
internal static string Get_HttpAll(string tUrl, string encodeType)
{
string strResult;
try
{
HttpWebRequest hwr = CreateHttpWebRequest(tUrl);
hwr.Timeout = ;
CookieContainer cc = new CookieContainer();
hwr.CookieContainer = cc;
HttpWebResponse hwrs = (HttpWebResponse)hwr.GetResponse();
Stream myStream = hwrs.GetResponseStream();
Encoding encoding = Encoding.GetEncoding(encodeType);
StreamReader sr = new StreamReader(myStream, encoding);
strResult = sr.ReadToEnd();
hwrs.Close();
}
catch
{
strResult = "wrong";
}
return strResult;
}
string xmlStr = Common.Get_HttpAll("http://typhoon.weather.gov.cn/Typhoon/data/20130041.xml", "utf-8");

获取结果和上个方法一样是少了两个节点。

这该怎么办呢?使出必杀技!!!


3.选择使用了Webbrowser类去获取数据,核心代码如下
利用Webbrowser加载文档完毕后的状态进行判断然后获取文档):

 private void Delay(int Millisecond)
{
DateTime current = DateTime.Now;
while (current.AddMilliseconds(Millisecond) > DateTime.Now)
{
Application.DoEvents();
}
return;
} WebBrowser wb = new WebBrowser();
string xmlStr = string.Empty;
wb.Navigate("http://typhoon.weather.gov.cn/Typhoon/" + dataUrl);
while (true)
{
Delay();//延迟50毫秒
if (wb.ReadyState == WebBrowserReadyState.Complete)//判断文档是否加载完毕
{
if (!wb.IsBusy)
{
xmlStr = wb.Document.Body.InnerText;
break;
}
}
continue;
}

注:在获取网页数据的时候,会存在页面或页面部分内容是异步加载的情况,这时候通过常用的请求数据方法可能会不完整,这个时候就可以选择使用webbrowser。

      在这个问题中选择webbrowser也是不得已的办法,如果哪位园友有其他高见,望不吝赐教!

正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!

倔强的网站数据抓取,关键时刻还需Webbrowser显身手的更多相关文章

  1. .net网站数据抓取

    最新项目需要抓取人民币汇率中间价的数据,所以就写了个简单的爬虫抓取数据.抓取的网站为:http://www.safe.gov.cn/wps/portal/sy/tjsj_hlzjj_inquire # ...

  2. WebScraper for Mac(网站数据抓取软件) 4.10.2

    WebScraper Mac版是一款Mac平台上通过使用将数据导出为JSON或CSV的简约应用程序,WebScraper Mac版可以快速提取与某个网页(包括文本内容)相关的信息.WebScraper ...

  3. java编写网站数据抓取

    来公司已经俩月了,每天加班平均工时11个小时的我又想起了老东家温馨舒适安逸的生活.已经有好久没时间读博客写博客了,我觉得我退步了,嗯嗯,我很不开心 今天记录下抓数据的一些东西吧. 数据抓取现在是很普遍 ...

  4. 吴裕雄--天生自然python学习笔记:WEB数据抓取与分析

    Web 数据抓取技术具有非常巨大的应用需求及价值, 用 Python 在网页上收集数据,不仅抓取数据的操作简单, 而且其数据分析功能也十分强大. 通过 Python 的时lib 组件中的 urlpar ...

  5. C# 从需要登录的网站上抓取数据

    [转] C# 从需要登录的网站上抓取数据 背景:昨天一个学金融的同学让我帮她从一个网站上抓取数据,然后导出到excel,粗略看了下有1000+条记录,人工统计的话确实不可能.虽说不会,但作为一个学计算 ...

  6. [原创.数据可视化系列之十二]使用 nodejs通过async await建立同步数据抓取

    做数据分析和可视化工作,最重要的一点就是数据抓取工作,之前使用Java和python都做过简单的数据抓取,感觉用的很不顺手. 后来用nodejs发现非常不错,通过js就可以进行数据抓取工作,类似jqu ...

  7. 大数据抓取采集框架(摘抄至http://blog.jobbole.com/46673/)

    摘抄至http://blog.jobbole.com/46673/ 随着BIG DATA大数据概念逐渐升温,如何搭建一个能够采集海量数据的架构体系摆在大家眼前.如何能够做到所见即所得的无阻拦式采集.如 ...

  8. Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)

    概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容.主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作. ...

  9. R语言XML包的数据抓取

    htmlParse 函数 htmlParse加抓HTML页面的函数. url1<-"http://www.caixin.com/"url<-htmlParse(url1 ...

随机推荐

  1. php json_encode中文unicode问题

    php调用json_encode将中文字符串存入mysql后读取出来有问题,发现存进去的时候把'\'给去掉了.解决方法是调用json_encode时候后面加JSON_UNESCAPED_UNICODE ...

  2. XidianOJ 1172 Hiking

    题目描述 BlacKin and GKCY are going hiking together. Besides their personal items, there are some items ...

  3. Mysql常用命令行大全——转载

    转载地址:http://www.blogjava.net/supperchen/archive/2012/10/11/389340.html 第一招.mysql服务的启动和停止 net stop my ...

  4. jquery 删除数组元素

    expertsId.splice($.inArray(thisID.split('&')[0],expertsId),1); 1. expertsId数组名2. thisID.split('& ...

  5. 循序渐进Python3(四) -- 装饰器、迭代器和生成器

    初识装饰器(decorator ) Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数. 使用 decorator 用Python提供的 @ 语法 ...

  6. machine learning----->谷歌Cloud Machine Learning平台

    1.谷歌Cloud Machine Learning平台简介: 机器学习的三要素是数据源.计算资源和模型.谷歌在这三个方面都有强大的支撑:谷歌不仅有种类丰富且数量庞大的数据资源,而且有强大的计算机群提 ...

  7. 接收 ajax POST 方式传入的参数

    ----前台--- var list = new Array(); var params = { gencodeid : "test001", value : "01&q ...

  8. ceph初步快速部署

    一.基本情况:物理设备:4台惠普dl360,4个千兆网卡 4个1T盘操作系统统一为:CentOS 7.2.1511ceph版本:10.2.3ceph-deploy版本:1.5.36网络情况:192.1 ...

  9. System.IO中的File、FileInfo、Directory与DirectoryInfo类(实例讲解)

    一.建立的文件夹(对这些文件进行以上四个类的操作): 父目录: 父目录的子目录以及父目录下的文件: 子目录下的文件: 二.效果图 三.代码实现 using System; using System.I ...

  10. 很实用的jQuery事件 - toggle() 方法

    实例 切换不同的背景色: $("p").toggle( function(){ $("body").css("background-color&quo ...