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

需要抓取的数据是个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. eclipse 删除所有注释及空白行

    Ctrl+F 删除java注释:  /\*{1,2}[\s\S]*?\*/ Ctrl+F 删除xml注释:  <!-[\s\S]*?--> Ctrl+F 删除空白行:   ^\s*\n 选 ...

  2. [纯小白学习OpenCV系列]官方例程00:世界观与方法论

    2015-11-11 ----------------------------------------------------------------------------------- 其实,写博 ...

  3. jQuery自动补全

    方法一: jquery-autocomplete配置: <script type="text/javascript" src="/js/jquery-1.4.2.m ...

  4. a + b + c 求和

    #include <iostream> int main() { std::cout << "请输入三个数字,以空格分隔,按回车键结束:" << ...

  5. 基于阿里云服务器的git服务器搭建

    使用阿里云Ubuntu 12.0.4 64位操作系统做git服务器. 首先git服务器有两种访问方式可以选择:http方式和ssh的方式,http方式更容易使用. 1.http方式的git服务器搭建以 ...

  6. Unicode explorer

    It can be cumbersome to work out some of the details of this by hand, so you can use the little Java ...

  7. 递推 N矩形问题

    Description 给你一个高为n ,宽为m列的网格,计算出这个网格中有多少个矩形,下图为高为2,宽为4的网格. Input 第一行输入一个t, 表示有t组数据,然后每行输入n,m,分别表示网格的 ...

  8. Reapter控件的特殊使用:使用EVAL调取asp:Repeater里面绑定的值来进行判断 根据从数据库获取的数据进行判断 ,进而显示成想要的内容

    1.这个判断的过程你可以写在后台,如先在后台写一个public类型的方法:public bool CheckAduit(string code){ //根据你传入的code来判断,并返回true或者f ...

  9. HDU 1885 Key Task (BFS + 状态压缩)

    题意:给定一个n*m的矩阵,里面有门,有钥匙,有出口,问你逃出去的最短路径是多少. 析:这很明显是一个BFS,但是,里面又有其他的东西,所以我们考虑状态压缩,定义三维BFS,最后一维表示拿到钥匙的状态 ...

  10. 产品中 configure/cross compile的一个bug

    在mac机上, 为iPhone版本编译产品. 运行./configure报错如下: configure:22793: error: cannot run test program while cros ...