更多技术文章请访问我的个人博客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 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做数据的解析,各种数据已经提取出来,后面都有注释,下面是代码
#-*- 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()