如何用python爬取天气预报,python爬虫爬取天气预报

大家好,小编来为大家解答以下问题,python爬虫爬取天气数据讲解,python爬取天气数据生成窗口,今天让我们一起来看看吧!

准备工作

首先导入一些需要用到的库

from bs4 import BeautifulSoup #网页解析
import re	#正则表达式
import urllib.request,urllib.error #制定URL,获取网页数据

若没有所需的库命令行输入pip install 需要下载的库名,下载即可

代码分析
  1. 爬取网页

将需要爬取的网页网址保存起来,以银川为例

baseUrl="http://www.nmc.cn/publish/forecast/ANX/yinchuan.html"

将网址传入到下面的函数中,获取网页源码,返回值为字符串

#获取网页源码
def askURL(url):
    # 模拟浏览器头部信息,向服务器发送消息
    head={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}
    # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)
    request=urllib.request.Request(url,headers=head)
    html=""
    try:
        response = urllib.request.urlopen(request)
        #设置utf-8编码,防止乱码
        html = response.read().decode("utf-8")
    except urllib.error.URLError as e:
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)
    return html

此处的User-Agent获取方法为,打开浏览器进入想要爬取的页面,按下F12点击NetWork,然后F5刷新界面,会出现以下内容

在这里插入图片描述

按顺序点击,找到User-Agent,复制到代码中

在这里插入图片描述

如果不写这一段代码模拟浏览器访问网页,很多时候会被认出是爬虫然后被拒绝访问

2.解析数据

我们想要爬取的天气数据集中在这一块

在这里插入图片描述

对应HTML的标签为div class=“weatherWrap”,于是在解析时先定位到这个标签下的字符串,利用之前导入的BeautifulSoup库

soup = BeautifulSoup(html,"html.parser")
for item in soup.find_all('div',class_="weatherWrap"):  #查找符合要求的字符串,形成列表

接下来是对需要取得的详细信息的解析,这里一般用正则表达式来抓取

findDate=re.compile(r'<div class="date"> (.*?) <br/>')	#日期
findWeek=re.compile(r'<br/>(.*?) </div><div class="weathericon">')	#星期
findImage=re.compile(r'<div class="weathericon"><img src="(.*?)"/></div>')	#图片
findweather=re.compile(r'<div class="desc"> (.*?) </div><div class="windd">')	#天气
findWindDir=re.compile(r'<div class="windd"> (.*?) </div><div class="winds">')	#风向
findWind=re.compile(r'<div class="windd"> .*? </div><div class="winds"> (.*?) </div>')	#风
findTemperature=re.compile(r'<div class="tmp tmp_lte_.*?"> (.*?) </div>')	#温度

爬取后我们将数据保存在列表里返回

def getData(baseurl):
    datalist=[]
    html=askURL(baseurl)
    #解析数据
    soup = BeautifulSoup(html,"html.parser")
    for item in soup.find_all('div',class_="weatherWrap"):  #查找符合要求的字符串,形成列表
        data=[]  #保存天气的所有信息
        item=str(item)
        date=re.findall(findDate,item)[0]
        data.append(date)

        week=re.findall(findWeek,item)[0]            
        data.append(week)

        image=re.findall(findImage,item)
        data.append(image)    

        weather=re.findall(findweather,item)
        data.append(weather)

        windDir=re.findall(findWindDir,item)
        data.append(windDir)

        wind=re.findall(findWind,item)
        data.append(wind)

        temperature=re.findall(findTemperature,item)
        data.append(temperature)

        datalist.append(data)
    return datalist

至此我们想要的数据就爬取完成了,输出到文件里验证是否正确

keys = ["日期","星期","图片","天气","风向","风","温度"]
times = ["白天","晚上"]
#打印
def outPut(data):
    with open("weather.txt","w",encoding="utf-8") as f:
        for day in data:
            for info,name in zip(day,keys):
                try:
                    f.write(name+": "+info+" ")
                except:
                    for spinfo,time in zip(info,times):
                        f.write(time+name+": "+spinfo+" ")
            f.write("\n")

def main():
    baseUrl="http://www.nmc.cn/publish/forecast/ANX/yinchuan.html"
    askURL(baseUrl)
    data=getData(baseUrl)
    outPut(data)

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值