下载wyoming大学的探空数据

水平有限,欢迎指正交流,共同进步!

俄怀明大学将全球探空站的数据共享使用,并通过计算了很多的变量指数.非常有用,近期有这方面的需求,暂时写了一段未经优化的代码下载.
如果要大量下载可以尝试代理池1或者代理池2的方式,通过代理和各种规避反扒措施来抓取.



import os
import datetime
import requests
from io import StringIO
import numpy as np
import pandas as pd
from bs4 import BeautifulSoup
import calendar
import random
# url = http://weather.uwyo.edu/cgi-bin/sounding?region=naconf&TYPE=TEXT%3ALIST&YEAR=2018&MONTH=07&FROM=0312&TO=0312&STNM=72558
# http://weather.uwyo.edu/cgi-bin/sounding?region=seasia&TYPE=TEXT%3ALIST&YEAR=2018&MONTH=07&FROM=0312&TO=0312&STNM=54511

USER_AGENTS = ["Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)", "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
               "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)", ]


def main(start_date, end_date, sta_id=54511):
    pass
    # now_date = datetime.date(year, month, 1)
    allmonths = pd.date_range(start_date, end_date, freq='m')
    # print(allmonths)
    for idate, vdate in enumerate(allmonths.astype(object)):
        handle_html(vdate.year, vdate.month)
        print('搞定这个时间了:--->>>', vdate)


def set_url(date, sta_id):
    dayNums = calendar.monthrange(date.year, date.month)[1]
    return 'http://weather.uwyo.edu/cgi-bin/sounding?region=seasia&TYPE=TEXT%3ALIST&YEAR={year}&MONTH={month:4s}&FROM=0100&TO={day_end}12&STNM={sta_id}'.format(
        year=date.year,
        month=str(date.month).zfill(2),
        day_end=dayNums,
        sta_id=str(sta_id)
    )


def handle_html(year, month, sta_id=54511):
    now_date = datetime.date(year, month, 1)
    urls = set_url(now_date, sta_id)
    header = {'User-Agent': random.choice(USER_AGENTS)}
    # print(random.choice(USER_AGENTS))
    content = requests.get(urls, headers=header).content
    # print(content)
    soup_html(content)


def soup_html(html_page):
    soup = BeautifulSoup(html_page)
    headers_1 = soup.find_all('h2')
    details_data = soup.find_all('pre')
    d1s = details_data[::2]
    d2s = details_data[1::2]
    headers_2 = soup.find_all('h3')
    for iheader, vheader in enumerate(headers_1):
        convert_one_time(vheader, d1s[iheader], d2s[iheader])


def convert_one_time(h1,  d1, d2, filedir=None):
    h1_list = h1.string.split()
    obser_time = pd.to_datetime(
        ' '.join([i for i in h1_list[-4:]]), format='%HZ %d %b %Y')
    if filedir is None:
        filedir = os.path.join(homedir, 'data', obser_time.strftime('%Y%m'))
        if not os.path.exists(filedir):
            try:
                os.makedirs(filedir)
            except:
                pass
    # h1 = '_'.join([i for i in h1.string.split()])
    filename1 = 'sounding_details_{}_{}.csv'.format(
        h1_list[1], obser_time.strftime('%Y%m%d%H'))
    filename2 = 'sounding_indices_{}_{}.csv'.format(
        h1_list[1], obser_time.strftime('%Y%m%d%H'))

    detail_data = pd.read_fwf(
        StringIO(d1.string.replace('-', '')),
        widths=[7 for _ in range(11)],  skiprows=[1, 4]
    )
    detail_data.columns = [
        '{}_{}'.format(i, j) for i, j in zip(detail_data.iloc[0], detail_data.iloc[1])
    ]
    detail_data.drop([0, 1], axis=0, inplace=True)
    detail_data.to_csv(os.path.join(filedir, filename1), index=False)

    index_data = pd.read_csv(
        StringIO(d2.string), delimiter=':', names=['variable', 'value']).T
    
    index_data.columns = index_data.iloc[0]
    index_data.drop(['variable'], axis=0, inplace=True)
    index_data.to_csv(os.path.join(filedir, filename2), index=False)

if __name__ == '__main__':
    homedir = os.path.dirname(os.path.realpath(__file__))
    print(homedir)
    datadir = os.path.join(homedir, 'data')
    if not os.path.exists(datadir):
        try:
            os.makedirs(datadir)
        except:
            pass
    # main('2000-01-01', '2018-07-01')

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,091评论 25 707
  • 早加餐:棉花糖午加餐:棒子,三文鱼饭团 参考目标: 1份肉2份豆制品3份“新鲜”水果4份谷物/薯5份蔬菜,深绿色叶...
    静趣_儿童心理师阅读 523评论 0 0
  • #版权归作者所有,任何形式转载请联系作者。 大学开始之初,带着激动兴奋的心情来到了我的学校。尽管地处偏僻,但它依旧...
    林叶A阅读 229评论 0 5
  • 我恰好17岁,正好情窦初开的年纪,可能是太过于懵懂了吧,我也很懵懵懂懂,就像白色栀子花摇曳着,隐隐约约,影影绰...
    4642c4b63201阅读 636评论 0 2