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调度框架APScheduler使用
Mar 28 Python
解决Django模板无法使用perms变量问题的方法
Sep 10 Python
Django学习教程之静态文件的调用详解
May 08 Python
python os用法总结
Jun 08 Python
解决Python安装后pip不能用的问题
Jun 12 Python
Python3标准库总结
Feb 19 Python
Pytorch反向求导更新网络参数的方法
Aug 17 Python
Django框架表单操作实例分析
Nov 04 Python
Python创建空列表的字典2种方法详解
Feb 13 Python
什么是python的列表推导式
May 26 Python
keras 简单 lstm实例(基于one-hot编码)
Jul 02 Python
matplotlib基础绘图命令之errorbar的使用
Aug 13 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
PHPThumb PHP 图片缩略图库
2012/03/11 PHP
php实现压缩合并js的方法【附demo源码下载】
2016/09/22 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
详解php协程知识点
2018/09/21 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
Add a Table to a Word Document
2007/06/15 Javascript
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
AngularJS基础 ng-init 指令简单示例
2016/08/02 Javascript
Sequelize中用group by进行分组聚合查询
2016/12/12 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
基于js中document.cookie全面解析
2017/09/14 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
python selenium登录豆瓣网过程解析
2019/08/10 Python
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
python实现简单坦克大战
2020/03/27 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
一些PHP的面试题
2015/05/06 面试题
教师自我评价范例
2013/09/24 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
大学生应聘导游自荐信
2014/06/02 职场文书
建筑学专业自荐书
2014/07/09 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
2014年生产部工作总结
2014/12/17 职场文书
聊聊golang中多个defer的执行顺序
2021/05/08 Golang