好玩的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,就是下图这样的。
下面是我爬虫的代码,就不做详细解释。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#-*- coding=utf8 -*- import sys reload(sys) sys.setdefaultencoding( "utf-8" ) import urllib2 from bs4 import BeautifulSoup import time def 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 html def 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 html def 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 text if __name__=='__main__': weather_text = weather() |
2.打开和风网站,网址是这个https://www.heweather.com,然后注册账号,找到自己的KEY,再打开这个API说明。
可以自己参考API这几种数据,我只使用的3-10天气预报和生活指数,还有天气图片。因为和风网站返回的是json格式数据,如下图。
我是使用Python做数据的解析,各种数据已经提取出来,后面都有注释,下面是代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#-*- coding=utf8 -*- import sys reload(sys) sys.setdefaultencoding( "utf-8" ) import urllib2 import json import re def 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() |
建议用python3
你去下个anaconda吧,它对python库管理特别好
我只想默默的拜读您的博客!