Python3爬虫、数据清洗与可视化实战之用API爬取天气预报数据

注册免费API和阅读技术文档

示例接口为和风天气的天气预报,该网站为个人开发者提供免费的预报数据(有访问次数限制)。
注册地址:http://console.heweather.com
注册后在控制台可以看到个人认证的key(密钥),这个key是访问API的钥匙。
文档地址:https://dev.heweather.com/docs/api/weather
免费版接口地址:https://free-api.heweather.net/s6/weather/{weather-type}?{parameters}
可以看出这里有两个参数:
(1):{weather-type}代表不同的天气数据类型,必选,请使用以下值替代:

weather-type值 描述 授权
now 实况天气 商业/免费
forecast 3-10天预报 商业/免费
hourly 逐小时预报 商业/免费
lifestyle 生活指数 商业/免费

(2):{parameters}代表请求参数,包括必选和可选参数。所有请求参数均使用 &进行分隔,参数值存在中文或特殊字符的情况,需要对参数进行 url encode。
请求参数:

参数 描述 选择 示例值
location 需要查询的城市或地区,可以输入以下值:1.城市ID。2.经纬度格式:经度,纬度(经度在前纬度灾后,英文,分隔,十进制格式,卑微东经为正,南纬西经为负)3.城市名称,支持中英文和汉语拼音4.城市名称,上级城市或省或国家,英文,分隔,此方式可以字啊重名的情况下只获取想要的地区的天气数据,例如 西安,陕西 5.IP 6.根据请求自动判断,根据用户的请求获取IP,通过IP定位并获取城市数据 必选 1.location=CN101010100 2.LOCATION=116.40,39.9 3.location=北京、location=北京市、location=beijing 4.location=朝阳,北京、location=chaoyang,beijing 5.location=60.194.130.1 6.location=auto_ip
lang 多语言,可以不使用该参数,默认为简体中文,海外城市默认为英文 可选 lang=en
unit 单位选择,公制(m)或英制(i),默认为公制单位 可选 unit=i
key 用户认证key,支持数字签名方式进行认证 必选 key=xxxxxxxxxxxxxxxx

根据API,组合接口地址:
实况天气:
https://free-api.heweather.net/s6/weather/now?location=chongqing&key=daea278878a9498298ce1d125a81562e
3-10天天气预报:
https://free-api.heweather.net/s6/weather/forecast?location=chongqing&key=daea278878a9498298ce1d125a81562e
只要编写代码访问接口地址,就可以返回数据。服务器返回的数据是JSON格式的数据,也就是Python中的字典。

通过预读城市代码内容,可以知道API提供了3240个城市的天气预报。
城市代码可以拷贝到本地文件,也可以通过requests.get()直接从网上获取。https://a.hecdn.net/download/dev/china-city-list.csv

获取API数据

从网上读取数据的第一步是获取城市列表,然后根据城市列表循环,代码如下:

import requests


url = 'https://a.hecdn.net/download/dev/china-city-list.csv'
strhtml = requests.get(url)
data = strhtml.text
data1 = data.split("\n")
for i in range(3):
    data1.remove(data1[0])
for item in data1:
    print(item[0:11])

完成了城市编码提取后,下一步就是调用接口获取数据,代码如下:

import requests
import time


url = 'https://a.hecdn.net/download/dev/china-city-list.csv'
strhtml = requests.get(url)
data = strhtml.text
data1 = data.split("\n")
for i in range(3):
    data1.remove(data1[0])
for item in data1:
    url = 'https://free-api.heweather.net/s6/weather/forecast?location=' + item[0:11] + '&key=daea278878a9498298ce1d125a81562e'
    strhtml = requests.get(url)
    time.sleep(1)
    print(strhtml.text)

数据以JSON格式返回,每一个城市/地区都是一个JSON
如果要将返回的JSON数据解析出来,可以使用for循环语句。

import requests
import time


url = 'https://a.hecdn.net/download/dev/china-city-list.csv'
strhtml = requests.get(url)
data = strhtml.text
data1 = data.split("\n")
for i in range(3):
    data1.remove(data1[0])
for item in data1:
    url = 'https://free-api.heweather.net/s6/weather/forecast?location=' + item[0:11] + '&key=daea278878a9498298ce1d125a81562e'
    strhtml = requests.get(url)
    time.sleep(1)
    dic = strhtml.json()
for item in dic["HeWeather6"][0]["daily_forecast"]:
    print(item["tmp"]["max"])

使用JSON在线结构化工具观察数据结构,网址如下:
http://www.json.org.cn/tools/JSONEditorOnline/index.htm

通过观察路径,3天的预报数据是在[HeWeather6][0][daily_forecast]
下面,由[0]、[1]和[2]这3个数据节点分别存放3天的数据,而每天的最高温度是在[HeWeather6][0][daily_forecast][n][tmp][max]路径下,其中[n]表示分节点[0]、[1]、[2]。
requests库返回的数据可以编码成JSON格式的数据,只有JSON对象才可以使用上面分析的路径,表现方式如下:
strhtml.json()

