幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 5301|回复: 13

[通用编程] 怎么从一个网站上获取天气预报啊?

[复制链接]

550

主题

9108

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
发表于 2012-9-27 17:40:03 | 显示全部楼层 |阅读模式
RT....
ios有个插件 perpagehtml能把html显示到桌面上。。
比较出名的就是这个widget      http://bbs.weiphone.com/read-htm-tid-1905969.html

他就是从www.wether.com获取天气预报

用C++怎么从这个网站上获取呢?
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2012-9-27 18:15:30 | 显示全部楼层
一般来说有5个方法:

1.用socket编程,自己写个简单的http头,直接获取气象页面。

2. 用libcurl等网络库,直接获取显示天气的HTML文件,然后自己解析HTML,简单的HTML,直接字符串操作就可以解析。复杂的页面,就用正则表达式。最新的c++11标准里已经包含有正则表达式。
优点是轻量级的,直接获取想要的数据,然后,想对这数据怎的就怎么的。比如让自己程序按着不同的天气进行不同的...
ps:libcurl中还有收发email等功能的说。

3.使用微软的com接口,为ie创建ole对象,在自己的程序里嵌入一个IE,用来直接显示气象的网页。
这样作,只是让自己的程序显示网页,具体的天气数据还要再通过dom获取。有点重量级了。
c++嵌入ie,网上可以找到N多用atl、mfc框架的例子,纯winapi来干这事的人还真不多,当然,纯api也能办到就是了。

4.windows里好像有个httpget的对象,可以调用那个,不过记不太清了。

5.通过qtwebkit、wxwebkit等开源库,在自己的程序里嵌入一个非ie内核的浏览器。
え~え~お!!!
回复 支持 反对

使用道具 举报

550

主题

9108

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2012-9-28 13:14:15 | 显示全部楼层
libcurl。。

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, get_5days);


size_t get_5days(void *ptr, size_t size, size_t nmemb, void *stream)  //这个函数是为了符合CURLOPT_WRITEFUNCTION, 而构造的
{
    FILE* fp = 0;
    if((fp=fopen("txt.txt","w"))==NULL) return 0;
    fwrite(ptr, size, nmemb, (FILE *)fp);
    fcloseall();
}
为啥,写出来的txt.txt只有1.32K,只保存了网页代码的前1.32k字符。。。。那个网页我另存为,分明103K。。。后面的怎么都没保存进去哇?
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2012-9-28 14:30:17 | 显示全部楼层
那么抓别的网站正常么?
如果也不正常,是libcurl没用好。比如说,是否要附加浏览器标识,是否要开启Cookie等等....

如果都正常,这是网页中使用了javascript动态生成页面。
lubcurl不支持javascript。你可以手动解析javascript,找到直接提供气象数据的地址。

比如说,http://new.sohu.com上的气象信息,直接找是找不到的,打开页面源码简单分析下便可知是由javascript脚本http://news.sohu.com/upload/2010 ... therplugin_10_jq.js来调用气象信息的。
接下就是分析weatherplugin_10_jq.js文件。这个文件没有被加密混淆,但是精简过了,勉强可看出。
http://news.sohu.com/upload/weather_917/w_icon/* 获取天气的图标
http://m.sohu.com/weather/cms/获取3天的天气状况
代码很乱,具体的请求看不清楚。
这时候,可以打开firefox,装上firebug,用firebug来分析new.sohu.com
看它对上面我们找到的相关域名发出了什么请求,又接收到什么结果,是否有cookie等。
然后用libcurl模拟发送这些请求,于是天气信息就被我们获取了。

还有抓来的结果最好别写入硬盘文件,直接放内存里,又快又便捷。

需要用c++的string头文件

static int writer(char *data, size_t size, size_t nmemb, string *writerData)
{
    unsigned long sizes = size * nmemb;
    if (writerData == NULL) return 0;
    writerData->append(data, sizes);
    return sizes;
}
え~え~お!!!
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2012-9-28 14:45:52 | 显示全部楼层
如果觉得麻烦的话,还可以试试嵌入ie。

http://www.codeproject.com/KB/COM/#COM

