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

需要抓取的数据是个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. LINQ to SQL快速上手 step by step

    Step1:建立数据库      在使用Linq to Sql前,我们要将相应的数据库建好.在这个Demo中,使用的数据库是SQL Server Express 2005.      我们首先建立一个 ...

  2. [转]linux /proc/cpuinfo 文件分析

    在Linux系统中,提供了proc文件系统显示系统的软硬件信息.如果想了解系统中CPU的提供商和相关配置信息,则可以通过/proc/cpuinfo文件得到.本文章针对该文件进行简单的总结. 基于不同指 ...

  3. 动端逐渐出了许多的移动端的框架,比如Sencha Touch、JQTouch、Jquery-moblie、jqMobi等等。这些框架都有优缺点,不同的框架应用在不同的项目中。现简单阐述一下各框架的优缺点:

    移动前端工作的那些事---前端制作之微信小技巧篇   (2013-11-15 15:20) 转载▼ 标签: it css3/javascript html5 webapp 手机网站搭建 分类: 前端制 ...

  4. JAVA课程实验报告 实验五 Java网络编程及安全

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317 成绩:             指导教师:娄嘉 ...

  5. 如何扫描二维码下载APK

    将apk文件放到网站上,即用户可以通过www.xxx.com.cn/abc.apk直接下载 再www.xxx.com.cn/abc.apk这个字符串做成二维码就可以了. 问题: 直接放到网站后,输入下 ...

  6. Android消息推送——JPush极光推送

    刚看了一篇关于Android消息推送评测总结的博客http://www.cnblogs.com/logan/p/4514635.html: 自己也对原学过的JPush极光进行一下小结,方便后续工作使用 ...

  7. Spring----->projects----->Spring Boot

    1.概述:(about Spring Boot) Spring boot是在spring framework的基础上搭建起来的一个基本项目,该项目中已经集成了spring框架下的若干模块以及sprin ...

  8. C# 关于时间

    1.2016/7/8 00:10:10 转换成 2016-07-08T 00:10:10 在用VB动态调用WevService的时候,传入的时间格式为2016/7/8 00:10:10,导致调用出错, ...

  9. python--自动删除文件

    1.目的:定期自定删除7天前的数据 python脚本如下: #coding=utf-8 import os,time,datetime #需定时删除的目录的上一层路径 data_dir="/ ...

  10. Windows XP SP3下编译安装openssl-1.1.0b

    软件需要: openssl-1.1.0b visual studio 2010(cn_visual_studio_2010_ultimate_x86_dvd_532347.iso) perl:Acti ...