抓取实时天气前需要首先获得所有地区的cityCode,因为在最后queryWeather的时候需要传递这个参数。

最美天气获取全部cityCode及cityName的方法:

1.获取34个省及直辖市的cityCode、cityName
  http://www.zuimeitianqi.com/zuimei/myCity  form:flg=0  json:proviceList 2.根据proviceList里的cityCode和cityName获取各省及直辖市cityList
  http://www.zuimeitianqi.com/zuimei/getCity  form:cityCode cityName json:cityList 3.根据cityList里的cityCode和cityName获取地级市cityList
  http://www.zuimeitianqi.com/zuimei/getCity  form:cityCode cityName json:cityList

程序功能基本上实现了,第一次运行时缺少"zuimei_cities.db"需要抓取,会耗费比较长的时间。

再次运行的时候就非常的快了。博客好像不可以上传附件,就算了。

程序运行截图如下:

最后附上程序代码:

import requests
import pickle """
    利用“最美天气”抓取即时天气情况     @author likui_911@163.com """ class ZuiMei():
    def __init__(self):
        # Content-Type在这里非常关键,一定要设定
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'Accept-Encoding': 'gzip, deflate',
            'Accept-Language': 'zh-CN,zh;q=0.8'
        }
        self.zuimei_cities = {}
        try:
            # 判断zuimei_cities文件是否存在,不存在则初始化生成
            with open('zuimei_cities.db', 'rb') as f:
                self.zuimei_cities = pickle.load(f)
        except FileNotFoundError:
            print('初始化中,请耐心等待程序运行...')
            with open('zuimei_cities.db', 'wb') as f:
                self.zuimei_cities = self.initial_cities()
                pickle.dump(self.zuimei_cities, f)
                print('初始化完成,可以正常使用了')     def get_city(self, cityCode, cityName):
        """
            返回省市下级区县城市列表
        """
        city_url = "http://www.zuimeitianqi.com/zuimei/getCity"
        req_data = {}
        req_data['cityCode'] = cityCode
        req_data['cityName'] = cityName
        r = requests.post(city_url, data=req_data, headers=self.headers)
        my_cities = r.json()
        return my_cities['cityList']     def query_weather(self, cityCode):
        """
            返回当前区域的天气字典
            actual  实时天气
            forecast 预报
            air 空气情况
        """
        weather_url = "http://www.zuimeitianqi.com/zuimei/queryWeather"
        req_data = {}
        req_data['cityCode'] = cityCode
        r = requests.post(weather_url, data=req_data, headers=self.headers)
        current_weather = r.json()
        return current_weather['data'][0]     def my_city(self):
        """
            返回省、直辖市列表
        """
        province_url = "http://www.zuimeitianqi.com/zuimei/myCity"
        req_data = {"flg": "0"}
        r = requests.post(province_url, data=req_data, headers=self.headers)
        my_cities = r.json()
        return my_cities['provinceList']     def initial_cities(self):
        """
            初始化生成cityName:cityCode字典
        """
        zuimei_cities = {}
        # 获取省市直辖市
        provinces = self.my_city()
        for province in provinces:
            cityCode = province['cityCode']
            cityName = province['cityName']
            # 获取地级市
            cities = self.get_city(cityCode, cityName)
            for each_city in cities:
                cityCode = each_city['cityCode']
                cityName = each_city['cityName']
                # 获取县级地区
                counties = self.get_city(cityCode, cityName)
                for each_county in counties:
                    cityCode = each_county['cityCode']
                    cityName = each_county['cityName']
                    zuimei_cities[cityName] = [cityCode]
        return zuimei_cities     def query(self, cityName):
        """
            根据用户输入的cityName,获得实时的天气
        """
        if cityName not in self.zuimei_cities:
            print('地区不存在,请检查输入')
        else:
            cityCode = self.zuimei_cities[cityName]
            weather = self.query_weather(cityCode)
            actual = weather['actual']
            print('%s: %s℃~%s℃ %s' % (cityName, actual['high'], actual['low'], actual['desc'])) if __name__ == '__main__':
    zuimei = ZuiMei()
    zuimei.query('香港')

