You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
3.4 KiB

import os
import tkinter as tk
from tkinter import simpledialog
from ttkbootstrap import Style
import requests
from lxml import etree
import csv
# 保持原有get_data函数不变
def get_data(city, year_month):
url = f"https://lishi.tianqi.com/{city}/{year_month}.html"
weather_info = []
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0"
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # 检查请求是否成功
html = etree.HTML(response.text)
thrui_list = html.xpath("//ul[@class='thrui']/li")
for li in thrui_list:
day_weather_info = {}
day_weather_info['day_time'] = li.xpath("./div[1]/text()")[0].split(" ")[0]
high = li.xpath("./div[2]/text()")[0].split(" ")[0]
day_weather_info['high'] = high[:high.find('C')]
low = li.xpath("./div[3]/text()")[0].split(" ")[0]
day_weather_info['low'] = low[:low.find('C')]
day_weather_info['weather'] = li.xpath("./div[4]/text()")[0]
day_weather_info['wind'] = li.xpath("./div[5]/text()")[0]
weather_info.append(day_weather_info)
except requests.RequestException as e:
print(f"请求错误:{e}")
return weather_info
# 添加一个简单的城市中文到英文映射表
city_to_english = {
"长沙": "changsha",
"株洲": "zhuzhou",
"湘潭": "xiangtan",
"衡阳": "hengyang",
"邵阳": "shaoyang",
"岳阳": "yueyang",
"常德": "changde",
"张家界": "zhangjiajie",
"益阳": "yiyang",
"郴州": "chenzhou",
"永州": "yongzhou",
"怀化": "huaihua",
"娄底": "loudi",
# 添加更多城市...
}
def on_submit(city_entry):
city = city_entry.get()
if city in city_to_english:
city = city_to_english[city]
else:
result_label.config(text=f"未找到城市 {city} 对应的英文映射,请输入正确的城市名")
return
weathers = []
for month in range(1, 13):
weather_time = "2023" + ('0' + str(month) if month < 10 else str(month))
weather = get_data(city, weather_time)
weathers.extend(weather)
with open(f'{city}天气.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(["日期", "最高气温", "最低气温", "天气", "风向/风速"])
for day_weather in weathers:
writer.writerow(list(day_weather.values()))
result_label.config(text=f"{city}的天气数据已成功保存至'{city}天气.csv'")
def main():
global result_label
root = tk.Tk()
# # 置顶栏
# music_path = os.path.join(os.path.abspath("__try__"), "安河桥.mp3")
# play_music(music_path)
root.title("天气数据爬取工具")
root.geometry("600x400+100+100")
tk.Label(root, text="请输入城市名:", font=("Arial", 14, "bold"), pady=10).pack()
city_entry = tk.Entry(root, font=("Arial", 14, "bold"), relief="flat")
city_entry.pack()
style = Style()
style = Style(theme='yeti')
submit_button = tk.Button(root, text="提交", width=8, command=lambda: on_submit(city_entry))
submit_button.pack()
result_label = tk.Label(root, text="")
result_label.pack()
root.mainloop()
if __name__ == "__main__":
main()