• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Python实现天气查询软件

    一、背景

    某天下班淋雨成了落汤鸡,发了个朋友圈感慨一下啊,然后......

    夜深人静之时,突然收到了来自学妹的Py文件,运行之后发现事情并不简单(如下图):

    这是暗示我...下次出门给她带把伞?不管那么多,作为一个程序猿,遇到程序先拆解一下。

    二、工具

    爬虫:requests

    解析:re

    UI:tkinter

    三、代码解读

    想要做一个获取天气预报的小程序,第一步要做的就是能够进行天气预报的爬取,这里通过城市名称匹配百度天气的URL进行爬取,并通过正则的方式进行解析,最终以字典的形式返回结果。

    class Weather(object):
        def __init__(self):
            pass
     
        def crawl(self, key):
     
            url = 'http://weathernew.pae.baidu.com/weathernew/pc?query=' + key + '天气srcid=4982city_name=' + key + 'province_name=' + key
     
            # 设置请求头
            headers = {
                'user-agent':
                'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
                'Referer': 'https://googleads.g.doubleclick.net/'
            }
            # 页面HTML
            res = requests.get(url, headers=headers).text
            # 时间
            time = re.search(r'\{\"update_time\":\"(.+?)\"', res).group(1)
            # 天气
            weather = re.search(r'\"weather\"\:\"(.+?)\"', res).group(1)
            weather = weather.encode('utf-8').decode("unicode-escape")
            # 气温
            weather_l = re.search(r'temperature_night\"\:\"(.+?)\"', res).group(1)
            weather_h = re.search(r'temperature_day\"\:\"(.+?)\"', res).group(1)
            # 风力
            wind_now = re.search(r'\"wind_power_day\"\:\"(.+?)\"', res).group(1)
            wind_now = wind_now.encode('utf-8').decode("unicode-escape")
            wind_name = re.search(r'\"wind_direction_day\"\:\"(.+?)\"',
                                  res).group(1)
            wind_name = wind_name.encode('utf-8').decode("unicode-escape")
            wind = wind_name + wind_now
            # 贴示
            desc = re.search(r'\"desc\"\:\"(.+?)\"', res).group(1)
            desc = desc.encode('utf-8').decode("unicode-escape")
     
            # 结果生
            dic = {
                '城市': key,
                '更新时间': time,
                '天气': weather,
                '温度': weather_l + '-' + weather_h + '摄氏度',
                '风力': wind,
                '贴示': desc,
            }
            return dic
    

    写好了爬取天气预报的代码之后,下面就可以写一个UI来和输入/爬取的内容进行交互的,写UI的方式大同小异,代码如下:

    class Weather_UI(object):
        def __init__(self):
            self.window = Tk()
            self.weather = Weather()
     
            self.window.title(u'天气预报')
            # 设置窗口大小和位置
            self.window.geometry('310x370')
            # 创建一个文本框
            self.result_text0 = Label(self.window, text=u'学长所在城市:\n要写中文呦')
            self.result_text0.place(x=10, y=5, height=130)
            self.result_text0.bind('提示')
     
            self.result_text1 = Text(self.window, background='#ccc')
            self.result_text1.place(x=140, y=10, width=155, height=155)
            self.result_text1.bind("Key-Return>", self.submit)
     
            # 创建一个按钮
            # 为按钮添加事件
            self.submit_btn = Button(self.window,
                                     text=u'获取天气',
                                     command=self.submit)
            self.submit_btn.place(x=170, y=165, width=70, height=25)
            self.submit_btn2 = Button(self.window, text=u'清空', command=self.clean)
            self.submit_btn2.place(x=250, y=165, width=35, height=25)
     
            # 标题
            self.title_label = Label(self.window, text=u'今日天气:')
            self.title_label.place(x=10, y=165)
     
            # 结果
            self.result_text = Text(self.window, background='#ccc')
            self.result_text.place(x=10, y=190, width=285, height=165)
     
        def submit(self):
            # 从输入框获取用户输入的值
            content = self.result_text1.get(0.0, END).strip().replace("\n", " ")
     
            # 把城市信息传到爬虫函数中
            result = self.weather.crawl(content)
     
            # 将结果显示在窗口中的文本框中
            for k, v in result.items():
                self.result_text.insert(END, k + ':' + v)
                self.result_text.insert(END, '\n')
                self.result_text.insert(END, '\n')
     
        # 清空文本域中的内容
        def clean(self):
            self.result_text1.delete(0.0, END)
            self.result_text.delete(0.0, END)
     
        def run(self):
            self.window.mainloop()
    

    运行结果如下:

    四、完整代码

    import json
    import requests
    import re
    import tkinter as Tk
    from tkinter import Tk, Button, Entry, Label, Text, END
     
     
    class Weather(object):
        def __init__(self):
            pass
     
        def crawl(self, key):
     
            url = 'http://weathernew.pae.baidu.com/weathernew/pc?query=' + key + '天气srcid=4982city_name=' + key + 'province_name=' + key
     
            # 设置请求头
            headers = {
                'user-agent':
                'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
                'Referer': 'https://googleads.g.doubleclick.net/'
            }
            # 页面HTML
            res = requests.get(url, headers=headers).text
            # 时间
            time = re.search(r'\{\"update_time\":\"(.+?)\"', res).group(1)
            # 天气
            weather = re.search(r'\"weather\"\:\"(.+?)\"', res).group(1)
            weather = weather.encode('utf-8').decode("unicode-escape")
            # 气温
            weather_l = re.search(r'temperature_night\"\:\"(.+?)\"', res).group(1)
            weather_h = re.search(r'temperature_day\"\:\"(.+?)\"', res).group(1)
            # 风力
            wind_now = re.search(r'\"wind_power_day\"\:\"(.+?)\"', res).group(1)
            wind_now = wind_now.encode('utf-8').decode("unicode-escape")
            wind_name = re.search(r'\"wind_direction_day\"\:\"(.+?)\"',
                                  res).group(1)
            wind_name = wind_name.encode('utf-8').decode("unicode-escape")
            wind = wind_name + wind_now
            # 贴示
            desc = re.search(r'\"desc\"\:\"(.+?)\"', res).group(1)
            desc = desc.encode('utf-8').decode("unicode-escape")
     
            # 结果生
            dic = {
                '城市': key,
                '更新时间': time,
                '天气': weather,
                '温度': weather_l + '-' + weather_h + '摄氏度',
                '风力': wind,
                '贴示': desc,
            }
            return dic
     
     
    class Weather_UI(object):
        def __init__(self):
            self.window = Tk()
            self.weather = Weather()
     
            self.window.title(u'天气预报')
            # 设置窗口大小和位置
            self.window.geometry('310x370')
            # 创建一个文本框
            self.result_text0 = Label(self.window, text=u'学长所在城市:\n要写中文呦')
            self.result_text0.place(x=10, y=5, height=130)
            self.result_text0.bind('提示')
     
            self.result_text1 = Text(self.window, background='#ccc')
            self.result_text1.place(x=140, y=10, width=155, height=155)
            self.result_text1.bind("Key-Return>", self.submit)
     
            # 创建一个按钮
            # 为按钮添加事件
            self.submit_btn = Button(self.window,
                                     text=u'获取天气',
                                     command=self.submit)
            self.submit_btn.place(x=170, y=165, width=70, height=25)
            self.submit_btn2 = Button(self.window, text=u'清空', command=self.clean)
            self.submit_btn2.place(x=250, y=165, width=35, height=25)
     
            # 标题
            self.title_label = Label(self.window, text=u'今日天气:')
            self.title_label.place(x=10, y=165)
     
            # 结果
            self.result_text = Text(self.window, background='#ccc')
            self.result_text.place(x=10, y=190, width=285, height=165)
     
        def submit(self):
            # 从输入框获取用户输入的值
            content = self.result_text1.get(0.0, END).strip().replace("\n", " ")
     
            # 把城市信息传到爬虫函数中
            result = self.weather.crawl(content)
     
            # 将结果显示在窗口中的文本框中
            for k, v in result.items():
                self.result_text.insert(END, k + ':' + v)
                self.result_text.insert(END, '\n')
                self.result_text.insert(END, '\n')
     
        # 清空文本域中的内容
        def clean(self):
            self.result_text1.delete(0.0, END)
            self.result_text.delete(0.0, END)
     
        def run(self):
            self.window.mainloop()
     
     
    A = Weather_UI()
    A.run()
    

    到此这篇关于Python实现天气查询系统的文章就介绍到这了,更多相关Python天气查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Python脚本制作天气查询实例代码
    • python趣味挑战之爬取天气与微博热搜并自动发给微信好友
    • python制作的天气预报小工具(gui界面)
    • Python爬虫之获取心知天气API实时天气数据并弹窗提醒
    • Python天气语音播报小助手
    上一篇:Python字典和列表性能之间的比较
    下一篇:python 爬取天气网卫星图片
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Python实现天气查询软件 Python,实现,天气查询,软件,