重要内容说三遍
获取天气的API非常多,但是用的比较多的是心知天气
提供的API,往心知天气平台(https://docs.seniverse.com/api/weather/now.html)请求当地城市天气情况,获取温度值以及城市名称
- 获取指定城市的天气实况。
付费用户
可获取全部数据,免费用户
只返回天气现象文字、代码和气温 3 项数据。注:中国城市暂不支持云量和露点温度。
https://api.seniverse.com/v3/weather/now.json?key=your_api_key&location=xxxx&language=zh-Hans&unit=c
这里注意一下key,需要替换为自己申请的。location表示具体城市的拼音。
博主这里请求广州的天气:
https://api.seniverse.com/v3/weather/now.json?key=xxxxxx&location=guangzhou&language=zh-Hans&unit=c
key
:填写自己申请的location
:guangzhou
请求结果:
{"results":[{"location":{"id":"WS0E9D8WN298","name":"广州","country":"CN","path":"广州,广州,广东,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"阴","code":"9","temperature":"16"},"last_update":"2021-12-19T20:40:44+08:00"}]}
以后我们学习爬虫或者反爬虫技术,很多情况下都会查看网络请求的整个过程,这时候可以在浏览器上按下F12
.
然后我们看看响应内容的数据结构(json):
也就是整个json获取路径为:
json_str['results'][0]['location']['name']
——城市名字json_str['results'][0]['now']['text']
——阴晴等等json_str['results'][0]['now']['temperature']
——温度json_str['results'][0]['last_update']
——更新时间在进行爬虫之前,我们都尽量进行爬虫合法性查阅
https://api.seniverse.com/robots.txt
{"status":"The API key is invalid.","status_code":"AP010003"}
没有设定 robots.txt 也就是该网站所有页面数据都可以爬取。
- ESP32 MicroPython开发之旅 必备库篇① 快速上手ujson
- ESP32 MicroPython开发之旅 网络篇① —— Station,我想连上网络
- ESP32 MicroPython开发之旅 网络篇⑤ ——HTTPClient请求
写入以下代码:
# 导入网络模块
import network
# 导入httpclient
import lib_urequests
# 导入json库
import ujson
# 定义一个连接函数
def do_connect():
# 创建STA模式
sta_if = network.WLAN(network.STA_IF)
# 返回网络工作状态
print('network status:', sta_if.status())
# 检查连接是否建立
if not sta_if.isconnected():
print('connecting to network...')
# 激活station模式
sta_if.active(True)
# 连接到您的WiFi网络
sta_if.connect('TP-LINK_5344', 'xxxxxx')
# 返回网络工作状态
print('network status:', sta_if.status())
# 检查连接是否建立
while not sta_if.isconnected():
pass
# 返回网络工作状态
print('network status:', sta_if.status())
#自动连接
do_connect()
# 请求广州天气情况 填入自己的key
resp = lib_urequests.get('https://api.seniverse.com/v3/weather/now.json?key=xxxxxx&location=guangzhou&language=zh-Hans&unit=c')
# 打印请求结果
print(type(resp.text),resp.text)
# json字符串转为python列表类型
json_str1 = ujson.loads(resp.text)
print(json_str1['results'][0]['location']['name'])
print(json_str1['results'][0]['now']['text'])
print(json_str1['results'][0]['now']['temperature'])
print(json_str1['results'][0]['last_update'])
>>> %Run -c $EDITOR_CONTENT
network status: 1010
network status: 1010
<class 'str'> {"results":[{"location":{"id":"WS0E9D8WN298","name":"广州","country":"CN","path":"广州,广州,广东,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"阴","code":"9","temperature":"15"},"last_update":"2021-12-19T21:40:39+08:00"}]}
广州
阴
15
2021-12-19T21:40:39+08:00
>>>
这里用到了ujson去解析返回的json字符串,然后从中扣出我们要的字段信息。
这里我们试着用正则表达式的方式去扣出来想要的字段。
- ESP32 MicroPython开发之旅 必备库篇② 快速上手ure 正则表达式
- ESP32 MicroPython开发之旅 网络篇① —— Station,我想连上网络
- ESP32 MicroPython开发之旅 网络篇⑤ ——HTTPClient请求
("temperature":"\d*")
—— 匹配温度
("name":"[\u4e00-\u9fa5]*")
——匹配城市名字
("text":"[\u4e00-\u9fa5]*")
—— 匹配阴晴
# 导入网络模块
import network
# 导入httpclient
import lib_urequests
# 导入ure库
import ure
# 定义一个连接函数
def do_connect():
# 创建STA模式
sta_if = network.WLAN(network.STA_IF)
# 返回网络工作状态
print('network status:', sta_if.status())
# 检查连接是否建立
if not sta_if.isconnected():
print('connecting to network...')
# 激活station模式
sta_if.active(True)
# 连接到您的WiFi网络
sta_if.connect('TP-LINK_5344', '6206908you11011010')
# 返回网络工作状态
print('network status:', sta_if.status())
# 检查连接是否建立
while not sta_if.isconnected():
pass
# 返回网络工作状态
print('network status:', sta_if.status())
#自动连接
do_connect()
# 请求广州天气情况
resp = lib_urequests.get('https://api.seniverse.com/v3/weather/now.json?key=SBBRd0X8fidhmnBv2&location=guangzhou&language=zh-Hans&unit=c')
# 打印请求结果
print(type(resp.text),resp.text)
# 匹配
search = ure.search('("temperature":"\d*")',resp.text)
print('search1:',search.group(1))
search = ure.search('("name":"[\u4e00-\u9fa5]*")',resp.text)
print('search1:',search.group(1))
search = ure.search('("text":"[\u4e00-\u9fa5]*")',resp.text)
print('search1:',search.group(1))
>>> %Run -c $EDITOR_CONTENT
network status: 1010
network status: 1010
<class 'str'> {"results":[{"location":{"id":"WS0E9D8WN298","name":"广州","country":"CN","path":"广州,广州,广东,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"阴","code":"9","temperature":"15"},"last_update":"2021-12-19T22:18:44+08:00"}]}
search1: "temperature":"15"
search1: "name":"广州"
search1: "text":"阴"
>>>