python爬取某地十年天气数据

想要获得一个城市的历史天气,可以在天气后报网站上查询获得
如果要通过大量历史天气数据做分析,可以通过爬虫的方式获得。 

网站:天气,天气预报查询,24小时,今天,明天,未来一周7天,10天,15天,40天查询_2345天气预报

可以查看到某个城市的历史天气信息如下图所示:

 上图就是我们要爬取的网页以及数据

这里切换年份和月份,网站的url是不会改变的,表明该网页是后台异步加载,需要进行抓包分析,点击检查点击network来到下图所示:

先不要刷新网页我们切换年份和月份试试:

 

此时可以看到 多了几行,随便点开一个查看即可:

 由于是非静态网页,爬取的时候需要设置一些参数。

在Palyload中:

 params = {
        "areaInfo[areaId]": 60295,
        "areaInfo[areaType]": 2,
        "date[year]": year,
        "date[month]": month
    }

接着是设置headers信息,伪装成一个真的用户,这里需要设置的比较多:

headers = {
        "Accept": """application/json, text/javascript, */*; q=0.01""",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Connection": "keep-alive",
        "Cookie": """lastCountyId=60295; lastCountyPinyin=yunyang; lastProvinceId=43; lastCityId=57516; Hm_lvt_a3f2879f6b3620a363bec646b7a8bcdd=1719211873,1719285452; Hm_lpvt_a3f2879f6b3620a363bec646b7a8bcdd=1719285525; lastCountyTime=1719285524""",
        "Host": "tianqi.2345.com",
        "Referer": "http://tianqi.2345.com/wea_history/60295.htm",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    }

设置好之后我们就可以试着发送请求了:

response = requests.get(url, headers=headers, params=params)
print(response.status_code)

返回值200说明响应成功,来看看我们需要的数据是什么格式:

 

可以看到我们需要的数据是一个json字典,data里面就是我们需要的数据,这部分数据是html字符串,先通过字典拿到这部分数据:

data = response.json()["data"]
print(data)

 

观察我们需要的数据发现其位于一个表格中html中td和table两个标签表示该数据是表格类型数据 

此时我们可以用pandas库来获取这部分数据:
 

df = pd.read_html(StringIO(data))[0]
print(df)

 将这部分内容写成一个函数以后我们就可以通过修改参数来实现爬取十年的天气数据:

def craw_table(month, year):
    """
    用于爬取对应的表格数据
    :param month: 月份
    :param year: 年份
    :return: 返回对应的表格数据
    """
    params = {
        "areaInfo[areaId]": 60295,
        "areaInfo[areaType]": 2,
        "date[year]": year,
        "date[month]": month
    }
    headers = {
        "Accept": """application/json, text/javascript, */*; q=0.01""",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Connection": "keep-alive",
        "Cookie": """lastCountyId=60295; lastCountyPinyin=yunyang; lastProvinceId=43; lastCityId=57516; Hm_lvt_a3f2879f6b3620a363bec646b7a8bcdd=1719211873,1719285452; Hm_lpvt_a3f2879f6b3620a363bec646b7a8bcdd=1719285525; lastCountyTime=1719285524""",
        "Host": "tianqi.2345.com",
        "Referer": "http://tianqi.2345.com/wea_history/60295.htm",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    }
    response = requests.get(url, headers=headers, params=params)
    data = response.json()["data"]
    df = pd.read_html(StringIO(data))[0]  # 这里可以获取html代码中的第一个表格
    return df

接下来就是通过循环爬取十年的天气数据,然后写入到excel表格中去:
 

import requests
import pandas as pd
from io import StringIO


def craw_table(month, year):
    """
    用于爬取对应的表格数据
    :param month: 月份
    :param year: 年份
    :return: 返回对应的表格数据
    """
    params = {
        "areaInfo[areaId]": 60295,
        "areaInfo[areaType]": 2,
        "date[year]": year,
        "date[month]": month
    }
    headers = {
        "Accept": """application/json, text/javascript, */*; q=0.01""",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Connection": "keep-alive",
        "Cookie": """lastCountyId=60295; lastCountyPinyin=yunyang; lastProvinceId=43; lastCityId=57516; Hm_lvt_a3f2879f6b3620a363bec646b7a8bcdd=1719211873,1719285452; Hm_lpvt_a3f2879f6b3620a363bec646b7a8bcdd=1719285525; lastCountyTime=1719285524""",
        "Host": "tianqi.2345.com",
        "Referer": "http://tianqi.2345.com/wea_history/60295.htm",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    }
    response = requests.get(url, headers=headers, params=params)
    data = response.json()["data"]
    df = pd.read_html(StringIO(data))[0]  # 这里可以获取html代码中的第一个表格
    return df


url = "http://tianqi.2345.com/Pc/GetHistory"
# 写一个循环嵌套爬取10年的每月的天气数据
df_list = []
for year in range(2013, 2024):
    for month in range(1, 13):
        print("爬取:", year, month)
        df = craw_table(month, year)
        # 对不同的df进行合并
        df_list.append(df)
pd.concat(df_list).to_excel("重庆云阳的十年天气数据.xlsx", index=False)  # 将爬取到的数据通过pandas库中的函数写入到excel中

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值