中秋佳節(jié)以到,不知道各位小伙伴兒有沒(méi)有想好去哪里玩呢。不過(guò)說(shuō)實(shí)在的,每到節(jié)假日,到處都是人山人海,那句“我動(dòng)也不能動(dòng)”,還不時(shí)的出現(xiàn)在我的耳畔呢。

但是又說(shuō)回來(lái),假期出游,除了人的因素外,天氣的因素是不是也要考慮下呢,今天,我們就帶大家來(lái)看看,中秋小長(zhǎng)假,哪些地方適宜出游。

獲取數(shù)據(jù)

數(shù)據(jù)的獲取,就從中國(guó)天氣網(wǎng)站上直接抓取,網(wǎng)絡(luò)上的一些 API,有的信息不是很全,只能獲取最近3天的數(shù)據(jù),有的又需要付費(fèi),還不如自己抓來(lái)的痛快。

http://www.weather.com.cn/weather15d/10124020102A.shtml

網(wǎng)站也沒(méi)有做什么限制,我們抓數(shù)據(jù)的時(shí)候,只需要控制好訪問(wèn)頻率,不要影響人家的正常運(yùn)行就可以。

同時(shí)還需要準(zhǔn)備四個(gè)數(shù)據(jù)文件

  • 省會(huì)城市列表,provincial_capital
  • 全國(guó)城市 id 信息表,china-city-list.csv
  • 著名景點(diǎn)名稱列表,attractions
  • 全國(guó)景點(diǎn) id 信息表,china-scenic-list.txt

抓取的過(guò)程不再詳細(xì)說(shuō)明了,直接給出完整代碼

            
              # coding = utf-8
"""
@author: zhou
@time:2019/9/5 14:36
@File: main.py
"""

import requests
from bs4 import BeautifulSoup
import time
import os

def get_data(name, city, code):
    print("正在下載城市%s的數(shù)據(jù)" % city)
    url = 'http://www.weather.com.cn/weather15d/%s.shtml' % code[2:]
    res = requests.get(url).content.decode()
    content = BeautifulSoup(res, "html.parser")
    weather_list = content.find('ul', attrs={'class': 't clearfix'}).find_all('li')
    items = map(parse_item, weather_list)
    save_to_csv(name, city, items)
    time.sleep(1)

def parse_item(item):
    time = item.find('span', attrs={'class': 'time'}).text
    wea = item.find('span', attrs={'class': 'wea'}).text
    tem = item.find('span', attrs={'class': 'tem'}).text
    wind = item.find('span', attrs={'class': 'wind'}).text
    wind_level = item.find('span', attrs={'class': 'wind1'}).text
    result = {
        "time": time,
        "wea": wea,
        "tem": tem,
        "wind": wind,
        "wind_level": wind_level
    }
    return result

def save_to_csv(name, city, data):
    if not os.path.exists('%s_data.csv' % name):
        with open('%s_data.csv' % name, 'a+', encoding='utf-8') as f:
            f.write('city,time,wea,tem,wind,wind_level\n')
            for d in data:
                try:
                    row = '{},{},{},{},{},{}'.format(city,
                                                     d['time'],
                                                     d['wea'],
                                                     d['tem'],
                                                     d['wind'],
                                                     d['wind_level'])
                    f.write(row)
                    f.write('\n')
                except:
                    continue
    else:
        with open('%s_data.csv' % name, 'a+', encoding='utf-8') as f:
            for d in data:
                try:
                    row = '{},{},{},{},{},{}'.format(city,
                                                     d['time'],
                                                     d['wea'],
                                                     d['tem'],
                                                     d['wind'],
                                                     d['wind_level'])
                    f.write(row)
                    f.write('\n')
                except:
                    continue

if __name__ == '__main__':
    import pandas as pd
    provincial = pd.read_csv('provincial_capital')
    china_city_code = pd.read_csv('china-city-list.csv')
    china_scenic_code = pd.read_csv('china-scenic-list.txt', sep='\t')
    china_scenic_code.columns = ['ID', 'name', 'area', 'provincial']
    attraction = pd.read_csv('attractions')
    provincial_data = pd.DataFrame()
    attraction_data = pd.DataFrame()

    # 省會(huì)抓取
    for i in provincial['city'].values.tolist():
        for j in china_city_code['City_CN'].values.tolist():
            if j == i:
                provincial_data = pd.concat([china_city_code[china_city_code['City_CN'] == j], provincial_data])

    for city in provincial_data['City_CN'].values.tolist():
        city_id = provincial_data[provincial_data['City_CN'] == city]['City_ID'].values.tolist()[0]
        get_data('weather', city, city_id)

    # 景點(diǎn)抓取
    for a in attraction['attractions'].values.tolist():
        for c in china_scenic_code['name'].values.tolist():
            if c == a:
                attraction_data = pd.concat([china_scenic_code[china_scenic_code['name'] == c], attraction_data])

    for attrac in attraction_data['name'].values.tolist():
        city_id = attraction_data[attraction_data['name'] == attrac]['ID'].values.tolist()[0]
        get_data('attraction', attrac, city_id)
            
          

