2021年4月历史天气数据爬取获得的csv文件

2021年4月历史天气数据爬取获得的csv文件

历史天气查询推荐 这个网站。以深圳为例,对 2021 年 4 月的历史天气数据进行查询沈阳历史天气,可访问 深圳 2021-4 该链接2021年4月历史天气数据爬取获得的csv文件,天气数据显示如下图所示。气温、天气的文字描述、风速及风向、湿度、气压数据比较完备,能见度仅部分时间段给出。

想要大规模爬取的话,需要自己写爬虫,我之前写过一个爬取深圳市数据的爬虫。对深圳市的天气数据爬取基本没有问题。

import requests
import demjson
import re
import calendar
import csv
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36\
         (KHML, like Gecko) Chrome/52.0.2743.116 Safari/537.36',
}
def get_url(date):
    url = 'https://www.timeanddate.com/scripts/cityajax.php?n=china/shenzhen&mode=historic'
    url += '&hd=' + date
    url += '&month=' + str(int(date[4:6]))
    url += '&year=' + date[:4] + '&json=1'
    return url
# input: type(str) eg:'20170601'
def crawl_single_day(date):
    response = requests.get(get_url(date), headers=headers)
    response_list = demjson.decode(response.text)
    for weather in response_list:
        w_time = re.compile(r'^\d+:\d+').search(weather['c'][0]['h']).group(0)
        w_temperature = re.compile(
            r'^-?\d+').search(weather['c'][2]['h']).group(0)
        w_weather = re.compile(
            r'^(.*?)\.').search(weather['c'][3]['h']).group(1)
        if weather['c'][4]['h'] == 'No wind':
            w_wind_speed = '0'
        else:
            w_wind_speed = re.compile(
                r'^\d+').search(weather['c'][4]['h']).group(0)
        w_wind_direction = re.compile(
            r'title=\"(.*?)\"').search(weather['c'][5]['h']).group(1)
        w_humidity = weather['c'][6]['h']
        w_barometer = re.compile(r'^\d+').search(weather['c'][7]['h']).group(0)
        w_visibility = weather['c'][8]['h']
        if w_visibility != 'N/A':
            w_visibility=re.compile(r'^\d+').search(w_visibility).group(0)
        yield [date, w_time, w_temperature, w_weather, w_wind_speed, w_wind_direction,
               w_humidity, w_barometer, w_visibility]
# input: type(int) eg: year=2017, month=6
def crawl_single_month(year, month):
    _, num_day = calendar.monthrange(year, month)
    month_str = str(year)
    if month < 10:
        month_str += '0' + str(month)
    else:
        month_str += str(month)
    day_list = list(range(1, num_day + 1))
    for day in day_list:
        if day < 10:
            for weather in crawl_single_day(month_str + '0' + str(day)):
                yield weather
        else:
            for weather in crawl_single_day(month_str + str(day)):
                yield weather
if __name__ == "__main__":
    with open('weather0.csv', 'w', encoding='utf-8', newline='') as file:
        writer = csv.writer(file)
        writer.writerow('date time temperature weather wind_speed wind_direction humidity barometer visibility'.split())
        
        for month in range(7, 13):
            writer.writerows(crawl_single_month(2017, month))
    with open('weather1.csv', 'w', encoding='utf-8', newline='') as file:
        writer = csv.writer(file)
        writer.writerow('date time temperature weather wind_speed wind_direction humidity barometer visibility'.split())
        writer.writerows(crawl_single_day('20210401'))

对 的深圳天气数据爬取获得的 csv 文件如下图所示

该 程序仅实现了爬取深圳市指定一天或者一个月的函数沈阳历史天气,有需求的话可以自己扩充。

2021年4月历史天气数据爬取获得的csv文件

如要爬取其他城市,可以尝试将 () 函数中 url 的初始值中城市名称进行修改,譬如爬取沈阳市修改为

url = 'https://www.timeanddate.com/scripts/cityajax.php?n=china/shenyang&mode=historic'

2021年4月历史天气数据爬取获得的csv文件

这个修改因为访问相应 url 返回数据可能存在格式上的差异导致不成功(主要是答主目前没兴趣修改去保证兼容,熟悉爬虫的同学可以自己修改)沈阳历史天气,北京市的部分天气数据该程序修改后爬取就没有成功。

另外2021年4月历史天气数据爬取获得的csv文件,该网站上不同城市天气数据的时间间隔存在差异,深圳市我看到的数据基本上是以一小时作为时间间隔,而沈阳市是半小时作为间隔。

标签ad报错:该广告ID(4)不存在。

随便看看