zoukankan      html  css  js  c++  java
  • “最美天气”版本II

    抓取实时天气前需要首先获得所有地区的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('香港')
  • 相关阅读:
    一位老司机开车20年后得到的26条教训
    H608B无线路由破解方法
    我们去工作到底为了什么?
    什么是”中国梦”?
    Cubieboard A10 安装Nand系统,配置nginx,php,mysql,samba详细教程
    早晚有一天,我们都会成为自己当初讨厌的人
    当下中国的十二种孤独
    终于见到全文了,太唯美了!
    想生男想生女 从科学角度为你解读
    如何找到板块中所有个股
  • 原文地址:https://www.cnblogs.com/lkpp/p/7400039.html
Copyright © 2011-2022 走看看