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笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
python将xml xsl文件生成html文件存储示例讲解
Dec 03 Python
Python中用Descriptor实现类级属性(Property)详解
Sep 18 Python
介绍Python中的__future__模块
Apr 27 Python
使用python实现生成用户信息
Mar 20 Python
python操作列表的函数使用代码详解
Dec 28 Python
分析python请求数据
Aug 19 Python
python将秒数转化为时间格式的实例
Sep 16 Python
对python3 sort sorted 函数的应用详解
Jun 27 Python
详解Python中的正斜杠与反斜杠
Aug 09 Python
如何解决cmd运行python提示不是内部命令
Jul 01 Python
Python操作Elasticsearch处理timeout超时
Jul 17 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
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
discuz程序的PHP加密函数原理分析
2011/08/05 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
2013/07/05 PHP
Yii中创建自己的Widget实例
2016/01/05 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
利用ASP发送和接收XML数据的处理方法与代码
2007/11/13 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
Angular @HostBinding()和@HostListener()用法
2018/03/05 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
基于windows下pip安装python模块时报错总结
2018/06/12 Python
Django压缩静态文件的实现方法详析
2018/08/26 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
Python3 把一个列表按指定数目分成多个列表的方式
2019/12/25 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
澳大利亚家具和家居用品购物网站:Zanui
2018/12/29 全球购物
英国电气世界:Electrical World
2019/09/08 全球购物
英国领先的餐饮折扣俱乐部:Gourmet Society
2020/07/26 全球购物
如何将整数int转换成字串String
2014/03/21 面试题
C语言编程练习
2012/04/02 面试题
教师廉洁自律承诺书
2014/05/26 职场文书
会计人员演讲稿
2014/09/11 职场文书
2014年医院十一国庆节活动方案
2014/09/15 职场文书
个性发展自我评价2015
2015/03/09 职场文书
学校计划生育责任书
2015/05/09 职场文书
纪律委员竞选稿
2015/11/19 职场文书
Python sklearn分类决策树方法详解
2022/09/23 Python