Python实战 天气API 爬虫系列

简介还再找免费的天气API接口吗,这里给你答案

开发语言:python

技术方案:requests + sqlalchemy

感谢python,(数据源:官方中国天气网http://www.weather.com.cn)

正文

​​​偶然工作中用到了天气状况数据,后来就不需要了,但还是想做一个天气的,因为想给自己的女票做个天气短信提醒。说搞就搞,第一想法就是apistore,上去了之后,好贵。。。。。。百度一了一下,全都不好用,决定自己写一个,自己动手丰衣足食嘛。再百度天气,中国天气网是第一条,还是官方的,说明应该不错,点进去之后,看了数据,需求基本满足了,那么,走起。

查询数据源

google打开天气网,搜了下北京天气,alt+cmd+i打开调试模式(mac快快捷键),network查看数据来源。经过分析,基本可以确定数据主要来源于2个接口:http://d1.weather.com.cn/dingzhi/101010100.html?_=1537709265753 (地之一)和http://d1.weather.com.cn/sk_2d/101010100.html?_=1537709265752 (地址二),多打开了几个别的城市进行查看,最后结论:101010100参数一城市的id值,1537709265753参数二时间戳(毫秒级)。

获取城市id在官网反反复复尝试获取城市的数据,发个城市id有几个规律:城市id由9位数字组成(可能大家觉得感觉有点废话了,别急往后看),例如:北京101010100。

城市id的第三位,第四位是表示省份(免费普及一下:中国34个省级行政区域,包括23个省,5个自治区,4个直辖市,2个特别行政区),01-北京,02-上海,03-天津,04-重庆。。。34-台湾。

后三位尾数,针对于直辖市,尾数从000开始计数,非直辖市尾数从001开始计数。

天气网数据细到乡镇,街道。乡镇的id:101080503(cityid) + xxx(数字,001开始),12位组成;街道数据过于细致,没必要获取,而且本人能力有限,只初始化了到城市级别的的数据。

额外赠送:中国每个省份的城市最大值位21,代码中会用到。

知道规律,也了解了request url,response,就可以搞定城市id的数据源了。解决方法如下:

语言:python

思想:依据id的范围生成范围id,requests去get请求,获取结果

要点:省份的标志位01~04位直辖市,05~34非直辖市,城市的标志位01~23即可;header必须含有Referer值,应该用来做一个访问标识response返回值类型是string,但是weatherinfo的信息为json,需转化。不多说,直接上代码:

数据入库

数据库决定直接用sqlite,主要考虑到数据库的可移植性,git项目直接运行就可以,不用额外配置数据库,而且单张表,数据量不会很大,性能没有太高要求。python + requests + sqlalchemy + db,玩py的不知道sqlalchemy&&requests,自己赶快恶补一下吧。。。废话也不多说,git项目看db.py文件,创建表以及数据库见下图:

城市id获取的整理流程设计ok,执行python citys.py就可以见证奇迹。不过,这个奇迹有点慢而已,我的本大概执行了30个小时左右,后来想的是python配合多进程(GIL机制,不要使用多线程)来提速,搞了个pool在那,不过我把多进程注释了,有兴趣的人可以去试下多进程。

api接口服务

做web服务,flask是不错的选择,简单易用,性能也不差。用blueprint做了个weather的接口,但是信息由地址一与地址二组成,地址一主要用来获取最高/最低温度,地址二获取实时的天气相关信息,请求的地址参数均由第三步回去的城市id以及时间戳。

请求的时候,我把浏览器正常访问的header都记录,请求成功,把结果封装json返回。在controller那,我对请求方式,请求参数做了限制,加强接口的严谨性。详细自己看代码,post请求的参数那块,args,form,json,get_json分不清的,请自行百度,我做了个小技巧:

测试

这里介绍2种测试方式,postman + curl。

curl:curl -X POST http://127.0.0.1:8888/weather/ -H ‘Content-Type: application/json’ -d ‘{“city”: “昌平”}’ | python -m json.tool

postman:图形化界面。。。自己点把

没有curl命令的,自己搞下,做开发的话,不知道curl,会很low的,看下结果,完美:

总结

代码很简单,不过在获取数据源id上花费了一些时间,后来一想,城市id的表有个问题,表有:id,cityname,cityid 3个字段,没有记录省份,查询同名的城市可能会有问题,后续在改吧。。。就先到这里了,我是程序猿,python程序猿。

二期功能:定时任务 + 短信提醒 + 邮件报警

python数值类型有哪四个直辖市_博文分类相关推荐

  1. python数值类型有哪四个直辖市_python中常见的Numberl类型(四)

    嗨~今天要讲到的<python中常见的Numberl类型(四)>内容比较少哈.为啥?因为这部分内容已经要结束啦.主要还是讲讲random~ 随机数 1.help(random) 2.直接调 ...

  2. python数值类型有哪四个直辖市_python基础|数据类型练习题

    '''1,请容代码实现:利用下划线将列表中的每一个元素拼接成字符串,|l = ['alex', 'eric', 'rain']''' #l = ['alex', 'eric', 'rain']#s = ...

  3. python数值类型_Python数值类型

    python数值类型 In programming, Data Types are an essential concept. Data of various types can be stored ...

  4. python数值类型教程_Python数值类型 int、float、complex 详解

    Python数值类型 int.float.complex 详解 Python数值类型:int.float.complex 在Python程序中,int.float和complex是三种十分重要的数值类 ...

  5. python数值类型和序列类型_Python基础(一):数值类型,序列类型

    Python的数值类型 在python中,数字并不是一个真正的对象类型,而是一组类似类型的分类.这些主要包括整数,浮点数,布尔类型和复数.这些是相对来说比较常用的,复数一般都用在比较精密的科学计算中, ...

  6. python数值类型及输入输出

    一. pythono支持的数值类型 int, long, float, bool, complex(复数) 注:布尔值首字母必须大写 二. 操作符 1. 算术操作符 +,-,*,/,%,//,** 注 ...

  7. python数值类型的操作_Python学习笔记,数值类型及操作

    数值类型及操作 int类型数值大小不限: 整数的进制 1,整数类型正常为10进制 2,开头加0b or 0B 为二进制 3,加0o or 0O 为8进制 4,加0x 为16进制 浮点运算中存在不确定尾 ...

  8. Python数值类型

    数值类型 python的数值类型包括常规的类型:整数(没有小数部分的数字).浮点数(通俗地说,就是有小数部分的数字)以及其它数值类型(复数.分数.有理数.无理数.集合.进制数等).除了十进制整数,还有 ...

  9. python语言中、复数类型中实数部分_python学习03.02:Python数值类型(整形、浮点型和复数)及其用法...

    实际开发中,我们经常需要使用数字记录游戏中用户的得分.游戏中角色的生命值.伤害值等信息,Python 语言提供了数值类型用于保存这些数值. 需要注意的是,Python 中这些数值类型都是不可改变的,也 ...

最新文章

  1. 查看Ubuntu 系统的版本
  2. vista——最恰当的中文译名应该是“喂死它”
  3. java学习笔记13--反射机制与动态代理
  4. 【 FPGA 】Xilinx设计约束(XDC)中时钟约束的表示方法
  5. How to Make a Computer Operating System
  6. 信息检索报告_iFixR:缺陷报告驱动程序修复
  7. awstats+jawstats自动分析日志
  8. linux 使用paho C库实现mqtt客户端
  9. 两种极端情况的案例:N+1次查询和笛卡尔积
  10. Wi-Fi 6还没用上,Wi-Fi 7就要来了?
  11. 使用vue -cli脚手架构建项目组件的全局注册与本地注册
  12. 0框架前端-如何写垂侧边栏(Vertical Tabs)
  13. PASCAL标准过程与函数
  14. MacBook外接“键盘鼠标”设置经验
  15. 51单片机学习笔记——OLED贪吃蛇
  16. 潇潇六月雨 input file里的JQ change() 事件的只生效一次
  17. T229470 A. 小智的疑惑(暴力)
  18. 个人微信公众号申请流程
  19. 标贝科技|AI企业级应用榜单发布,百度、讯飞、标贝科技等50家产品上榜
  20. 制造业企业防范勒索病毒攻击的一些建议措施

热门文章

  1. 使用arduino D1 wifi模块(WeMos D1)连接阿里云物联网平台并成功实现APP点亮板载LED(五)---MQTT.fx模拟设备连接阿里云
  2. 100%基于深度强化学习的对冲基金
  3. Yjs + quill:快速实现支持协同编辑的富文本编辑器
  4. 梦想世界2014年5月29日服务器维护公告,2021年4月30日游戏更新公告
  5. spring-day01-概述-IOC
  6. orgchart组织机构图
  7. 【MySQL 8.0 OCP 1Z0-908认证考试】题库精讲--第三讲mysql8.0安装配置升级(上)
  8. Lcd(一)显示原理
  9. 2019奥林匹克计算机竞赛试题,2019-2020年小学数学奥林匹克竞赛试题及答案三年级...
  10. R语言使用lm函数构建分层线性回归模型(添加分组变量构建分层线性回归模型)、使用coef函数提取分层线性回归模型的系数及截距、计算第一个分组的间距和斜率信息(第一个分组,对照组)