Python基于Requestes爬取天气信息及显示

Python基于Requestes爬取天气信息及显示

一、分为以下步骤

1.了解网页;

2.使用 requests 库抓取网站数据;

3.使用 Beautiful Soup 解析网页;

4.清洗和组织数据;

1. 模块的引入

import requests
import tkinter
from tkinter import ttk
import re
import matplotlib.pyplot as plt
from bs4 import BeautifulSoup
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

2.使用tkinter进行窗口化及显示

def UI(prcouse_dict,stert_url,url_list,city_list):
    prcouse_lsit = list(prcouse_dict.keys())
    ui =tkinter.Tk()
    ui.title("天气信息")
    ui.geometry("750x800")

    variable1 = tkinter.StringVar()
    listbox1 = ttk.Combobox(ui,width=12,textvariable = variable1)
    listbox1["values"]=prcouse_lsit
    listbox1.current(0)
    listbox1.place(relx = 0.1,rely = 0.05)

    button1 = tkinter.Button(ui,text="切换",command=lambda: getUrl_city(stert_url, url_list, city_list, variable1, prcouse_dict,listbox2,text1))
    button1.place(relx=0.3, rely=0.05)

    variable2 = tkinter.StringVar()
    listbox2 = ttk.Combobox(ui,width=12,textvariable = variable2)
    getUrl_city(stert_url, url_list, city_list, variable1, prcouse_dict,listbox2,ui)
    listbox2["values"] = city_list
    listbox2.current(0)
    listbox2.place(relx = 0.4,rely = 0.05)

    button2 = tkinter.Button(ui,text = "查看",command = lambda:getMeaage_weak(listbox2,city_list,url_list,text1,text2))
    button2.place(relx = 0.6,rely = 0.05)

    text1 = tkinter.Text(ui, bd=2, width=98, height=14)
    text1.place(relx=0.05, rely=0.15)

    text2 = tkinter.Text(ui, bd=3, width=98, height=30)
    text2.place(relx=0.05, rely=0.45)

    ui.mainloop()

3.获取网页信息

def getHtml(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134'}
    try:
        r = requests.get(url,headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print("error")

4.解析网页内容获取城市信息

def getUrl_city(stert_url,url_list,city_list,variable1,prcouse_dict,listbox2,text):
    url_list.clear()
    city_list.clear()
    stert_url = stert_url + prcouse_dict[variable1.get()] + ".shtml"
    html = getHtml(stert_url)
    soup = BeautifulSoup(html,"html.parser")
    divs = soup.findAll("div",class_="conMidtab3")
    for div in divs:
        try:
            a = div.find("a", attrs={"href": True})#当不知道标签里的具体属性值匹配是可以用True 也可以用正则表达是匹配
            if a.text in city_list:
                break
            if a.text != "详情":
                url_list.append(a.get("href"))
                city_list.append(a.text)
        except:
            print("error")
    listbox2["values"] = city_list
    listbox2.current(0)

5. 获取具体天气信息及展示天气变化

def getMeaage_weak(listbox2,city_list,url_list,text,ui):
    text.delete(0.0,tkinter.END)
    url_dict = dict(zip(city_list,url_list))
    html = getHtml(url_dict[listbox2.get()])
    soup = BeautifulSoup(html,"html.parser")
    lis = soup.find("ul",class_="t clearfix")
    days,temperature,wind,tem = [],[],[],[]
    for li in lis:
        try:
            message = str(li.text)
            message = message.replace("\n"," ")
            message = re.sub(" +"," ",message).strip()
            days.append(message.split(" ")[0])
            tem.append(message.split(" ")[1])
            temperature.append(message.split(" ")[2])
            wind.append(message.split(" ")[3])
        except:
            continue
    text.insert(tkinter.END," |".join(days))
    text.insert(tkinter.END,"\n\n\n")
    text.insert(tkinter.END," | ".join(tem))
    text.insert(tkinter.END, "\n\n\n")
    text.insert(tkinter.END," | ".join(temperature))
    text.insert(tkinter.END, "\n\n\n")
    text.insert(tkinter.END," | ".join(wind))

    maxs = []
    mins = []
    for tems in temperature:
        try:
            maxs.append(int(tems.split("/")[0].replace("℃","")))
            mins.append(int(tems.split("/")[1].replace("℃","")))
        except:
            mins.append(int(tems.split("/")[0].replace("℃","")))
            continue
    fig = plt.figure(figsize=(7, 4.5), dpi=100)
    plt.rcParams['axes.unicode_minus'] = False
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.title("未来一周的天气变化",fontsize = 24)
    plt.xlabel("时间",fontsize =12)
    plt.ylabel("温度 °C",fontsize =12)
    plt.plot(days,maxs,"r-o")
    plt.plot(days, mins, "b-o")
    plt.ylim(min(mins)-10,max(maxs)*2)
    canvs = FigureCanvasTkAgg(fig,ui)
    canvs.get_tk_widget().pack(side=tkinter.BOTTOM, fill=tkinter.BOTH)
    canvs.draw()

获取到天气信息后,使用matplotlab显示到thinker中可视化天气变化

调用实现

if __name__ == '__main__':
    prcouse_dict = {"北京": "beijing", "安徽": "anhui", "重庆": "chongqing", "福建": "fujian", "甘肃": "gansu", "广东": "guangdong",
                    "广西": "guangxi", "贵州": "guizhou", "海南": "hainan", "河北": "hebei", "河南": "henan", "湖北": "hubei",
                    "湖南": "hunan", "黑龙江": "heilongjiang", "吉林": "jilin", "江苏": "jiangsu", "江西": "jiangxi",
                    "辽林": "liaoning",
                    "内蒙古": "neimenggu", "宁夏": "ningxia", "青海": "qinghai", "山东": "shandong", "陕西": "shan-xi",
                    "山西": "shanxi",
                    "上海": "shanghai", "四川": "sichuan", "天津": "tianjin", "西藏": "xizang", "新疆": "xinjiang",
                    "云南": "yunnan",
                    "浙江": "zhejiang", "香港": "hongkong", "澳门": "macao", "台湾": "taiwan"}
    stert_url = "http://www.weather.com.cn/textFC/"
    url_list = []
    city_list = []
    UI(prcouse_dict,stert_url,url_list,city_list)

结果示例

在这里插入图片描述

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值