社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 道具中心
主题 : 怎么从一个网站上获取天气预报啊?
secondsen 离线
级别: 总版主
显示用户信息 
0  发表于: 2012-09-27   
来源于 通用编程 分类

怎么从一个网站上获取天气预报啊?

RT....
ios有个插件 perpagehtml能把html显示到桌面上。。
比较出名的就是这个widget      http://bbs.weiphone.com/read-htm-tid-1905969.html

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

用C++怎么从这个网站上获取呢?
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
shawind 离线
级别: 分版主
显示用户信息 
1  发表于: 2012-09-27   
一般来说有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内核的浏览器。
え~え~お!!!
secondsen 离线
级别: 总版主
显示用户信息 
2  发表于: 2012-09-28   
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。。。后面的怎么都没保存进去哇?
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
shawind 离线
级别: 分版主
显示用户信息 
3  发表于: 2012-09-28   
那么抓别的网站正常么?
如果也不正常,是libcurl没用好。比如说,是否要附加浏览器标识,是否要开启Cookie等等....

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

比如说,http://new.sohu.com上的气象信息,直接找是找不到的,打开页面源码简单分析下便可知是由javascript脚本http://news.sohu.com/upload/2010news_weather/weatherplugin_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;
}
え~え~お!!!
shawind 离线
级别: 分版主
显示用户信息 
4  发表于: 2012-09-28   
如果觉得麻烦的话,还可以试试嵌入ie。

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

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

http://www.codeproject.com
这个站很好,包含你上次问的系统托盘图标等,这些问题全都能在那找到答案。
え~え~お!!!
weiwuyuan 离线
级别: ②入门
显示用户信息 
5  发表于: 2012-09-28   
win32的mshtml.h可以操作网页数据,不过我只知道怎么获取和改写网页静态数据,
比如获取某个编辑框的文本,比如单击某个网页的按钮,都可以用mshtml实现.
我曾经用它做过自动操作网页的工具..
但不知楼主要的信息是什么样的.
secondsen 离线
级别: 总版主
显示用户信息 
6  发表于: 2012-09-29   
就是要获取红圈里的字符串。。始终玩不明白。。。上面的是网址。。。RHXX0046是哈尔滨 换成RHXX0008就是北京了。。。其它城市我不知道。。OTZ。。。
图片:1.png
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
shawind 离线
级别: 分版主
显示用户信息 
7  发表于: 2012-09-29   
http://www.weather.com/weather/5-day/CHXX0046 这个页面进行正则表达处理就行了。
左侧的当前气信息,用表达式
复制代码
  1. <li class="wx-temp">[\s\S]*?</li>[\s\S]*?<li class="wx-phrase">[\s\S]*?</li>[\s\S]*?<li class="wx-feels">[\s\S]*?</li>

获得一个唯一结果:
复制代码
  1. <li class="wx-temp">
  2.                     <span class="wx-value" itemprop="temperature-fahrenheit">57</span><sup>°F</sup>
  3.             </li>
  4.             <li class="wx-phrase">
  5.                 <span class="wx-value" itemprop="weather-phrase">Cloudy</span>
  6.             </li>
  7.             <li class="wx-feels">
  8.                         Feels like <i><span class="wx-value" itemprop="feels-like-temperature-fahrenheit">57</span>°F</i>
  9.             </li>

只有这么点了,再用正则对这小段处理下
复制代码
  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

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

嘛。当然,这是对正则的最简单使用,反复搜了好几遍,如果在正则表达式里再加上一些逻辑判断什么的,一次就可找到结果。反正我对正则也止于简单了解运用,更高级的,还没学会。
え~え~お!!!
shawind 离线
级别: 分版主
显示用户信息 
8  发表于: 2012-09-29   
http://deerchao.net/tutorials/regex/regex.htm

30分钟正则表达式入门。

可惜,说是这么说,我从接触正则到现在,N年了,还是不完全会。
え~え~お!!!
weiwuyuan 离线
级别: ②入门
显示用户信息 
9  发表于: 2012-09-29   
楼主的需求好变态...
俺不会
描述
快速回复

认证码:

验证问题:
22-5=?,答案:17 正确答案:17
按"Ctrl+Enter"直接提交