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中查找excel某一列的重复数据 剔除之后打印
Feb 10 Python
Python出现segfault错误解决方法
Apr 16 Python
python使用os.listdir和os.walk获得文件的路径的方法
Dec 16 Python
详解Python nose单元测试框架的安装与使用
Dec 20 Python
解决Matplotlib图表不能在Pycharm中显示的问题
May 24 Python
python获取url的返回信息方法
Dec 17 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
Feb 18 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 Python
获取CSDN文章内容并转换为markdown文本的python
Sep 06 Python
Python可变与不可变数据和深拷贝与浅拷贝
Apr 06 Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
Apr 24 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
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
JS实现动态修改table及合并单元格的方法示例
2017/02/20 Javascript
angularjs的select使用及默认选中设置
2017/04/08 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
2017/06/25 Javascript
ES6解构赋值的功能与用途实例分析
2017/10/31 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
浅谈python字符串方法的简单使用
2016/07/18 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
Python输出\u编码将其转换成中文的实例
2018/12/15 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
HTML5文档结构标签
2017/04/21 HTML / CSS
幼儿园国庆节活动方案
2014/02/01 职场文书
小学二年级学生评语
2014/04/21 职场文书
小学阳光体育活动总结
2014/07/05 职场文书
大型公益活动策划方案
2014/08/20 职场文书
自主招生推荐信格式模板
2015/03/24 职场文书
关于远足的感想
2015/08/10 职场文书
小学数学教师研修感悟
2015/11/18 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
python 中yaml文件用法大全
2021/07/04 Python