近小編在學習爬蟲,就想找個東西練練手,小說、圖片、音樂什么的都爛大街了,正好最近天氣是越來越冷,小編窩家里自己敲了個天氣簡單查詢的代碼,請大家指正下!
找到目標后,開始分析網頁,發現里面是支持查詢,并且查詢的城市和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小時內與您取得聯系。