Python爬虫+tkinter界面实现历史天气查询的思路详解


Posted in Python onFebruary 22, 2021

今天给大家分享用Python 爬虫+tkinter界面来实现历史天气查询。

一、实现效果

运行效果

运行效果如下:

Python爬虫+tkinter界面实现历史天气查询的思路详解 

二、基本思路

导入用到的库

import requests
from lxml import etree
import re
import tkinter as tk
from PIL import Image, ImageTk
from xpinyin import Pinyin

1. 爬虫部分

目标url:https://lishi.tianqi.com/

该网站提供了全国34个省、市所属的2290个地区的历史天气预报查询,数据来源于城市当天的天气信息,可以查询到历史天气气温,历史风向,历史风力等历史天气状况。

Python爬虫+tkinter界面实现历史天气查询的思路详解
Python爬虫+tkinter界面实现历史天气查询的思路详解

分析网页可以发现,某个地区、某个月的所有天气数据的url为:https://lishi.tianqi.com/ + 地区名字的拼音 + '/' + 年月.html。根据用户输入的地区和时间,进行字符串的处理,构造出url,用于request请求有该月所有天气信息的页面,获取响应后Xpath定位提取用户输入的要查询的日期的天气信息,查询结果显示在tkinter界面。

爬虫代码如下:

def spider():
 headers = {
  'user-agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24',
  "referer": "https://lishi.tianqi.com/chengdu/index.html"
 }
 p = Pinyin()
 place = ''.join(p.get_pinyin(b1.get()).split('-'))   # 获取地区文本框的输入 变为拼音
 # 处理用户输入的时间
 # 规定三种格式都可以 2018/10/1 2018年10月1日 2018-10-1
 date = b2.get() # 获取时间文本框的输入
 if '/' in date:
  tm_list = date.split('/')
 elif '-' in date:
  tm_list = date.split('-')
 else:
  tm_list = re.findall(r'\d+', date)

 if int(tm_list[1]) < 10:  # 1-9月 前面加 0
  tm_list[1] = f'0{tm_list[1]}'
 # 分析网页发现规律 构造url
 # 直接访问有该月所有天气信息的页面 提高查询效率
 url = f"https://lishi.tianqi.com/{place}/{''.join(tm_list[:2])}.html"
 resp = requests.get(url, headers=headers)
 html = etree.HTML(resp.text)
 # xpath定位提取该日天气信息
 info = html.xpath(f'//ul[@class="thrui"]/li[{int(tm_list[2])}]/div/text()')
 # 输出信息格式化一下
 info1 = ['日期:', '最高气温:', '最低气温:', '天气:', '风向:']
 datas = [i + j for i, j in zip(info1, info)]
 info = '\n'.join(datas)
 t.insert('insert', '  查询结果如下  \n\n')
 t.insert('insert', info)
 print(info)

2. tkinter界面

代码如下:

def get_image(file_nam, width, height):
 im = Image.open(file_nam).resize((width, height))
 return ImageTk.PhotoImage(im)


win = tk.Tk()
# 设置窗口title和大小
win.title('全国各地历史天气查询系统')
win.geometry('500x500')

# 画布 设置背景图片
canvas = tk.Canvas(win, height=500, width=500)
im_root = get_image('test.jpg', width=500, height=500)
canvas.create_image(250, 250, image=im_root)
canvas.pack()

# 单行文本
L1 = tk.Label(win, bg='yellow', text="地区:", font=("SimHei", 12))
L2 = tk.Label(win, bg='yellow', text="时间:", font=("SimHei", 12))
L1.place(x=85, y=100)
L2.place(x=85, y=150)

# 单行文本框 可采集键盘输入
b1 = tk.Entry(win, font=("SimHei", 12), show=None, width=35)
b2 = tk.Entry(win, font=("SimHei", 12), show=None, width=35)
b1.place(x=140, y=100)
b2.place(x=140, y=150)

# 设置查询按钮 点击 调用爬虫函数实现查询
a = tk.Button(win, bg='red', text="查询", width=25, height=2, command=spider)
a.place(x=160, y=200)

# 设置多行文本框 宽 高 文本框中字体 选中文字时文字的颜色
t = tk.Text(win, width=30, height=8, font=("SimHei", 18), selectforeground='red') # 显示多行文本
t.place(x=70, y=280)

# 进入消息循环
win.mainloop()

tkinter界面效果如下:

Python爬虫+tkinter界面实现历史天气查询的思路详解 

结语

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小编的支持。

获得 本文完整代码

链接: https://pan.baidu.com/s/1ZCSRIqoOjrxTcLxLYOFiiQ 提取码: wb4f

到此这篇关于Python爬虫+tkinter界面实现历史天气查询的思路详解的文章就介绍到这了,更多相关Python爬虫tkinter界面历史天气查询内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python Flask-web表单使用详解
Nov 18 Python
python正则实现提取电话功能
Feb 24 Python
mac 安装python网络请求包requests方法
Jun 13 Python
python使用webdriver爬取微信公众号
Aug 31 Python
python设定并获取socket超时时间的方法
Jan 12 Python
python中时间模块的基本使用教程
May 14 Python
利用python在大量数据文件下删除某一行的例子
Aug 21 Python
python中property和setter装饰器用法
Dec 19 Python
Pytorch 的损失函数Loss function使用详解
Jan 02 Python
python判断正负数方式
Jun 03 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 Python
Python排序算法之插入排序及其优化方案详解
Jun 11 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
Feb 22 #Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
Feb 22 #Python
Python爬虫制作翻译程序的示例代码
Feb 22 #Python
Python爬虫爬取ts碎片视频+验证码登录功能
Feb 22 #Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 #Python
Python爬虫分析微博热搜关键词的实现代码
Feb 22 #Python
anaconda升级sklearn版本的实现方法
Feb 22 #Python
You might like
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
php输出金字塔的2种实现方法
2014/12/16 PHP
浅析PHP文件下载原理
2014/12/25 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
2015/09/22 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
php 截取GBK文档某个位置开始的n个字符方法
2017/03/08 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
javascript表单验证和Window详解
2014/12/11 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
2016/02/25 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
2016/10/26 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
React学习笔记之事件处理(二)
2017/07/02 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
vue组件中传值EventBus的使用及注意事项说明
2020/11/16 Javascript
PHP魔术方法__ISSET、__UNSET使用实例
2014/11/25 Python
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
Python复制文件操作实例详解
2015/11/10 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
Python的互斥锁与信号量详解
2019/09/12 Python
Python 用三行代码提取PDF表格数据
2019/10/13 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
成品仓管员岗位职责
2013/12/11 职场文书
村官工作鉴定评语
2014/01/27 职场文书
公路绿化方案
2014/05/12 职场文书
防暑降温通知书
2015/04/27 职场文书
小学中队长竞选稿
2015/11/20 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js