数码之家

 找回密码
 立即注册
搜索
查看: 6418|回复: 13

【MY808_DIY】ESP32_micropython_天气时钟2_网页爬取天气信息

[复制链接]
发表于 2019-8-20 17:36:13 | 显示全部楼层 |阅读模式
本帖最后由 lyy-cy 于 2019-8-20 23:49 编辑

原来用的是心知天气的API,数据比较少,看了一个帖子,试了试用正则模块可以解析出天气数据了。
先在winPython下测试成功了。贴出源码,给大家参考。

灵感来源:
https://www.mydigit.cn/forum.php?mod=viewthread&tid=63347

那就试试这个,看看返回数据量是否超标 (标红部分改为你要的地名的拼音)
http://i.tianqi.com/index.php?c=code&a=getcode&id=83&py=mentougou



返回数据:(标红部分是你要的数据





源码:
  1. import requests

  2. url='http://i.tianqi.com/index.php?c=code&a=getcode&id=55&py=haizhuqu'
  3. headers = {
  4.         "Uset-Agent":r"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)  Chrome/47.0.2526.106 BIDUBrowser/8.7 Safari/537.36",
  5.         "Accept-Language":r"zh-CN,zh;q=0.8"
  6.         }

  7. def getPage(url):
  8.   "取得列表页面数据,并转码输出"  
  9.   try:
  10.     wbDate=requests.get(url,headers=headers)#直接用requests.get(url,data)即可,其中.get表示为get方法,不需要对字典类型的data进行处理
  11.     wbDate.encoding = "utf-8"   #手动指定编码方式
  12.     reTxt=wbDate.text           #text方法是获取到响应为一个str,也不需要对res进行转换等处理
  13.     print ("获取页面OK")
  14.     return reTxt
  15.   except:
  16.     print("获取页面失败,等待5秒后重试")
  17.     import time
  18.     time.sleep(5)
  19.     getPage(url)#试一试递归,可以用

  20. import re
  21. content = getPage(url)

  22. #------------------------------------------------------------------------分隔符
  23. Aa1 =r"正则输出开始"
  24. print(f"{'_':_>60}{Aa1:_<40}{'_':_>10}\n")
  25. #------------------------------------------------------------------------分隔符
  26. print('获取title   方法一')
  27. title_pat = r'(?<=<title>).*?(?=</title>)'  
  28. title_ex = re.compile(title_pat,re.M|re.S)  
  29. title_obj = re.search(title_ex, content)
  30. title = title_obj.group()
  31. print (title)

  32. print('获取title   方法二')
  33. title = re.findall(r'<title>(.*?)</title>', content)
  34. print (title)


  35. print('农历')
  36. # r'<li class="t3">08/19 己亥年七月十九</li>'  这是是原文的串
  37. _pat = r'<li class="t3">(.*?)</li>'
  38. _ex = re.compile(_pat,re.M|re.S)  
  39. nongli = re.findall(_ex, content)
  40. print (nongli)


  41. print('天气')
  42. # r'<span style="font-size:14px;width: 70px;line-height: 18px;height: 18px;overflow: hidden;">雷阵雨</span>  这是是原文的串
  43. _pat = r'height: 18px;overflow: hidden;">(.*?)</span>'
  44. _ex = re.compile(_pat,re.M|re.S)  
  45. tianqi = re.findall(_ex, content)
  46. print (tianqi)


  47. print('温度')
  48. # r'<h5><span class="f1">27</span>~<span class="f2">34</span></h5>'  这是是原文的串
  49. title_pat = r'<h5><span class="f1">(.*?)</span>~<span class="f2">(.*?)</span></h5>'
  50. title_ex = re.compile(title_pat,re.M|re.S)  
  51. wendu = re.findall(title_ex, content)
  52. print (wendu)

  53. print('指数')
  54. # r'height:36px"><h4>晨练指数</h4><p>不宜</p></a></div>'  这是是原文的串
  55. _pat = r'height:36px"><h4>(.*?)</h4><p>(.*?)</p></a></div>'
  56. _ex = re.compile(_pat,re.M|re.S)  
  57. zhushui = re.findall(_ex, content)
  58. print (zhushui)


  59. print('说明')
  60. # r'haizhuqu/?tq" title="紫外线强度很弱,建议出门前涂擦SPF在6-7之间、PA+的防晒护肤品。"><img class="pic" src='  这是是原文的串
  61. _pat = r'<div class="tab"><a target="_blank"  href="http://guangzhou.tianqi.com/haizhuqu/?tq" title=(.*?)><img class="pic" src='
  62. _ex = re.compile(_pat,re.M|re.S)  
  63. shuom = re.findall(_ex, content)
  64. print (shuom)
复制代码



输出,虽然不完美,基本能用了
  1. 获取页面OK
  2. ____________________________________________________________正则输出开始____________________________________________

  3. 获取title   方法一
  4. 海珠天气预报代码调用
  5. 获取title   方法二
  6. ['海珠天气预报代码调用']
  7. 农历
  8. ['08/20 己亥年七月二十']
  9. 天气
  10. ['雷阵雨']
  11. 温度
  12. [('27', '34')]
  13. 指数
  14. [('紫外线指数', '中等'), ('穿衣指数', '炎热'), ('晾晒指数', '不适宜'), ('旅游指数', '不适宜'), ('晨练指数', '不宜'), ('洗车指数', '不宜')]
  15. 说明
  16. []
  17. [Finished in 0.7s]
复制代码
参考网址,按照要求,对原作者表示感谢!版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Eastmount/article/details/51082253
————————————————
版权声明:本文为CSDN博主「Eastmount」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Eastmount/article/details/51082253

将上面代码,写入esp32成功(当然做了相应修改),得到了天气数据,连农历都有了,并且在OLED成功显示了。
  1. import network
  2. import time

  3. MY_SSID = "home888"
  4. MY_PASSWORD = "12345678"

  5. def do_connect(essid,password):
  6.     import network
  7.     wlan = network.WLAN(network.STA_IF)
  8.     wlan.active(True)
  9.     if not wlan.isconnected():
  10.         print('connecting to network...')
  11.         wlan.connect(essid,password)
  12.         time.sleep(10) # 连接有延时,睡眠10秒         
  13.     print('network config:', wlan.ifconfig())
  14.     return wlan.isconnected()

  15. def dis_connect():
  16.     import network
  17.     wlan = network.WLAN(network.STA_IF)
  18.     wlan.active(False)
  19.     print('network config:', wlan.ifconfig())

  20. do_connect(MY_SSID,MY_PASSWORD)

  21. import urequests

  22. url='http://i.tianqi.com/index.php?c=code&a=getcode&id=55&py=haizhuqu'

  23. r = urequests.get(url)   # 发起HTTP的GET请求
  24. content = r.text


  25. import ure as re
  26. print('农历')
  27. nongli = re.search(r'<li class="t3">(.*?)</li>', content)
  28. nongli = nongli.group(1)
  29. print (nongli)

  30. print('天气')
  31. # r'<span style="font-size:14px;width: 70px;line-height: 18px;height: 18px;overflow: hidden;">雷阵雨</span>  这是是原文的串
  32. tianqi = re.search(r'height: 18px;overflow: hidden;">(.*?)</span>', content)
  33. tianqi = tianqi.group(1)
  34. print (tianqi)

  35. print('温度')
  36. # r'<h5><span class="f1">27</span>~<span class="f2">34</span></h5>'  这是是原文的串
  37. wendu = re.search(r'<h5><span class="f1">(.*?)</span>~<span class="f2">(.*?)</span></h5>', content)
  38. wendua = wendu.group(1)
  39. wendub = wendu.group(2)
  40. print (wendua,wendub)

  41. print('指数')
  42. zhushui = re.search(r'height:36px"><h4>(.*?)</h4><p>(.*?)</p></a></div>', content)
  43. zhushuia = zhushui.group(1)
  44. zhushuib = zhushui.group(2)
  45. print (zhushuia,zhushuib)
复制代码
输出
  1. I (22216) phy: phy_version: 4100, 2a5dd04, Jan 23 2019, 21:00:07, 0, 0

  2. connecting to network...

  3. network config: ('192.168.8.104', '255.255.255.0', '192.168.8.1', '192.168.8.1')

  4. 农历

  5. 08/20 己亥年七月二十

  6. 天气

  7. 多云

  8. 温度

  9. 26 33

  10. 指数

  11. 紫外线指数 中等
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 2家元 +40 收起 理由
家睦 + 20
落叶风 + 20

查看全部打赏

 楼主| 发表于 2019-8-20 17:37:01 | 显示全部楼层
现在论坛,帖子发布后,过段时间,就不能再编辑了。只好发新帖。

打赏

参与人数 1家元 +20 收起 理由
落叶风 + 20

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-8-23 20:28:27 | 显示全部楼层
本帖最后由 落叶风 于 2019-8-23 20:48 编辑
lyy-cy 发表于 2019-8-20 17:37
现在论坛,帖子发布后,过段时间,就不能再编辑了。只好发新帖。

好,不错,你的方法,我从你的思路找到一些方法提取这网站的天气。改动这个连接地址的ID码可以得到不同参数的天气数据,可以用ESP8266读多次数据,重新组织天气数据输出,有时间重新编写我的LED彩屏时钟的天气部份程序。
以下是不同ID所显示的天气数据。以下为不同ID的珠海的天气显示内容,代码量不多,ESP8266可以处理。
以下为ID为0的显示内容

以下为ID为2的显示内容

以下为ID为1的显示内容

以下为这ID的显示内容

以下为这ID的显示内容

以下为这ID的显示内容

以下为这ID的显示内容

以下为这ID的显示内容


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 2 反对 0

使用道具 举报

发表于 2021-3-10 15:20:50 | 显示全部楼层
非常好用,但有个疑问,怎么区分不同日期的天气呢?
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-3-10 17:11:52 | 显示全部楼层
panhaixiao 发表于 2021-3-10 15:20
非常好用,但有个疑问,怎么区分不同日期的天气呢?





改变ID值,上面有说明;

学会Python爬虫,别说天气;

xx图片,都能抓取,我还试过招标网的全国数据;

真的有需求,就学Python吧!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2021-3-10 17:25:17 来自手机浏览器 | 显示全部楼层
大佬能搞一个这玩意儿玩单片机的教程吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-10 17:47:43 | 显示全部楼层
本帖最后由 lyy-cy 于 2021-3-10 18:06 编辑
触景情伤 发表于 2021-3-10 17:25
大佬能搞一个这玩意儿玩单片机的教程吗?

https://blog.csdn.net/yannanxiu/article/details/53966374

https://docs.singtown.com/microp ... esp32/quickref.html

以上两篇足矣。可以点灯,spi,IIC……

进阶学习,软件:
https://www.runoob.com/python3/python3-tutorial.html

建议买这种ESP32的,功能强好多



实在心疼钱这种也可


为避免广告嫌疑,已经打码。但是还是推荐这家。
买过很多东西,没有失望过。X信电子也不错,比这家贵1-2元。

各位老铁有问题可以跟帖。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2021-3-11 08:02:44 | 显示全部楼层
改变那个IP只是改变不同的内容,但比如ID98这个,我需要提取的数据中需要区分今天,明天,后天的天气,应该怎样操作?
<h4>今天</h4>
                <ul>
                <li class="t1"><img class='pngtqico' align='absmiddle' src='//plugin.tianqistatic.com/static/images/tianqi/b2.png' style='border:0;width:20px;height:20px'/></li>
                <li class="t2"><p class="t2_1 f1">10℃~18℃</p><p class="t2_2 f1">阴到小雨</p></li>
                </ul>
        </div>
        <div class="box1 f1">
                <h4>明天</h4>
                <ul>
                <li class="t1"><img class='pngtqico' align='absmiddle' src='//plugin.tianqistatic.com/static/images/tianqi/b2.png' style='border:0;width:20px;height:20px'/></li>
                <li class="t2"><p class="t2_1 f1">10℃~18℃</p><p class="t2_2 f1">多云转阴</p></li>
                </ul>
        </div>
        <div class="box1 f1">
                <h4>后天</h4>
                <ul>
                <li class="t1"><img class='pngtqico' align='absmiddle' src='//plugin.tianqistatic.com/static/images/tianqi/b1.png' style='border:0;width:20px;height:20px'/></li>
                <li class="t2"><p class="t2_1 f1">11℃~14℃</p><p class="t2_2 f1">多云</p></li>
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-11 11:35:36 | 显示全部楼层
本帖最后由 lyy-cy 于 2021-3-11 11:38 编辑
panhaixiao 发表于 2021-3-11 08:02
改变那个IP只是改变不同的内容,但比如ID98这个,我需要提取的数据中需要区分今天,明天,后天的天气,应该 ...

<h4>今天</h4>
                <ul>
                <li class="t1"><img class='pngtqico' align='absmiddle' src='//plugin.tianqistatic.com/static/images/tianqi/b2.png' style='border:0;width:20px;height:20px'/></li>
                <li class="t2"><p class="t2_1 f1">10℃~18℃</p><p class="t2_2 f1">阴到小雨</p></li>
                </ul>
        </div>
        <div class="box1 f1">
                <h4>明天</h4>
                <ul>
                <li class="t1"><img class='pngtqico' align='absmiddle' src='//plugin.tianqistatic.com/static/images/tianqi/b2.png' style='border:0;width:20px;height:20px'/></li>
                <li class="t2"><p class="t2_1 f1">10℃~18℃</p><p class="t2_2 f1">多云转阴</p></li>
                </ul>
        </div>
        <div class="box1 f1">
                <h4>后天</h4>
                <ul>
                <li class="t1"><img class='pngtqico' align='absmiddle' src='//plugin.tianqistatic.com/static/images/tianqi/b1.png' style='border:0;width:20px;height:20px'/></li>
                <li class="t2"><p class="t2_1 f1">11℃~14℃</p><p class="t2_2 f1">多云</p></li>





取回的数据里面已经含有所需的数据;
然后用【正则表达式】提取即可;
这个网上资料很多,花个半天时间学习一下,以后都很有用的。




回复 支持 反对

使用道具 举报

发表于 2021-3-11 13:46:03 | 显示全部楼层
lyy-cy 发表于 2021-3-11 11:35
今天
               
               

谢谢,基础太差,今天的数据我会提取,但是明天的我就提不出来了,不知道怎么操作,能否把提取明天天气的代码打一下给我参考学习一下:loveliness:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-11 16:30:21 | 显示全部楼层
panhaixiao 发表于 2021-3-11 13:46
谢谢,基础太差,今天的数据我会提取,但是明天的我就提不出来了,不知道怎么操作,能否把提取明天天气的 ...

这个我现在也不会了,以前会的,

过了好久,具体细节以及记不起来了。:lol:
回复 支持 反对

使用道具 举报

发表于 2021-3-11 17:01:14 | 显示全部楼层
:lol:好吧,还得去老老实实解析json
回复 支持 反对

使用道具 举报

发表于 2021-3-30 15:24:33 | 显示全部楼层
lyy-cy 发表于 2021-3-11 16:30
这个我现在也不会了,以前会的,

过了好久,具体细节以及记不起来了。 ...

今天试了一下python获取i.tianqi.com数据,发现都是404了,怎么回事,能搞定吗?
回复 支持 反对

使用道具 举报

发表于 2021-3-31 09:15:03 | 显示全部楼层
大佬流弊,又想骗我上Python的车:lol:
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-26 00:22 , Processed in 0.109200 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表