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

需要抓取的数据是个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. Android之下拉刷新,上啦加载的实现(一)

    转载地址http://blog.csdn.net/leehong2005/article/details/12567757#t5 前段时间项目中用到了下拉刷新功能,之前在网上也找到过类似的demo,但 ...

  2. 控件的相对位置与绝对位置-UI界面编辑器(SkinStudio)教程

    绝对位置: 相对位置: 相对位置配合Anchor属性使用 例如Anchor属性选择left|top(即相对位置的left和top保持不变) 窗口大小改变前: 窗口大小改变后: 可以看到控件相对位置的l ...

  3. 读取jar包资源(转)

    可能有不少初学者会有这样的困惑:在你的代码里调用了一些资源文件,如图片,音乐等,在调试环境或单独运行的时候可以正常显示或播放,而一旦打包到jar文件中,这些东东就再也出不来了,除非把这个jar放到原来 ...

  4. 使用CocoaPods配置工程

    1.首先搭建环境,配置CocoaPods,具体请参考 http://code4app.com/article/cocoapods-install-usage 2.打开终端,输入 cd 空格 把工程拖入 ...

  5. SQL Server Profiler使用方法

    一.SQL Server Profiler使用方法 1.单击开始--程序--Microsoft SQL Server 2005--性能工具--SQL Server Profiler,如下图:   2. ...

  6. ORACLE服务端详细安装步骤(配图解)

    ORACLE服务端的安装及配置 l 将下载的安装包解压缩,双击[setup.exe]文件,系统检查监听参数,耐心等待,完成后出现如下界面,电子邮件可不填,"我希望..."建议不勾选 ...

  7. Spring MVC Web框架

      1. Spring MVC简介 Spring MVC是java EE平台请求驱动类型的轻量级Web框架,使用了MVC设计模式的思想,spring框架的主要优势之一就是分层架构,分层架构允许选择使用 ...

  8. python-->基础-->003->字符串处理

    一.去除字符串首尾白空格 说明:即为去除字符串的首尾(即头部和尾部)的白空格(空格本身,回车\r,换行\n,制表符\t, 换页符\f ) 实例: str01 = ' abc def # ' print ...

  9. LeetCode340 Longest Substring with At Most K Distinct Characters

    This is a question needs pay for , I have no money to pay ,so just write some test case by myself. I ...

  10. UICollectionView进阶练习

    上一篇中的干货看完,不觉感觉还是有点虚,今天我们来点实的,做了两个小DEMO,源码已放GitHub,主要是针对UICollectionView做了联系.第一个DEMO是针对UICollectionVi ...