标题名字 COM in plain C的,就是讲怎么不用框架使用com的,其中就有ie。

http://www.codeproject.com
这个站很好,包含你上次问的系统托盘图标等,这些问题全都能在那找到答案。
え~え~お!!!
回复 支持 反对

使用道具 举报

0

主题

16

帖子

128

积分

③业余

积分
128
QQ
发表于 2012-9-28 23:03:22 | 显示全部楼层
win32的mshtml.h可以操作网页数据,不过我只知道怎么获取和改写网页静态数据,
比如获取某个编辑框的文本,比如单击某个网页的按钮,都可以用mshtml实现.
我曾经用它做过自动操作网页的工具..
但不知楼主要的信息是什么样的.
回复 支持 反对

使用道具 举报

550

主题

9108

帖子

214748万

积分

超级版主

如同神一般的存在,腿神!拖后腿的神~~

Rank: 8Rank: 8

积分
2147483647
 楼主| 发表于 2012-9-29 16:31:17 | 显示全部楼层
就是要获取红圈里的字符串。。始终玩不明白。。。上面的是网址。。。RHXX0046是哈尔滨 换成RHXX0008就是北京了。。。其它城市我不知道。。OTZ。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2012-9-29 18:48:17 | 显示全部楼层
http://www.weather.com/weather/5-day/CHXX0046 这个页面进行正则表达处理就行了。
左侧的当前气信息,用表达式
  1. [*][\\s\\S]*?[\\s\\S]*?[*][\\s\\S]*?[\\s\\S]*?[*][\\s\\S]*?
复制代码
获得一个唯一结果:
  1. [*]
  2.                     <span class="wx-value" itemprop="temperature-fahrenheit">57</span><sup>°F</sup>
  3.             
  4.             [*]
  5.                 <span class="wx-value" itemprop="weather-phrase">Cloudy</span>
  6.             
  7.             [*]
  8.                         Feels like [i]<span class="wx-value" itemprop="feels-like-temperature-fahrenheit">57</span>°F[/i]
  9.             
复制代码
只有这么点了,再用正则对这小段处理下
  1. <span.+"temperature-fahrenheit">\\d+</span>
复制代码
获得:
  1. <span class="wx-value" itemprop="temperature-fahrenheit">57</span>
复制代码
再来一次
  1. \\d+
复制代码
结果是:57

获取Cloudy这样的非数字还得再加一次:
  1. <span.+"weather-phrase">\\w+</span>
复制代码
获得
  1. <span class="wx-value" itemprop="weather-phrase">Cloudy</span>
复制代码
第三次
  1. >\\w+<
复制代码
获得
  1. >Cloudy<
复制代码
最后一次
  1. \\w+
复制代码
得到Cloudy

那个五天的也很简单,对整个页面搜索
  1. [\\s\\S]*?
复制代码
只返回了五个结果,那么当然就是5天的天气记录了。
每一个都是这样的
  1.    
  2. [img]http://s.imwx.com/v.20120328.084156/img/wxicon/100/45.png[/img]
  3.                  57<sup>°F</sup>
  4.                     <span class="wx-label">Observed High</span>
  5.                                  <span class="wx-label">2:00 pm</span>
  6.                
  7.          44<sup>°F</sup><span class="wx-label"></span>
  8.         Showers Early
复制代码
一看就很明了,和上处理当前气象的方法便可以简单提取出。

嘛。当然,这是对正则的最简单使用,反复搜了好几遍,如果在正则表达式里再加上一些逻辑判断什么的,一次就可找到结果。反正我对正则也止于简单了解运用,更高级的,还没学会。
え~え~お!!!
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2012-9-29 18:56:27 | 显示全部楼层
http://deerchao.net/tutorials/regex/regex.htm

30分钟正则表达式入门。

可惜,说是这么说,我从接触正则到现在,N年了,还是不完全会。
え~え~お!!!
回复 支持 反对

使用道具 举报

0

主题

16

帖子

128

积分

③业余

积分
128
QQ
发表于 2012-9-29 20:14:27 | 显示全部楼层
楼主的需求好变态...
俺不会
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2021-11-28 08:25 , Processed in 0.020414 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表