好玩的API调用之---天气预报的API调用与爬虫

来源:互联网 发布:陈怡馨被迷 知乎 编辑:程序博客网 时间:2024/06/11 03:15

更多技术文章请访问我的个人博客http://www.rain1024.com

好玩的API调用之—天气预报的API调用与爬虫

平时写程序经常需要用到一些服务,像翻译,天气预报,星座什么的,我一般都是用Python写个爬虫去提供这些服务的网站爬数据,但是有些网站对爬虫有很多限制,一些关键字会定时更改,就像中国天气网经常变更HTML标签的class值,这就需要时常维护爬虫,而聚合数据API只对普通用户提供一个免费API接口,简直垃圾,而网上的一些网站其实有开放的API供开发者调用,所以我想着把自己发现的好玩的API和自己写的爬虫写个博客专题供大家参考,我会继续补充和维护。

第四个专题是关于天气预报的API调用与爬虫,聚合数据里的天气预报接口还收费,真是lj,我一开始用爬虫爬中国天气网里的数据进行分析,后来发现了和风天气这个良心网站,不仅提供免费的接口,而且天气预报数据也很多很丰富。今天就写中国天气网的爬虫和和风天气的api调用。

1.中国天气网的网址http://www.weather.com.cn/,先在里面找到自己的城市,然后把网址复制下来,就像我的是呼和浩特市http://www.weather.com.cn/weather1d/101080101.shtml,就是下图这样的。

下面是我爬虫的代码,就不做详细解释。

#-*- coding=utf8 -*-import sysreload(sys)sys.setdefaultencoding( "utf-8" )import urllib2from bs4 import BeautifulSoupimport timedef download(url,headers):    try:        request = urllib2.Request(url,headers=headers)        html = urllib2.urlopen(request).read()        # html = urllib2.urlopen(url).read()    except urllib2.URLError as e:        print "error"        print e.code   #可以打印出来错误代号如404。        print e.reason  #可以捕获异常        html = None    return htmldef save(html):    f = open('thefile.txt', 'w')    f.write(html)    f.close()def read_file():    f = open('thefile.txt', 'r')    html = f.read()    f.close()    return htmldef get_html(url):    User_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'    headers = {'User_agent': User_agent}    html = download(url, headers)    save(html)def weather():    url = 'http://www.weather.com.cn/weather/101080101.shtml'    get_html(url)    html = read_file()    soup = BeautifulSoup(html)    text = ""    text = text + "明天的天气是:" + soup.find('li', class_='sky skyid lv1').p.string + "\n"    text = text + "最高温度:" + soup.find('li', class_='sky skyid lv1').span.string + "最低温度:" + soup.find('li',                                                                                                      class_='sky skyid lv1').i.string + "\n"    # print soup.find('li',class_='sky skyid lv2').p.string    # print soup.find('li',class_='sky skyid lv2').span.string    # print soup.find('li',class_='sky skyid lv2').i.string    html = soup.find('li', class_='sky skyid lv1')    html2 = soup.find_all('div', class_='hide')[1]    soup = BeautifulSoup(str(html))    text = text + "明天的风是:" + soup.find_all('i')[1].string + '\n'    # print soup.find_all('i')[1].string    soup = BeautifulSoup(str(html2))    text = text + "而紫外线指数是:" + soup.find_all('span')[0].string + "  建议:" + soup.find_all('p')[0].string + '\n'    text = text + "当然还有感冒指数:" + soup.find_all('span')[1].string + "  建议:" + soup.find_all('p')[1].string + '\n'    text = text + "最后是穿衣指数:" + soup.find_all('span')[2].string + "  " + soup.find_all('p')[2].string + '\n'     # print soup.find_all('span')[1].string    # print soup.find_all('span')[0].string    # print soup.find_all('p')[0].string    return textif __name__=='__main__':    weather_text = weather()

2.打开和风网站,网址是这个https://www.heweather.com,然后注册账号,找到自己的KEY,再打开这个API说明。

可以自己参考API这几种数据,我只使用的3-10天气预报和生活指数,还有天气图片。因为和风网站返回的是json格式数据,如下图。


我是使用Python做数据的解析,各种数据已经提取出来,后面都有注释,下面是代码

#-*- coding=utf8 -*-import sysreload(sys)sys.setdefaultencoding( "utf-8" )import urllib2import jsonimport redef download(url):    html = urllib2.urlopen(url)    return html.read()def weather():    # all全部的天气数据    all_url = 'https://free-api.heweather.com/v5/weather?city=CN101080101&key=5c043b56de9f4371b0c7f8bee8f5b75e'    # 3天预报    forecast_url = 'https://free-api.heweather.com/v5/forecast?city=CN101080101&key=5c043b56de9f4371b0c7f8bee8f5b75e'    #生活指数    sugg_url = 'https://free-api.heweather.com/v5/suggestion?city=CN101080101&key=5c043b56de9f4371b0c7f8bee8f5b75e'    # 天气图标    photo_url = 'https://cdn.heweather.com/cond_icon/100.png'    #天气情况的内容提取------------开始    html = download(forecast_url)    max_tmp = re.findall('max":"(.*?)"', html)[0]  #最高温度    min_tmp = re.findall('min":"(.*?)"', html)[0]  #最低温度    photo = re.findall('code_d":"(.*?)"', html)[0] #天气图片    txt_d = re.findall('txt_d":"(.*?)"', html)[0] #天气情况    dir = re.findall('dir":"(.*?)"', html)[0]  # 风向    sc = re.findall('sc":"(.*?)"', html)[0]  # 风力    print max_tmp,min_tmp,photo,txt_d,dir,sc    #生活指数等内容的提取-----------开始    html = download(sugg_url)    brf = re.findall('brf":"(.*?)"', html)    txt = re.findall('txt":"(.*?)"', html)    comf_brf = brf[0]#舒适度指数    comf_txt = txt[0]    cw_brf = brf[1]#洗车指数    cw_txt = txt[1]    drsg_brf = brf[2]#穿衣指数    drsg_txt = txt[2]    flu_brf = brf[3]#感冒指数    flu_txt = txt[3]    sport_brf = brf[4]#运动指数    sport_txt = txt[4]    trav_brf = brf[5]#旅游指数    trav_txt = txt[5]    uv_brf = brf[6]# 紫外线指数    uv_txt = txt[6]    print comf_brf,comf_txt    print cw_brf,cw_txt    print drsg_brf,drsg_txt    print flu_brf,flu_txt    print sport_brf,sport_txt    print trav_brf,trav_txt    print uv_brf,uv_txt    # brf = brf[0].decode('utf-8')    # dict_html = dict(result)    # print dict_html    #json格式无法提取    # json_html = json.loads(html)    # print json_html    # html = str(json_html['HeWeather5'])    # json_html = json.loads(html)    # print json_html['basic']def main():    weather()if __name__ == "__main__":    main()

数据处理以后的效果

最后还有webServer也提供服务,但需要注册,返回的数据也没有和风天气返回的数据丰富,所以我没使用,有兴趣的可以参考。这是网址http://webservice.36wu.com/weatherService.asmx

更多技术文章请访问我的个人博客http://www.rain1024.com

0 0
原创粉丝点击