倔强的网站数据抓取,关键时刻还需Webbrowser显身手
由于最近台风挺多,公司网站上需要挂上台风预报信息,就整了个抓取台风数据(至于抓数据的概念和实践手册我以前写的一篇博客里面有介绍:分享一套抓数据小程序,客户资料、实时新闻、股票数据…随心抓)的服务,做调试阶段,发现个诡异的问题。如下:
需要抓取的数据是个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>
/// <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显身手的更多相关文章
- .net网站数据抓取
最新项目需要抓取人民币汇率中间价的数据,所以就写了个简单的爬虫抓取数据.抓取的网站为:http://www.safe.gov.cn/wps/portal/sy/tjsj_hlzjj_inquire # ...
- WebScraper for Mac(网站数据抓取软件) 4.10.2
WebScraper Mac版是一款Mac平台上通过使用将数据导出为JSON或CSV的简约应用程序,WebScraper Mac版可以快速提取与某个网页(包括文本内容)相关的信息.WebScraper ...
- java编写网站数据抓取
来公司已经俩月了,每天加班平均工时11个小时的我又想起了老东家温馨舒适安逸的生活.已经有好久没时间读博客写博客了,我觉得我退步了,嗯嗯,我很不开心 今天记录下抓数据的一些东西吧. 数据抓取现在是很普遍 ...
- 吴裕雄--天生自然python学习笔记:WEB数据抓取与分析
Web 数据抓取技术具有非常巨大的应用需求及价值, 用 Python 在网页上收集数据,不仅抓取数据的操作简单, 而且其数据分析功能也十分强大. 通过 Python 的时lib 组件中的 urlpar ...
- C# 从需要登录的网站上抓取数据
[转] C# 从需要登录的网站上抓取数据 背景:昨天一个学金融的同学让我帮她从一个网站上抓取数据,然后导出到excel,粗略看了下有1000+条记录,人工统计的话确实不可能.虽说不会,但作为一个学计算 ...
- [原创.数据可视化系列之十二]使用 nodejs通过async await建立同步数据抓取
做数据分析和可视化工作,最重要的一点就是数据抓取工作,之前使用Java和python都做过简单的数据抓取,感觉用的很不顺手. 后来用nodejs发现非常不错,通过js就可以进行数据抓取工作,类似jqu ...
- 大数据抓取采集框架(摘抄至http://blog.jobbole.com/46673/)
摘抄至http://blog.jobbole.com/46673/ 随着BIG DATA大数据概念逐渐升温,如何搭建一个能够采集海量数据的架构体系摆在大家眼前.如何能够做到所见即所得的无阻拦式采集.如 ...
- Phantomjs+Nodejs+Mysql数据抓取(1.数据抓取)
概要: 这篇博文主要讲一下如何使用Phantomjs进行数据抓取,这里面抓的网站是太平洋电脑网估价的内容.主要是对电脑笔记本以及他们的属性进行抓取,然后在使用nodejs进行下载图片和插入数据库操作. ...
- R语言XML包的数据抓取
htmlParse 函数 htmlParse加抓HTML页面的函数. url1<-"http://www.caixin.com/"url<-htmlParse(url1 ...
随机推荐
- LINQ to SQL快速上手 step by step
Step1:建立数据库 在使用Linq to Sql前,我们要将相应的数据库建好.在这个Demo中,使用的数据库是SQL Server Express 2005. 我们首先建立一个 ...
- [转]linux /proc/cpuinfo 文件分析
在Linux系统中,提供了proc文件系统显示系统的软硬件信息.如果想了解系统中CPU的提供商和相关配置信息,则可以通过/proc/cpuinfo文件得到.本文章针对该文件进行简单的总结. 基于不同指 ...
- 动端逐渐出了许多的移动端的框架,比如Sencha Touch、JQTouch、Jquery-moblie、jqMobi等等。这些框架都有优缺点,不同的框架应用在不同的项目中。现简单阐述一下各框架的优缺点:
移动前端工作的那些事---前端制作之微信小技巧篇 (2013-11-15 15:20) 转载▼ 标签: it css3/javascript html5 webapp 手机网站搭建 分类: 前端制 ...
- JAVA课程实验报告 实验五 Java网络编程及安全
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:韩玉琪 学号:20135317 成绩: 指导教师:娄嘉 ...
- 如何扫描二维码下载APK
将apk文件放到网站上,即用户可以通过www.xxx.com.cn/abc.apk直接下载 再www.xxx.com.cn/abc.apk这个字符串做成二维码就可以了. 问题: 直接放到网站后,输入下 ...
- Android消息推送——JPush极光推送
刚看了一篇关于Android消息推送评测总结的博客http://www.cnblogs.com/logan/p/4514635.html: 自己也对原学过的JPush极光进行一下小结,方便后续工作使用 ...
- Spring----->projects----->Spring Boot
1.概述:(about Spring Boot) Spring boot是在spring framework的基础上搭建起来的一个基本项目,该项目中已经集成了spring框架下的若干模块以及sprin ...
- C# 关于时间
1.2016/7/8 00:10:10 转换成 2016-07-08T 00:10:10 在用VB动态调用WevService的时候,传入的时间格式为2016/7/8 00:10:10,导致调用出错, ...
- python--自动删除文件
1.目的:定期自定删除7天前的数据 python脚本如下: #coding=utf-8 import os,time,datetime #需定时删除的目录的上一层路径 data_dir="/ ...
- 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 ...