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实现bitmap数据结构详解
Feb 17 Python
简单理解Python中的装饰器
Jul 31 Python
Python的CGIHTTPServer交互实现详解
Feb 08 Python
python使用json序列化datetime类型实例解析
Feb 11 Python
Python 删除连续出现的指定字符的实例
Jun 29 Python
python 3.7.0 安装配置方法图文教程
Aug 27 Python
pygame游戏之旅 添加游戏界面按键图形
Nov 20 Python
OpenCV+Python识别车牌和字符分割的实现
Jan 31 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
Aug 13 Python
python中文分词库jieba使用方法详解
Feb 11 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 Python
Python深度学习之实现卷积神经网络
Jun 05 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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
php自动加载的两种实现方法
2010/06/21 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
php实现session共享的实例方法
2019/09/19 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
Prototype源码浅析 String部分(三)之HTML字符串处理
2012/01/15 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
Jquery 模板数据绑定插件的使用方法详解
2013/07/08 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
初试vue-cli使用HBuilderx打包app的坑
2019/07/17 Javascript
JavaScript canvas实现雪花随机动态飘落
2020/02/08 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
Python的in,is和id函数代码实例
2020/04/18 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
怎样客观的做好自我评价
2013/12/28 职场文书
项目合作协议书范本
2014/04/16 职场文书
齐云山导游词
2015/02/06 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers