21. 用API爬取天气预报数据
21.1 注册免费API和阅读文档
本节通过一个API接口(和风天气预报)爬取天气信息,该接口为个人开发者提供了一个免费的预报数据(有次数限制)。
首先访问和风天气网,注册一个账户。注册地址:https://console.heweather.com/
- 在登陆后的控制台中可以看到个人认证的key(密钥),这个key就是访问API接口的钥匙。
- 获取key之后阅读API文档:https://www.heweather.com/documents/api/s6
21.2 提取全国城市信息
- 通过API接口提取
3181
个城市信息。URL地址:https://cdn.heweather.com/china-city-list.txt
# 从网上读取城市列表信息,并使用正则将数据解析出来。
import requests
import re
# 爬取城市信息列表
url = "https://cdn.heweather.com/china-city-list.txt"
res = requests.get(url)
data = res.content.decode('utf-8')
# 使用换行符拆分出每一条城市信息数据
dlist = re.split('[\n\r]+',data)
# 剔除前两条无用的数据
for i in range(2):
dlist.remove(dlist[0])
# 输出城市信息条数
print(len(dlist))
# 输出前20条信息
for i in range(20):
#使用空白符拆分出每个字段信息
item = re.split("\s+",dlist[i])
#输出
#print(item)
print(item[0],":",item[2])
21.3 获取指定城市的天气信息
- 抓取指定城市天气信息
import requests
import time
#爬取指定城市的天气信息
url = "https://free-api.heweather.com/s6/weather?location=北京&key=a46fd5c4f1b54fda9ee71ba6711f09cd"
res = requests.get(url)
time.sleep(2)
#解析json数据
dlist = res.json()
data = dlist['HeWeather6'][0]
#输出部分天气信息
print("城市:",data['basic']['location'])
print("今日:",str(data['daily_forecast'][0]['date']))
print("温度:",data['daily_forecast'][0]['tmp_min'],"~",data['daily_forecast'][0]['tmp_max'])
print(data['daily_forecast'][0]['cond_txt_d']," ~ ",data['daily_forecast'][0]['cond_txt_n'])
print(data['daily_forecast'][0]['wind_dir'],data['daily_forecast'][0]['wind_sc'],'级')
- 输出结果:
城市: 北京
今日: 2018-06-13
温度: 18 ~ 28
雷阵雨 ~ 多云
东北风 1-2 级
21.4 综合实例
- 获取城市信息,并通过信息获取对应的天气信息。
# 从网上读取城市列表信息,并遍历部分城市信息,从API接口中爬取天气信息。
import requests
import re
import time
# 爬取城市信息列表
url = "https://cdn.heweather.com/china-city-list.txt"
res = requests.get(url)
data = res.content.decode('utf-8')
# 使用换行符拆分出每一条城市信息数据
dlist = re.split('[\n\r]+',data)
# 剔除前两条无用的数据
for i in range(2):
dlist.remove(dlist[0])
# 输出城市信息条数
print(len(dlist))
# 输出前10条信息
for i in range(10):
#使用空白符拆分出每个字段信息
item = re.split("\s+",dlist[i])
#输出
#print(item)
#print(item[0],":",item[2])
#爬取指定城市的天气信息
url = "https://free-api.heweather.com/s6/weather?location=%s&key=a46fd5c4f1b54fda9ee71ba6711f09cd"%(item[0])
res = requests.get(url)
time.sleep(2)
#解析json数据
datalist = res.json()
data = datalist['HeWeather6'][0]
#输出部分天气信息
print("城市:",data['basic']['location'])
print("今日:",str(data['daily_forecast'][0]['date']))
print("温度:",data['daily_forecast'][0]['tmp_min'],"~",data['daily_forecast'][0]['tmp_max'])
print(data['daily_forecast'][0]['cond_txt_d']," . ",data['daily_forecast'][0]['cond_txt_n'])
print(data['daily_forecast'][0]['wind_dir'],data['daily_forecast'][0]['wind_sc'],'级')
print("="*70)
- 结果:
3181
城市: 北京
今日: 2018-06-13
温度: 18 ~ 28
雷阵雨 . 多云
东北风 1-2 级
======================================================================
城市: 海淀
今日: 2018-06-14
温度: 18 ~ 30
多云 . 多云
南风 1-2 级
======================================================================
城市: 朝阳
... ...