阅读前特殊说明

  • 由于和风天气预报属第三方服务提供商,API地址,文档以及技术架构等可能会因时间而更改,由此可能会造成博文出现错误,因此本文仅供阅读参考
  • 具体使用请具体参考官方文档
  • API的数据获取是爬虫中最简单的一个环节

注册免费API和阅读文档

  • 本节通过一个API接口(和风天气预报)爬取天气信息,该接口为个人开发者提供了一个免费的预报数据(有次数限制)
  • 首先访问和风天气网,注册一个账户。注册地址:https://id.heweather.com/register
  • 在登陆后的控制台中可以看到个人认证的key(密钥),这个key就是访问API接口的钥匙
  • 获取key之后阅读API文档:https://dev.heweather.com/docs/api/

提取全国城市信息

  • 通过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])

获取指定城市的天气信息

  • 此文档:https://dev.heweather.com/docs/api/weather
  • 免费获取天气信息接口地址:https://api.heweather.net/s6/weather/now?location=beijing&key=xxx
  • 抓取指定城市天气信息
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 级

综合实例

  • 获取城市信息,并通过信息获取对应的天气信息
# 从网上读取城市列表信息,并遍历部分城市信息,从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])
    #爬取指定城市的天气信息 注意填写自己真实的key值
    url = "https://free-api.heweather.com/s6/weather?location=%s&key=your-key"%(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 级
======================================================================
城市: 朝阳
... ...