整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

新手用python爬虫自己做天气预报查询

新手用python爬虫自己做天气预报查询

近小编在学习爬虫,就想找个东西练练手,小说、图片、音乐什么的都烂大街了,正好最近天气是越来越冷,小编窝家里自己敲了个天气简单查询的代码,请大家指正下!

先找目标,最终还是选用了中国天气网,url:http://www.weather.com.cn/

找到目标后,开始分析网页,发现里面是支持查询,并且查询的城市和url又一定的规律,如下:

百度下后,发现url中的数字是城市代码,这就简单了,先把代码弄到,然后做成字典。

然后,分析网页的元素,发现近7天的预报都已经整整齐齐的放在那里了,这就简单了,开始写代码吧!

选定方法,这里小编用的是xpath,方便、快捷。

需要提前安装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 就是这个密钥。

ESP8266/ESP32 开发板安装

  已安装可忽略这一步骤,本文内容基于 Arduino IDE 2.1.0 编写。ESP8266/ESP32 开发板环境安装详细见文章 Arduino 1.8、Arduino IDE 2.0 上配置 ESP8266/ESP32 开发板开发环境 - 自由向往的程序猿 (demo1984s.com)

依赖库安装

Time

  安装方式:依次打开菜单“工具 - 管理库“,搜索”Time“进行安装。

GxEPD2

  安装方式:依次打开菜单“工具 - 管理库“,搜索”GxEPD2“进行安装。

U8g2

  安装方式:依次打开菜单“工具 - 管理库“,搜索”U8g2“进行安装。

ArduinoJson

  安装方式:依次打开菜单“工具 - 管理库“,搜索”ArduinoJson“进行安装。

U8g2_for_Adafruit_GFX

  安装方式:依次打开菜单“项目 - 导入库 - 添加 .ZIP 库“,选择提供的文件“U8g2_for_Adafruit_GFX.zip”进行安装。

U8g2_wqy

  安装方式:依次打开菜单“项目 - 导入库 - 添加 .ZIP 库”,选择提供的文件“U8g2_wqy.zip”进行安装。这里要注意 U8g2_wqy 汉字字体库的使用。
U8g2_wqy 采用文泉驿点阵宋体作为源本,提供 12x12、13x13、14x14、15x15 和 16x16 点阵字库:

  • chinese1、chinese2、chinese3 为 u8g2 官方提供的小字符集。
  • gb2312 是完整的 GB2312 简体中文编码 字符集。(作者强烈推荐使用这种字体,汉字全)
  • gb2312a 只有 GB2312 01、02 和 16 到 55 以及部分 08 区的编码。没有包含全角标点符号,如 !,请用半角 ! 代替。
  • gb2312b 只有 GB2312 01 到 55 的编码,其中 10 到 15 区为空区。比 gb2312a 多一些额外的符号。

  字库选择以最简适用为原则,否则会导致程序过大编译的时候抛出 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

ESP-Seniverse

  安装方式:依次打开菜单“项目 - 导入库 - 添加 .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));

NodeMCU-12F(CP2102), 4MB(ESP8266)

  以下是我使用的墨水屏驱动板与开发板引脚连接关系,可供参考(注意数字的含义:以 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,根据实际情况连接

  具体也可根据自己的实际需要进行修改。

ESP32-DevKitC, 4MB(32D、32E)

  引脚分布图,可见原文 https://docs.espressif.com/projects/arduino-esp32/en/latest/boards/ESP32-DevKitC-1.html

  以下是我使用的墨水屏驱动板与开发板引脚连接关系,可供参考:

ESP32-DevKitC-32D, 4MB

1驱动板 开发板(GPIO)
2BUSY	21
3RST	16 // 部分驱动板上标注的是RES
4DC	17
5CS	5
6CLK	18 // 部分驱动板上标注的是SCK
7SDA	23 // 部分驱动板上标注的是DIN
8GND	GND
93V3	3.3V // 部分驱动板同时支持或者只有3V或5V,根据实际情况连接

ESP32-DevKitC-32E, 4MB

  与 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, 4M

  引脚分布图,可见原文 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 文件。

OK,万事具备,下面我们开始分步剖析。

二、简单示例

首先,添加 canvas,并设置 id,以备后续使用,宽高可以随意设置,如下:

其次,我们实例化 Skycons:

然后,在我们的元素上通过 canvas id 来添加动画,并选择动画类型:

最后,别忘了,播放它:

通过调用 skycons.play() 来播放动画。

这样,一个简单的示例就完成了,是不是很简单呢?下面我们来看看参数详解。

三、参数详解

可设置的天气类型参数:

  • CLEAR_DAY
  • PARTLY_CLOUDY_DAY
  • CLOUDY
  • RAIN
  • SLEET
  • SNOW
  • WIND
  • FOG

添加动画:

播放动画:

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,动画更加流畅:

起初不太理解作者为何要设置这个数值,后来才意识到:

大多数电脑显示器的刷新频率是 60 Hz,大概相当于每秒钟重绘 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.前端反思录(三)—谈谈个人规划