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与Redis的连接教程
Apr 22 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
Jul 15 Python
Python简单爬虫导出CSV文件的实例讲解
Jul 06 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
PYTHON如何读取和写入EXCEL里面的数据
Oct 28 Python
Pycharm最常用的快捷键及使用技巧
Mar 05 Python
简单了解如何封装自己的Python包
Jul 08 Python
python利用pytesseract 实现本地识别图片文字
Dec 14 Python
python 利用matplotlib在3D空间中绘制平面的案例
Feb 06 Python
Python爬虫制作翻译程序的示例代码
Feb 22 Python
python获取淘宝服务器时间的代码示例
Apr 22 Python
Python实现学生管理系统(面向对象版)
Jun 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二维数组合并及去重复的方法
2015/03/04 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
js中的string.format函数代码
2020/08/11 Javascript
Js获取下拉框选定项的值和文本的实现代码
2014/02/26 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
javascript实现随机显示星星特效
2016/01/28 Javascript
原生js仿jquery animate动画效果
2016/07/13 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
Vue监听数组变化源码解析
2017/03/09 Javascript
JS查找数组中重复元素的方法详解
2017/06/14 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
介绍Python中的__future__模块
2015/04/27 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
Tensorflow 同时载入多个模型的实例讲解
2018/07/27 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
python实现淘宝购物系统
2019/10/25 Python
python实现删除列表中某个元素的3种方法
2020/01/15 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
python 如何快速复制序列
2020/09/07 Python
上海某公司.net方向笔试题
2014/09/14 面试题
男方父母证婚词
2014/01/12 职场文书
12岁生日演讲稿
2014/05/14 职场文书
应用外语系自荐信
2014/06/26 职场文书
活动总结格式
2014/08/30 职场文书
股东授权委托书范本
2014/09/13 职场文书
2014年法制宣传日活动方案
2014/11/02 职场文书
七一慰问简报
2015/07/20 职场文书
mysql中整数数据类型tinyint详解
2021/12/06 MySQL