省會(huì)天氣分析

我們首先來(lái)看看省會(huì)天氣,畢竟省會(huì)城市是每個(gè)省份的中心,也是旅游的重點(diǎn)城市。

降水和溫度

對(duì)于降水的概率,我采取的是如果預(yù)報(bào)是有雨,則設(shè)置降水概率為80,如果是預(yù)報(bào)是晴,則降水概率為20.

            
              weather_dict = {
    "snow": 100,
    "rain": 80,
    "cloud": 50,
    "overcast": 60,
    "sun": 20
}
            
          

在中秋節(jié)這一天,各個(gè)省會(huì)城市的降水和溫度

能夠看出,大部分城市在這一天都是天公不作美的,降水的概率都非常的大。而溫度的話,大概率降水的城市,溫度都不是很高,早晚出行,可能還會(huì)很涼哦。溫度最高的應(yīng)該就是南昌了,還能達(dá)到30°C,一個(gè)艷陽(yáng)高照的日子,是不是去看看革命圣地?

接下來(lái)我們?cè)偻ㄟ^(guò)一個(gè)雙軸圖來(lái)更加直觀的查看下降水和溫度的情況

Python 分析天氣,告訴你中秋應(yīng)該去哪里_第1張圖片

看來(lái)在進(jìn)入9月之后,全國(guó)普遍的溫度都在慢慢回落了,溫度適宜出行,但是就是會(huì)伴隨著綿綿的細(xì)雨呀。

再來(lái)看下幾大城市在中秋前后一周的天氣情況

北京

Python 分析天氣,告訴你中秋應(yīng)該去哪里_第2張圖片

北京的氣溫還是比較平穩(wěn)的,沒(méi)有太大的波動(dòng),可能早晚一件薄外套就能hold的住,不過(guò)這幾天,應(yīng)該都會(huì)是陰蒙蒙的,不會(huì)有太好的陽(yáng)光。

上海

Python 分析天氣,告訴你中秋應(yīng)該去哪里_第3張圖片

上海的降水概率要比北京大一些,不過(guò)溫度倒是相差不多。

杭州

Python 分析天氣,告訴你中秋應(yīng)該去哪里_第4張圖片

杭州的平均溫度還是要高一些,降水的概率也較高,畢竟典型的東南沿海城市嘛,雨天的西湖,你期待不?

成都

Python 分析天氣,告訴你中秋應(yīng)該去哪里_第5張圖片

成都基本天天下雨了,那還出門看大熊貓嘛,這是個(gè)問(wèn)題啊!

著名景區(qū)天氣

下面我們?cè)賮?lái)看看一些著名景區(qū)的天氣情況,我大好河山,景區(qū)太多了,只能簡(jiǎn)單列舉一些最著名的地方來(lái)看看了。

降水情況

在我選取的這些景區(qū)當(dāng)中,大部分都是會(huì)有降水的,不過(guò)也會(huì)有陽(yáng)光明媚的地方。

比如說(shuō)黃山和八達(dá)嶺長(zhǎng)城,預(yù)計(jì)會(huì)是晴天,去爬爬長(zhǎng)城和黃山,是不錯(cuò)的選擇。
而美麗的九寨溝和西湖等,雖說(shuō)會(huì)下雨,但是在雨天漫步,也不失為一種情趣吧。

降水和溫度

我們?cè)賮?lái)看看各地的溫度情況

不知道為啥承德的溫度會(huì)那么低,感覺(jué)去避暑已經(jīng)不太合適了,而長(zhǎng)白山已經(jīng)只有7°C了,慌不慌?

降水與溫度分布

降水

Python 分析天氣,告訴你中秋應(yīng)該去哪里_第6張圖片

進(jìn)入9月,東南沿海降水明顯增多,京津地區(qū)也是陰雨連綿,這是一場(chǎng)秋雨一場(chǎng)寒的節(jié)奏嗎!

溫度

Python 分析天氣,告訴你中秋應(yīng)該去哪里_第7張圖片

東南半壁,溫度還是比較適宜的,現(xiàn)在的天氣下,不冷不熱,正是出游好溫度。

好了,今天的分析就到這里了,那么,你中秋節(jié)最終的選擇是哪里呢?

源碼地址

https://github.com/zhouwei713/data_analysis/tree/master/weather