“最美天气”版本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('香港')
“最美天气”版本II的更多相关文章
- “最美天气”Python抓取天气
import urllib.request import urllib.parse import json """ 利用"最美天气"抓取即时天 ...
- linux终端指令总结
一直没机会进行linux指令的系统学习,但是工作中总能遇到通过指令操作文件或数据库的情况,总不能一味地依赖后端开发者的帮忙.上任领导说过,要是在同一个地方跌倒,那么你就是傻子.我可不想成为傻子,so, ...
- 2016中国APP分类排行榜参选入围产品公示
2016中国APP分类排行榜参选入围产品公示 由中国科学院<互联网周刊>.中国社会科学院信息化研究中心.eNet硅谷动力共同主办的2016中国APP分类排行榜发布暨颁奖晚宴即将举行.此 ...
- 3000本IT书籍下载地址
http://www.shouce.ren/post/d/id/112300 黑客攻防实战入门与提高.pdfhttp://www.shouce.ren/post/d/id/112299 黑 ...
- 剑指offer ------ 刷题总结
面试题3 -- 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 1. 每行中的整数从左到右是排序的. 2. 每行的第一个数大于上一行的最后一个整数. publi ...
- git 入门教程之1分钟快速了解 git
git 入门教程 git 是分布式版本控制系统,是文本文档管理的利器,是帮助你管理文件动态的好帮手. 如果你曾经手动管理过文档,一定有这样的经历,比如你正在编辑文档,想删除某段落,又担心不久后可能会恢 ...
- 保姆级教程——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版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...
- wireshark初学者使用
介绍 Wireshark是一款网络封包分析软件,截取网络封包,显示其封包的详细信息.日常工作中用的比较多.在使用wireshark之前须了解常用的网络协议.如:tcp,http,ip,udp等.(其实 ...
- tcp/ip详解(转)
与UDP不同的是,TCP提供了一种面向连接的.可靠的字节流服务.TCP协议的可靠性主要有以下几点保障: (1)应用数据分割成TCP认为最适合发送的数据块.这部分是通过“MSS”(最大数据包长度)选项来 ...
随机推荐
- Python之MRO及其C3算法
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>] (<class '__main_ ...
- 【NOIP模拟】board(线段树维护二进制,树序号化为二进制)
题目背景 SOURCE:NOIP2016-RZZ-2 T3 题目描述 给出这样一棵“二叉树”: 每个节点有左右两个儿子,并如下定义每个节点的高度:假设父亲节点的高度为 h ,那么他的两个儿子的节点的高 ...
- date——sql查询
场景:在数据库中要删除一条记录,但是该记录的唯一性只能通过插入数据库的系统时间来确定,字段为date类型,格式是:2016/10/19 17:17:29. 1 解决 在百度上找到的方法是使用to_ch ...
- (转)Java线程:大总结
Java线程:大总结 Java线程是Java语言中一个非常重要的部分,Java5之前,多线程的语言支持还是比较弱的,内容也较少,写一个复杂的多线程程序是相当有挑战性的. 在Java5以后,Ja ...
- ural 1989 subplindromes
https://vjudge.net/problem/URAL-1989 题意: 先给出一个字符串,对于这个字符串,有两种操作,一种是询问从下标x到y的串是不是回文串,另一种是将下标为pos的字符改为 ...
- taskctl 软件集群安装部署
TASKCTL的集群部署实际上是通过Server服务节点和多个Agent代理节点部署在网络环境中来实现的.在完成之前的单机部署之后,我们已经成功安装了一个Server节点了.接下来我们再介绍一下怎么安 ...
- Scala 令人着迷的类设计
尽管 Scala 和 Java 有很多相同的地方, 但是在类的声明, 构造, 访问控制上存在很大的差异, 通过本文你也能看到相比较 Java 很多啰嗦的模板代码, Scala 更加的简洁, 使用 Sc ...
- MySQL checkpoint深入分析
1.日常关注点的问题 2.日志点分析 3.checkpoint:脏页刷盘的检查点 4.模糊检查点发生条件 1.master thread checkpoint 2.flush_lru_list che ...
- centos7用户,组及文件权限管理
centos7安装过程中如果没有创建用户的话,默认只有ROOT用户,这个用户是具有最高权限的帐户,可以做任何事情,但实际生产环境中我们一般不会使用这个用户,因为权限太大了,很危险. 所以在生产环境中就 ...
- [STM32F429-DISCO-HAL]2.先学会点亮LED和使用LCD。。。
首先就简单的一秒闪烁一次LED灯,进而类比推理其他外设的配置过程.然后呢我们就用上LCD吧,毕竟这块板上占地面积最大的就是这个2.4'LCD了. 先贴出简洁的main函数.很干净,比较容易看懂 ...