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中用Decorator来简化元编程的教程
Apr 13 Python
Numpy数组转置的两种实现方法
Apr 17 Python
好的Python培训机构应该具备哪些条件
May 23 Python
python正则表达式之对号入座篇
Jul 24 Python
Django时区详解
Jul 24 Python
浅谈django2.0 ForeignKey参数的变化
Aug 06 Python
简单的Python调度器Schedule详解
Aug 30 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
如何将 awk 脚本移植到 Python
Dec 09 Python
Python正则表达式高级使用方法汇总
Jun 18 Python
pytorch 如何使用batch训练lstm网络
May 28 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读取TXT文件向数据库导入海量数据的方法
2013/04/23 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
jQuery初学:find()方法及children方法的区别分析
2011/01/31 Javascript
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
JavaScript判断一个字符串是否包含指定子字符串的方法
2015/03/18 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
2015/08/20 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
JS文件上传神器bootstrap fileinput详解
2021/01/28 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
vue.js删除动态绑定的radio的指定项
2017/06/02 Javascript
Angular2进阶之如何避免Dom误区
2018/04/02 Javascript
vue cli2.0单页面title修改方法
2018/06/07 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
如何通过javaScript去除字符串两端的空白字符
2020/02/06 Javascript
javascript使用Blob对象实现的下载文件操作示例
2020/04/18 Javascript
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
python数据封装json格式数据
2018/03/04 Python
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
pymongo中聚合查询的使用方法
2019/03/22 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
尼克松手表官网:Nixon手表
2019/03/17 全球购物
戴森英国官网:Dyson英国
2019/05/07 全球购物
护理专业应届毕业生推荐信
2013/11/15 职场文书
仓库班组长岗位职责
2013/12/12 职场文书
村优秀党员事迹材料
2014/01/15 职场文书
毕业实习单位意见
2015/06/04 职场文书
妈妈别哭观后感
2015/06/08 职场文书
同学聚会致辞集锦
2015/07/28 职场文书
python简单验证码识别的实现过程
2021/06/20 Python
go开发alertmanger实现钉钉报警
2021/07/16 Golang