ESP32 MicroPython开发之旅 爬虫篇② 爬虫实例:获取网络天气

文章目录

    • 爬虫实例:获取网络天气
      • 获取天气
        • 请求API地址说明
        • 浏览器访问天气
          • F12查看浏览器请求过程
          • 访问 https://api.seniverse.com/robots.txt
        • ESP32访问天气 —— ujson方式
          • 理论知识
          • ESP32代码细节
          • 测试效果
        • ESP32访问天气——ure方式
          • 理论知识
          • ESP32代码细节
          • 测试效果

重要内容说三遍

  • 爬虫有风险,我们必须在合情合理合法情况去玩爬虫,请不要以任何商业目的去爬取别人的网站,也不要频繁爬取别人的网站(1秒1w次有点离谱)
  • 爬虫有风险,我们必须在合情合理合法情况去玩爬虫,请不要以任何商业目的去爬取别人的网站,也不要频繁爬取别人的网站(1秒1w次有点离谱)
  • 爬虫有风险,我们必须在合情合理合法情况去玩爬虫,请不要以任何商业目的去爬取别人的网站,也不要频繁爬取别人的网站(1秒1w次有点离谱)
    ESP32 MicroPython开发之旅 爬虫篇② 爬虫实例:获取网络天气_第1张图片

爬虫实例:获取网络天气

获取天气

获取天气的API非常多,但是用的比较多的是心知天气提供的API,往心知天气平台(https://docs.seniverse.com/api/weather/now.html)请求当地城市天气情况,获取温度值以及城市名称

  • 获取指定城市的天气实况。付费用户可获取全部数据,免费用户只返回天气现象文字、代码和气温 3 项数据。注:中国城市暂不支持云量和露点温度。

请求API地址说明

https://api.seniverse.com/v3/weather/now.json?key=your_api_key&location=xxxx&language=zh-Hans&unit=c

这里注意一下key,需要替换为自己申请的。location表示具体城市的拼音。

ESP32 MicroPython开发之旅 爬虫篇② 爬虫实例:获取网络天气_第2张图片

这里需要自己去申请API密钥。
ESP32 MicroPython开发之旅 爬虫篇② 爬虫实例:获取网络天气_第3张图片

浏览器访问天气

博主这里请求广州的天气:

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查看浏览器请求过程

以后我们学习爬虫或者反爬虫技术,很多情况下都会查看网络请求的整个过程,这时候可以在浏览器上按下F12.
ESP32 MicroPython开发之旅 爬虫篇② 爬虫实例:获取网络天气_第4张图片
ESP32 MicroPython开发之旅 爬虫篇② 爬虫实例:获取网络天气_第5张图片
然后我们看看响应内容的数据结构(json):
ESP32 MicroPython开发之旅 爬虫篇② 爬虫实例:获取网络天气_第6张图片
也就是整个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

在进行爬虫之前,我们都尽量进行爬虫合法性查阅

https://api.seniverse.com/robots.txt

{"status":"The API key is invalid.","status_code":"AP010003"}

没有设定 robots.txt 也就是该网站所有页面数据都可以爬取。

ESP32访问天气 —— ujson方式

理论知识
  • ESP32 MicroPython开发之旅 必备库篇① 快速上手ujson
  • ESP32 MicroPython开发之旅 网络篇① —— Station,我想连上网络
  • ESP32 MicroPython开发之旅 网络篇⑤ ——HTTPClient请求
ESP32代码细节
  • 创建 spider_weather.py文件
    ESP32 MicroPython开发之旅 爬虫篇② 爬虫实例:获取网络天气_第7张图片

写入以下代码:

# 导入网络模块
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访问天气——ure方式

这里我们试着用正则表达式的方式去扣出来想要的字段。

理论知识
  • ESP32 MicroPython开发之旅 必备库篇② 快速上手ure 正则表达式
  • ESP32 MicroPython开发之旅 网络篇① —— Station,我想连上网络
  • ESP32 MicroPython开发之旅 网络篇⑤ ——HTTPClient请求
ESP32代码细节
  • ("temperature":"\d*") —— 匹配温度

  • ("name":"[\u4e00-\u9fa5]*")——匹配城市名字

  • ("text":"[\u4e00-\u9fa5]*")—— 匹配阴晴

  • 创建 spider_weather_ure.py文件
    ESP32 MicroPython开发之旅 爬虫篇② 爬虫实例:获取网络天气_第8张图片
    写入以下代码:

# 导入网络模块
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":"阴"
>>> 

你可能感兴趣的:(ESP32,MicroPython开发,爬虫,网络,单片机,嵌入式硬件,正则表达式)