【开发总结】用Python爬虫做一个“天气预报”软件(exe可执行)

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.有了此核心代码,接下来将图形用户界面写出来即可(效果与完整代码见下)。

在这里插入图片描述

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环境的朋友用。

在这里插入图片描述

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

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

  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,我可以帮你解答这个问题。 首先,你需要爬取天气预报的数据。你可以选择使用第三方的天气API,也可以直接爬取天气网站的数据。这里以爬取中国天气网(http://www.weather.com.cn/)的数据为例。 1. 安装依赖库 你需要安装 requests 和 beautifulsoup4 两个库来实现爬虫功能。如果你还没有安装,可以使用 pip install requests 和 pip install beautifulsoup4 命令进行安装。 2. 分析网页结构 在爬取网页数据之前,需要先分析网页的结构。通过查看源代码或使用开发者工具,我们可以找到需要爬取的数据所在的 HTML 标签和 CSS 类名。 例如,如果我们想要获取北京的天气预报,可以访问这个链接:http://www.weather.com.cn/weather/101010100.shtml。在这个页面中,北京的天气信息被包含在一个 id 为“7d”的 div 标签中。我们可以使用 BeautifulSoup 库来解析 HTML 页面,找到这个 div 标签,然后获取其中的数据。 3. 编写代码 接下来,我们来编写代码实现天气预报功能。你可以将代码保存为一个.py 文件,然后使用 PyInstaller 等工具将其打包成可执行文件。 ```python import requests from bs4 import BeautifulSoup def get_weather(city_code): url = 'http://www.weather.com.cn/weather/{}.shtml'.format(city_code) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.content, 'html.parser') weather_div = soup.find(id='7d') if weather_div: ul = weather_div.find('ul') li_list = ul.find_all('li') print('城市:', li_list[0].text) print('天气:', li_list[1].text) print('温度:', li_list[2].text) print('风力:', li_list[3].text) print('空气质量:', li_list[7].text) if __name__ == '__main__': city_code = '101010100' # 北京的城市代码 get_weather(city_code) ``` 在这个代码中,我们定义了一个 get_weather 函数,它接受一个城市代码作为参数。函数中,我们首先构造了天气预报网页的链接,然后发送 HTTP 请求,获取网页的 HTML 内容。接着,我们使用 BeautifulSoup 库解析 HTML 页面,找到 id 为“7d”的 div 标签,然后获取其中的 ul 和 li 标签中的数据。最后,我们打印出城市、天气、温度、风力和空气质量等信息。 你可以根据自己的需要对代码进行修改和优化,以实现更加完善的天气预报功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超周到的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值