用Python爬虫做一个“天气预报”软件(exe可执行)

deanyuancn
发布于 2021-1-26 14:17
浏览
0收藏

0.故事背景:好久没写Python了,碰巧有位高中同学有这个“天气预报”软件相关技术的需求,

我也借此再回顾一下Python的部分知识


1.用到的技术关键词:中国天气网、爬虫、GUI、程序打包exe


2.项目前的准备:

中国天气网:http://www.weather.com.cn/
requests库:爬取中国天气网中的天气等数据。
tkinter:制作图形用户界面,从而实现更友好的输入和输出,并与接下来的打包操作结合起来。
pyInstaller:用于最终的项目打包,将py文件和依赖的环境转为一个exe文件,使之由一个脚本变成一个软件。


3.项目思路与实现:


1.首先单独写出此爬虫测试demo,根据用户输入的地区名,爬取中国天气网中对应地区的天气情况等(效果与完整代码见下)。 

import requests      

city ={'北京': '101010100',
    '济南': '101120101',
    '青岛': '101120201',
    '淄博': '101120301',
    '烟台': '101120501',
    '潍坊': '101120601',
    '曲阜': '101120710',
    '泰安': '101120801',
    '滨州': '101121101'}
  
cityname = input('输入查询城市:')
citycode = city[cityname]
url = 'http://wthrcdn.etouch.cn/weather_mini?citykey=%s'%citycode
# print('城市:{},编号:{}'.format(cityname,citycode))
# print(url)

res = requests.get(url)
info = res.json()
# print(info)
data = info['data']
weatherItems = data['forecast']
today = weatherItems[0]
city = f"【城市:{data['city']}】\n"
date = f"日期:{today['date']}\n"
now = f"实时温度:{data['wendu']}度\n"
tips = f"今日贴士:{data['ganmao']}\n"
print(city, date, now, tips)

print('【未来4日天气情况:】\n')
for today in weatherItems[1:]:
    # today = data['forecast'][0]
    date = f"日期:{today['date']}"
    temperature = f"温度:{today['high']} {today['low']}"
    weatherType = f"天气:{today['type']}"
    print('{}, {}, {}\n'.format(date, weatherType, temperature))

2.有了此核心代码,接下来将图形用户界面写出来即可(效果与完整代码见下)。用Python爬虫做一个“天气预报”软件(exe可执行)-鸿蒙开发者社区

from tkinter import *
import requests    

LOG_LINE_NUM = 0

class MY_GUI():
    def __init__(self,init_window_name):
        self.init_window_name = init_window_name

    #设置窗口
    def set_init_window(self):
        self.init_window_name.title("天气预报demo")           #窗口名
        self.init_window_name.geometry('800x500+200+50')
        #标签
        self.init_data_label = Label(self.init_window_name, text="输入城市名")
        self.init_data_label.grid(row=0, column=0)
        self.result_data_label = Label(self.init_window_name, text="天气预测结果")
        self.result_data_label.grid(row=0, column=12)
        #文本框
        self.init_data_Text = Text(self.init_window_name, width=20, height=1)  #城市名录入框
        self.init_data_Text.grid(row=1, column=0, rowspan=2, columnspan=5)
        self.result_data_Text = Text(self.init_window_name, width=70, height=30)  #处理结果展示
        self.result_data_Text.grid(row=1, column=12, rowspan=10, columnspan=10)
        #按钮
        self.str_trans_to_md5_button = Button(self.init_window_name, text="获取天气情况", bg="lightblue", width=10,command=self.str_trans_to_md5)  # 调用内部方法  加()为直接调用
        self.str_trans_to_md5_button.grid(row=1, column=11)

    #功能函数
    def str_trans_to_md5(self):

        city ={'北京': '101010100',
            '济南': '101120101',
            '青岛': '101120201',
            '武汉': '101200101'}
       
        cityname = self.init_data_Text.get(1.0,END).strip()
        print(cityname)
        citycode = city[cityname]
        url = 'http://wthrcdn.etouch.cn/weather_mini?citykey=%s'%citycode
        # print('城市:{},编号:{}'.format(cityname,citycode))
        # print(url)

        res = requests.get(url)
        info = res.json()
        # print(info)
        data = info['data']
        weatherItems = data['forecast']
        today = weatherItems[0]
        city = f"【城市:{data['city']}】\n"
        date = f"日期:{today['date']}\n"
        now = f"实时温度:{data['wendu']}度\n"
        tips = f"今日贴士:{data['ganmao']}\n"
        content_today = city + date + now + tips
        print(content_today)
        self.result_data_Text.delete(1.0,END)
        self.result_data_Text.insert(1.0,content_today)
        self.result_data_Text.insert(5.0,'\n【未来4日天气情况:】\n')
        forecastItems = ""
        for today in weatherItems[1:]:
            date = f"日期:{today['date']}"
            temperature = f"温度:{today['high']} {today['low']}"
            weatherType = f"天气:{today['type']}"
            print('{}, {}, {}\n'.format(date, weatherType, temperature))
            content_four_days = date + weatherType + temperature + '\n'
            print(content_four_days)
            print(type(content_four_days))
            forecastItems += content_four_days
        self.result_data_Text.insert(8.0, forecastItems)


def gui_start():
    init_window = Tk()              #实例化出一个父窗口

    ZMJ_PORTAL = MY_GUI(init_window)
    
    ZMJ_PORTAL.set_init_window()    # 设置根窗口默认属性

    init_window.mainloop()          #父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示


gui_start()

3.用pyInstaller将此py文件打包成exe可执行文件,用命令行py文件工作目录下输入:pyinstaller -F -w userGUI.py (userGUI.py为此文件名称,-w选项可以避免在打开exe时弹出命令行界面而影响用户体验),在工作目录下的dist目录中即可找到生成的exe文件。用Python爬虫做一个“天气预报”软件(exe可执行)-鸿蒙开发者社区用Python爬虫做一个“天气预报”软件(exe可执行)-鸿蒙开发者社区打开后就可以正常使用了,也可以传给未装Python环境的朋友用。

用Python爬虫做一个“天气预报”软件(exe可执行)-鸿蒙开发者社区

4.附阿里云镜像下载Python库的方法:


pip install 库名 -i https://mirrors.aliyun.com/pypi/simple

分类
已于2021-1-26 14:17:18修改
收藏
回复
举报
回复
    相关推荐