存储数据到MongoDB

mongoDB是一个基于分布式文件存储的数据库,由C++编写,皆在为web应用提供可扩展的高性能数据存储解决方案。
mongoDB是一个介于关系数据库和非关系数据库之间的产品,它在非关系数据库中功能最丰富、最像关系数据库。

下载并安装MongoDB

  1. 下载MongoDB
    官网下载:https://www.mongodb.com/download-center#community

下载安装包之后直接打开运行
在这里插入图片描述

一直执行Next下一步,当进入这个界面的时候,下面的√一定要去掉,不然会安装的特别的慢,如果不去掉,可能要等几个小时以上
在这里插入图片描述

环境变量配置:将MongoDB的bin目录加入环境变量中。
2. 配置本地MongoDB
创建数据库文件的存放位置
在你data的目录下,创建一个db文件 如:G:\mongodb\data\db
因为启动mongodb服务之前需要必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功
启动MongoDB服务
打开cmd命令行,进入安装目录的bin目录中,输入如下命令启动MongoDB,mongod --dbpath g:\mongodb\data\db
在浏览器输入http://localhost:27017,如果在浏览器中出现下面一段英文说明成功了
在这里插入图片描述

输入: mongod -dbpath “g:\mongodb\data\db” -logpath “g:\mongodb\data\log\mongo.log” -install -serviceName “MongoDB”

在PyCharm中安装Mongo Plugin

在PyCharm中的菜单,依次选择“File”→“settings”→“plugins”选择marketplace,在搜索框中输入mongo,然后选择Monogo Plugin,选择安装,安装好后重启P有Charm,就可以在右侧看到Mongo Explorer.
在这里插入图片描述
在Mongo Servers设置窗口中单击左侧加号按钮(addServer)
在这里插入图片描述
输入连接名,然后单击“Test Connection”(测试连接)按钮,提示信息为“Connection test successful”时表示连接正常,然后单击OK按钮,保存设置即可。

将数据存入MongoDB

为python安装mongo库支持pymongo
pip install pymongo

import requests
# 加载pymongo库
import pymongo
import time

# 建立连接
client = pymongo.MongoClient('localhost', 27017)
# 在MongoDB中新建名为weather的数据库
book_weather = client['weather']
# 在weater库中新建名为sheet_weather_3的表
sheet_weather = book_weather['sheet_weather_3']
url = 'https://a.hecdn.net/download/dev/china-city-list.csv'
strhtml = requests.get(url)
data = strhtml.text
data1 = data.split("\n")
for i in range(3):
    data1.remove(data1[0])
for item in data1:
    url = 'https://free-api.heweather.net/s6/weather/forecast?location=' + item[
        0:11] + '&key=daea278878a9498298ce1d125a81562e'
    strhtml = requests.get(url)
    time.sleep(1)
    dic = strhtml.json()
    # 向表写入一条数据
    sheet_weather.insert_one(dic)
# for item in dic["HeWeather6"][0]["daily_forecast"]:
#    print(item["tmp"]["max"])

MongoDB数据库查询

基于3.3节的结果,查询重庆的天气数据,代码如下:

import pymongo


client = pymongo.MongoClient('localhost', 27017)
book_weather = client['weather']
sheet_weather = book_weather['sheet_weather_3']
# 查找键HeWeather6.basic.city值为重庆的数据
for item in sheet_weather.find({'HeWeather6.basic.location': '重庆'}):
    print(item)

接下来查询天气最低气温大于5摄氏度的城市名,代码如下:

import pymongo

client = pymongo.MongoClient('localhost', 27017)
book_weather = client['weather']
sheet_weather = book_weather['sheet_weather_3']
for item in sheet_weather.find():
    # 因为数据需要3天的天气预报,因此循环3次
    for i in range(3):
        tmp = item['HeWeather6'][0]['daily_forecast'][i]['tmp_min']
        # 使用update方法,将表中最低气温数据修改为数值型
        sheet_weather.update_one({'_id': item['_id']}, {
            '$set': {
                'HeWeather6.0.daily_forecast.{}.tmp_min'.format(i): int(tmp)
            }
        })
# 提取出最低气温低于5摄氏度的城市
for item in sheet_weather.find(
    {'HeWeather6.daily_forecast.tmp_min': {
        '$gt': 5
    }}):
    print(item['HeWeather6'][0]['basic']['location'])

这里第一个参数是{'_id': item['_id']},表示要更新的查询条件,对应_id字段。
第二个参数表示要更新的信息,$set是MongoDB中的一个修改器,用于指定一个键并更新键值,若键不存在则创建一个键。
除此之外,常用修改器还有incinc、unset、$push等。

  • 修改器$i 可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减操作。
  • 修改器$unset 用于删除键。
  • 修改器$push 向文档的某个数组类型的键添加一个数组元素,不过滤重复的数据。添加时,若键存在,要求键值类型必须是数组;若键不存在,则创建数组类型的键。

代码中ltlt、lte、gtgt和gte,分别表示符号<、<=、>和>=

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章