近小编在学习爬虫,就想找个东西练练手,小说、图片、音乐什么的都烂大街了,正好最近天气是越来越冷,小编窝家里自己敲了个天气简单查询的代码,请大家指正下!
找到目标后,开始分析网页,发现里面是支持查询,并且查询的城市和url又一定的规律,如下:
百度下后,发现url中的数字是城市代码,这就简单了,先把代码弄到,然后做成字典。
然后,分析网页的元素,发现近7天的预报都已经整整齐齐的放在那里了,这就简单了,开始写代码吧!
需要提前安装lxml库,然后导入
import requests from lxml import etree
为了方便查询,直接写input,然后拼接网址
city=input("请输入要查询的城市:") city_code=city_code_list[city] home_page='http://www.weather.com.cn' url=home_page + '/weather/' + city_code + '.shtml'
解析拼接好的网址,这里小编用requests获取get内容
def get_html(url): header={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0'} html=requests.get(url, headers=header) html.encoding='utf-8' return html.text html=etree.HTML(get_html(url))
然后开始查找路径
date=html.xpath('//ul[@class="t clearfix"]/li[{}]/h1/text()'.format(i))
由于7天的预报都是在li标签下的,所以写到循环中,print输出即完成!
最后效果如下:
简单的功能实现,成就感满满的!
代码放上:
city=input("请输入要查询的城市:") city_code=city_code_list[city] home_page='http://www.weather.com.cn' url=home_page + '/weather/' + city_code + '.shtml' #city_code + '.shtml' def get_html(url): header={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0'} html=requests.get(url, headers=header) html.encoding='utf-8' return html.text html=etree.HTML(get_html(url)) for i in range(1,8): date=html.xpath('//ul[@class="t clearfix"]/li[{}]/h1/text()'.format(i))[0]#日期 weather=html.xpath('//ul[@class="t clearfix"]/li[{}]/p[1]/text()'.format(i))[0]#天气 tem1=html.xpath('//ul[@class="t clearfix"]/li[{}]/p[@class="tem"]/span/text()'.format(i)) tem2=html.xpath('//ul[@class="t clearfix"]/li[{}]/p[@class="tem"]/i/text()'.format(i)) tem=tem1[0]+'/'+ tem2[0]#拼接温度最高/最低 win1=html.xpath('//ul[@class="t clearfix"]/li[{}]/p[@class="win"]/i/text()'.format(i)) win2=html.xpath('//ul[@class="t clearfix"]/li[{}]/p[@class="win"]/em/span[1]/@title'.format(i)) win=win2[0]+ win1[0]#拼接风力大小 print(date,weather,tem,win)
喜欢就关注一波呗(^_^),想和小编一起学习Python的,可以私信小编哦。
到 心知天气 - 高精度气象数据 - 天气数据 API 接口 - 行业气象解决方案 (seniverse.com) 注册一个账号,复制出来密钥,后面代码里面用到的 key 就是这个密钥。
已安装可忽略这一步骤,本文内容基于 Arduino IDE 2.1.0 编写。ESP8266/ESP32 开发板环境安装详细见文章 Arduino 1.8、Arduino IDE 2.0 上配置 ESP8266/ESP32 开发板开发环境 - 自由向往的程序猿 (demo1984s.com)
安装方式:依次打开菜单“工具 - 管理库“,搜索”Time“进行安装。
安装方式:依次打开菜单“工具 - 管理库“,搜索”GxEPD2“进行安装。
安装方式:依次打开菜单“工具 - 管理库“,搜索”U8g2“进行安装。
安装方式:依次打开菜单“工具 - 管理库“,搜索”ArduinoJson“进行安装。
安装方式:依次打开菜单“项目 - 导入库 - 添加 .ZIP 库“,选择提供的文件“U8g2_for_Adafruit_GFX.zip”进行安装。
安装方式:依次打开菜单“项目 - 导入库 - 添加 .ZIP 库”,选择提供的文件“U8g2_wqy.zip”进行安装。这里要注意 U8g2_wqy 汉字字体库的使用。
U8g2_wqy 采用文泉驿点阵宋体作为源本,提供 12x12、13x13、14x14、15x15 和 16x16 点阵字库:
字库选择以最简适用为原则,否则会导致程序过大编译的时候抛出 section '.irom0.text' will not fit in region 'irom0_0_seg' 的失败提示。
字体名 | 字符数 | 字节 |
u8g2_font_wqy12_t_chinese1 | 411 | 9,491 |
u8g2_font_wqy12_t_chinese2 | 574 | 13,701 |
u8g2_font_wqy12_t_chinese3 | 993 | 25,038 |
u8g2_font_wqy12_t_gb2312a | 4041 | 111,359 |
u8g2_font_wqy12_t_gb2312b | 4531 | 120,375 |
u8g2_font_wqy12_t_gb2312 | 7539 | 208,228 |
u8g2_font_wqy13_t_chinese1 | 411 | 10,341 |
u8g2_font_wqy13_t_chinese2 | 574 | 14,931 |
u8g2_font_wqy13_t_chinese3 | 993 | 27,370 |
u8g2_font_wqy13_t_gb2312a | 4041 | 121,327 |
u8g2_font_wqy13_t_gb2312b | 4531 | 130,945 |
u8g2_font_wqy13_t_gb2312 | 7539 | 227,383 |
u8g2_font_wqy14_t_chinese1 | 411 | 11,368 |
u8g2_font_wqy14_t_chinese2 | 574 | 16,443 |
u8g2_font_wqy14_t_chinese3 | 993 | 30,200 |
u8g2_font_wqy14_t_gb2312a | 4040 | 133,898 |
u8g2_font_wqy14_t_gb2312b | 4530 | 143,477 |
u8g2_font_wqy14_t_gb2312 | 7538 | 251,515 |
u8g2_font_wqy15_t_chinese1 | 411 | 12,590 |
u8g2_font_wqy15_t_chinese2 | 574 | 18,133 |
u8g2_font_wqy15_t_chinese3 | 993 | 33,165 |
u8g2_font_wqy15_t_gb2312a | 4041 | 147,563 |
u8g2_font_wqy15_t_gb2312b | 4531 | 158,713 |
u8g2_font_wqy15_t_gb2312 | 7539 | 276,938 |
u8g2_font_wqy16_t_chinese1 | 411 | 14,229 |
u8g2_font_wqy16_t_chinese2 | 574 | 20,245 |
u8g2_font_wqy16_t_chinese3 | 993 | 37,454 |
u8g2_font_wqy16_t_gb2312a | 4041 | 169,286 |
u8g2_font_wqy16_t_gb2312b | 4531 | 182,271 |
u8g2_font_wqy16_t_gb2312 | 7539 | 318,090 |
安装方式:依次打开菜单“项目 - 导入库 - 添加 .ZIP 库”,2023 年 5 月 10 日前的选择“ESP-SeniverseV0.0.1.zip”进行安装,2023 年 5 月 10 日后的选择“ESP-SeniverseV0.0.2.zip”进行安装,V0.0.2 相对 V0.0.1 改动较大,不兼容。
代码修改引脚的地方在文件 GxEPD2_display_selection_new_style.h 里面。
ESP8266 开发板:
ESP32 开发板:
样例代码:
1GxEPD2_DISPLAY_CLASS display(GxEPD2_DRIVER_CLASS(/*CS=*/ 2, /*DC=*/ 0, /*RST=*/ 4, /*BUSY=*/ 5));
以下是我使用的墨水屏驱动板与开发板引脚连接关系,可供参考(注意数字的含义:以 BUSY 为例,5 表示 GPIO5):
1驱动板 开发板(GPIO)
2BUSY D1(5)
3RST D2(4) // 部分驱动板上标注的是RES
4DC D3(0)
5CS D4(2)
6CLK D5(14) // 部分驱动板上标注的是SCK
7SDA D7(13) // 部分驱动板上标注的是DIN
8GND GND
93V3 3.3V // 部分驱动板同时支持或者只有3V或5V,根据实际情况连接
具体也可根据自己的实际需要进行修改。
引脚分布图,可见原文 https://docs.espressif.com/projects/arduino-esp32/en/latest/boards/ESP32-DevKitC-1.html
以下是我使用的墨水屏驱动板与开发板引脚连接关系,可供参考:
1驱动板 开发板(GPIO)
2BUSY 21
3RST 16 // 部分驱动板上标注的是RES
4DC 17
5CS 5
6CLK 18 // 部分驱动板上标注的是SCK
7SDA 23 // 部分驱动板上标注的是DIN
8GND GND
93V3 3.3V // 部分驱动板同时支持或者只有3V或5V,根据实际情况连接
与 32D 差异是 BUSY 换了一个脚,也可以使用其他 GPIO 脚。需要注意的是网上买的开板引脚布局和乐鑫官方的可能会有一点差异,一般卖家都会提供引脚布局图。建议引脚统一接在开发板同一侧,这样会比较方便。
1驱动板 开发板
2BUSY 4
3RST 16 // 部分驱动板上标注的是RES
4DC 17
5CS 5
6CLK 18 // 部分驱动板上标注的是SCK
7SDA 23 // 部分驱动板上标注的是DIN
8GND GND
93V3 3.3V // 部分驱动板同时支持或者只有3V或5V,根据实际情况连接
引脚分布图,可见原文 ESP32C3-CORE 开发板 - LuatOS 文档
1驱动板 开发板
2BUSY 11
3RST 10 // 部分驱动板上标注的是RES
4DC 5
5CS 7
6CLK 4 // 部分驱动板上标注的是SCK
7SDA 6 // 部分驱动板上标注的是DIN
8GND GND
93V3 3.3V // 部分驱动板同时支持或者只有3V或5V,根据实际情况连接
这里需要注意的是 BUSY 引脚用到了特殊引脚 GPIO11(GPIO11 默认为 SPI flash 的 VDD 引脚),这里因为之前捣鼓项目已经配置过 GPIO11 引脚(ESP32C3 解锁使用 IO11),所以直接用了。
以上引脚对应连接关系具体也可根据自己的实际需要进行修改。有问题可以到小黄鱼上找,部分文章为方便已购买的鱼友而写,部分文章日常爱好捣鼓过程中有感而发。
更多内容可到小黄鱼上找我
然发现一个国外的网站接入了天气板块,很有意思的是该网站所有的天气图标都是会动的。
于是我便有了学(chao)习(xi)的念头,我们来一探究竟。
一、顺藤摸瓜
通过审查元素,我们很快定位到了一个叫 skycons 的 js 类库,顺藤摸瓜找到了 github 地址,顺手下载了一份 skycons.js 文件。
二、简单示例
首先,添加 canvas,并设置 id,以备后续使用,宽高可以随意设置,如下:
其次,我们实例化 Skycons:
然后,在我们的元素上通过 canvas id 来添加动画,并选择动画类型:
最后,别忘了,播放它:
这样,一个简单的示例就完成了,是不是很简单呢?下面我们来看看参数详解。
三、参数详解
可设置的天气类型参数:
添加动画:
播放动画:
skycons.play();
暂停动画:
skycons.pause()
动态更改 icon :
skycons.set('jartto1', Skycons.PARTLY_CLOUDY_NIGHT);
移除动画:
skycons.remove('jartto2');
四、实际应用
为了更好的说明问题,我们来做一个天气板块的完整示例:
首先,引入 skycons 文件:
其次,创建html结构:
最后,添加 js 代码:
是不是很简单呢,更多请查看 Demo:
https://github.com/chenfengyanyu/my-web-accumulation/tree/master/skycons
五、问题汇总
1.实际的天气状况可能有很多,而 skycons 提供的选择并不多;
六、源码分析
因为看不到文档,所以很好奇,大概瞅了一些源码。当然,也并不是一无所获,譬如:
1.requestAnimationFram 的兼容处理:
2.add 方法:
add 方法操作的是一个数组,也就意味着,我们只需要实例化一次 skycons 就可以添加多个 icons 。
3.定时器的时间设置技巧 1000 / 60,动画更加流畅:
起初不太理解作者为何要设置这个数值,后来才意识到:
大多数浏览器都会对重绘操作加以限制,不超过显示器的重绘频率,因为即使超过那个频率用户体验也不会有提升。
因此,最平滑动画的最佳循环间隔是 1000 ms / 60,约等于 16.6 ms 。
4.各种 canvas 画太阳,云彩,风等方法,可以参考。
源码比较简单,详情请查看:
https://github.com/chenfengyanyu/my-web-accumulation/blob/master/skycons/skycons.js
七、效果一览
是不是很有意思,快来试试吧!附上 Demo 地址:
https://github.com/chenfengyanyu/my-web-accumulation/tree/master/skycons
八、热门原创文章
1.HTML5 之音频合成(Speech Synthesis)
2.DevOps 简介
3.前端反思录(三)—谈谈个人规划
*请认真填写需求信息,我们会在24小时内与您取得联系。