[开发笔记]-获取天气数据接口

简介:

 之前做的一个小程序需要获取天气预报接口,使用的是中国天气网的免费接口:

http://m.weather.com.cn/data/101010100.html ,但最近发现这个接口的天气数据不更新了,最新的天气是2014年2月19日的。推测可能是加了什么限制,目前网上搜到的大部分天气接口都是这个。

      下面的两个天气接口倒是仍然可以使用,不过一个是获取实时天气情况的,一个是获取当天整体天气情况的。对于需要获取7天内的天气情况,还需要找寻其他接口来实现。

http://www.weather.com.cn/data/sk/101010100.html

http://www.weather.com.cn/data/cityinfo/101010100.html

       通过这几天的测试,终于找到了一个可用的,特提供给大家。

接口获取的就是中天气网的手机版页面中的数据,网址为: 首页-中国天气网 http://mobile.weather.com.cn/index.html。

       数据是通过webclient,get方式来抓取的。这里需要指出一个需要注意的地方。

就是在webClient添加的请求头信息中加入Referer信息,否则获取的天气数据不是当天的。

 

获取的的数据为:

 

 

如果不加Referer头信息,获取到的数据为:

无论你什么时候获取,获取到的都是20131012这天的天气数据。奇怪的是time是最新的,一直在更新的。由此也可以看出来,他们是加了某种过滤机制无法获取真实的当天天气,这也间接解释了为什么上面提到的那个天气接口不能使用了。

说到这里那就再加一句,开头提到的天气接口 http://m.weather.com.cn/data/101010100.html 即使我加了Referer信息也不能获取当天的。

数据抓取代码:

复制代码
class Program
    {
        //参考文章:中国天气网的数据接口研究 - Create Chen - 博客园 http://www.cnblogs.com/technology/p/3488176.html


        static void Main(string[] args)
        {
            //实时天气
           // string url = "http://mobile.weather.com.cn/data/sk/101010100.html?_=1393644135884";
          //穿衣指数
            string url = "http://mobile.weather.com.cn/data/zsM/101010100.html?_=1393645156001";


            string html = webGetHtml(url);
            Console.WriteLine(html);
            Console.ReadKey();
        }


        //get请求

        public static string webGetHtml(string url)
        {
           // string url = "http://www.cnblogs.com/";
            // http://www.cnblogs.com/babycool 
            WebClient client = new WebClient();
            //设置发出请求 的URI
            client.BaseAddress = url;

            //添加到请求头部的信息
            //GET / HTTP/1.1
            //Accept: text/html, application/xhtml+xml, */*
            //Accept-Language: zh-CN
            //User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; qdesk 2.4.1263.203; Windows NT 6.1; Trident/5.0)
            //Accept-Encoding: gzip, deflate
            //Host: 
            //Connection: Keep-Alive

            client.Headers.Add("Accept", "application/json, text/javascript, */*; q=0.01");
            client.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8");
            //注意:Referer 一定要加,否则获取的不是当天的。
            client.Headers.Add("Referer", "http://mobile.weather.com.cn/");
            client.Headers.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1;Chrome/27.0.1453.110; Trident/5.0)");

            //client.Headers.Add("Connection", "Keep-Alive");
            //client.Headers.Add("Accept-Encoding", "gzip, deflate");

            //如果是获取网站的首页的内容 则为 client.OpenRead("/");
            //如果是获取网站域名下的非首页的内容 则为client.OpenRead(url);

            //获取流数据
            Stream webStream = client.OpenRead(url);

            StreamReader reader = new StreamReader(webStream, Encoding.UTF8);
            //获取html代码
            // string html = reader.ReadToEnd();

            return reader.ReadToEnd();
        }
    }
复制代码
相关文章
|
安全 网络协议 网络安全
代理IP、Socks5代理与网络安全:保护隐私与防御威胁的技术探索
代理IP、Socks5代理与网络安全:保护隐私与防御威胁的技术探索
475 0
|
6月前
|
Java
Java 中 `toList()` 与 `collect(Collectors.toList())` 的微妙差异:别再乱用了!
Java 中 `toList()` 与 `collect(Collectors.toList())` 的微妙差异:别再乱用了!
510 0
|
10月前
|
开发者
鸿蒙开发:刷新库V2装饰器适配
如果你是新写的项目,建议直接上手V2装饰器,即便是已经存在的项目,对于新的模块,也是尽量以V2为主。
219 2
鸿蒙开发:刷新库V2装饰器适配
|
测试技术 Python
Python教程:利用timeit模块对代码进行性能测试
在Python中,了解代码的性能是优化和改进的关键。timeit模块是Python标准库中的一个工具,用于测量代码片段的执行时间。本文将介绍timeit模块的各种接口、命令行使用方法以及如何对代码中的函数或类进行性能测试。
477 3
|
小程序
Galacean Effects 2.0 带来了哪些新功能?
各位特效魔法师、创意小能手们,我们近期解锁了一系列超能力,或许会让你的创作如虎添翼,酷炫到飞起!✨🎉🎉
1299 1
|
缓存 负载均衡 Java
Nacos 集群部署时性能优化配置
Nacos 集群部署时性能优化配置
663 2
|
编译器 Python
Python 完美解决 Import "模块" could not be resolved ...
Python 完美解决 Import "模块" could not be resolved ...
699 0
|
自然语言处理 Cloud Native 前端开发
『GitHub项目圈选16』推荐5款本周 大佬狂爱 的开源项目
『GitHub项目圈选16』推荐5款本周 大佬狂爱 的开源项目
448 0
|
C++
[Qt5&控件] 复选框QCheckBox的使用
[Qt5&控件] 复选框QCheckBox的使用
566 0
|
信息无障碍
HR面试常问问题(四)
12、如果你在这次考试中没有被录用,你怎么打算? 回答提示:现在的社会是一个竞争的社会,从这次面试中也可看出这一点,有竞争就必然有优劣,有成功必定就会有失败.往往成功的背后有许多的困难和挫折,如果这次失败了也仅仅是一次而已,只有经过经验经历的积累才能塑造出一个完全的成功者。我会从以下几个方面来正确看待这次失败.第一
271 0