“最美天气”版本II的更多相关文章

  1. “最美天气”Python抓取天气

    import urllib.request import urllib.parse import json """     利用"最美天气"抓取即时天 ...

  2. linux终端指令总结

    一直没机会进行linux指令的系统学习,但是工作中总能遇到通过指令操作文件或数据库的情况,总不能一味地依赖后端开发者的帮忙.上任领导说过,要是在同一个地方跌倒,那么你就是傻子.我可不想成为傻子,so, ...

  3. 2016中国APP分类排行榜参选入围产品公示

    2016中国APP分类排行榜参选入围产品公示   由中国科学院<互联网周刊>.中国社会科学院信息化研究中心.eNet硅谷动力共同主办的2016中国APP分类排行榜发布暨颁奖晚宴即将举行.此 ...

  4. 3000本IT书籍下载地址

    http://www.shouce.ren/post/d/id/112300    黑客攻防实战入门与提高.pdfhttp://www.shouce.ren/post/d/id/112299    黑 ...

  5. 剑指offer ------ 刷题总结

    面试题3 -- 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 1. 每行中的整数从左到右是排序的. 2. 每行的第一个数大于上一行的最后一个整数. publi ...

  6. git 入门教程之1分钟快速了解 git

    git 入门教程 git 是分布式版本控制系统,是文本文档管理的利器,是帮助你管理文件动态的好帮手. 如果你曾经手动管理过文档,一定有这样的经历,比如你正在编辑文档,想删除某段落,又担心不久后可能会恢 ...

  7. 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)

    写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...

  8. wireshark初学者使用

    介绍 Wireshark是一款网络封包分析软件,截取网络封包,显示其封包的详细信息.日常工作中用的比较多.在使用wireshark之前须了解常用的网络协议.如:tcp,http,ip,udp等.(其实 ...

  9. tcp/ip详解(转)

    与UDP不同的是,TCP提供了一种面向连接的.可靠的字节流服务.TCP协议的可靠性主要有以下几点保障: (1)应用数据分割成TCP认为最适合发送的数据块.这部分是通过“MSS”(最大数据包长度)选项来 ...

随机推荐

  1. docker~windows版本的安装与使用

    回到目录 在面向服务的框架里,docker扮演着十分重要的角色,他使你的部署更轻量,使运维更智能化,事实上微软自己的项目也已经用上了docker了,下面介绍一下在windows环境上使用docker的 ...

  2. install.php文件建表时设置编码方式

    DROP TABLE IF EXISTS `".$db_prefix."adminlog`;CREATE TABLE `".$db_prefix."adminl ...

  3. informatica 学习总结

    问:什么是BI? 答:BI是商务智能,它包含的应用系统和技术较宽泛,通过收集,存储,分析和提供对数据的访问,来帮助企业用户做出更好的商务决策. BI应用包括决策支持,查询和报表,联机分析处理OLAP, ...

  4. 决策树(ID3 )原理及实现

    1.决策树原理 1.1.定义 分类决策树模型是一种描述对实例进行分类的树形结构.决策树由结点和有向边组成.结点有两种类型:内部节点和叶节点,内部节点表示一个特征或属性,叶节点表示一个类. 举一个通俗的 ...

  5. (转)CentOS 7.0关闭默认防火墙启用iptables防火墙

    场景:在本地虚拟机上使用ftp软件需要进行相应的端口设置,不可避免要访问Cnetos的防火墙,默认firewall操作不方便,所以需要进行相应的替换. 1 配置防火墙,开启80端口.3306端口 1. ...

  6. cesium根据经纬度计算距离

    var startLatitude = 36;var startLongitude = 120; var endLatitude=34; var endLongitude=121; var start ...

  7. Vue2源码分析-逻辑梳理

    很久之前就看完vue1,但是太懒就一直没写博客,这次打算抽下懒筋先把自己看过了记录下来,否则等全部看完,估计又没下文了 看源码总需要抱着一个目的,否则就很难坚持下去,我并没做过vue的项目,我几乎很少 ...

  8. oracle ORA-00604/ORA-01653

    问题描述: ORA-00604: error occurred at recursive SQL level 1ORA-01653: unable to extend table SYS.AUD$ b ...

  9. Jquery-全选和取消的一个坑

    在做一个商城的购物车的时候遇到了一个坑, 购物车一般都有全选按钮, 再次点击就会全部消除, 在网上查到的答案全部都是使用attr来做的, 无一例外都不能用, 之后才知道要使用jquery的prop和r ...

  10. Warning[w2]: Symbol ?P…

    屏蔽的方法: 一.找到$PROJ_DIR$\..\..\..\Tools\CC2530DB\f8w2530.xcl位置 二.找到f8w2530.xcl 三.打开f8w2530.xcl,注释D?PBAN ...