天气查询 API 接口

中国天气网提供 3 个 API 接口,以北京为例:

http://m.weather.com.cn/data/101010100.html
http://weather.com.cn/data/sk/101010100.html
http://weather.com.cn/data/cityinfo/101010100.html

直接访问这 3 个 Web API 即可返回对应城市的天气信息,返回的是 JSON 格式数据。(第一个访问不了 -’’-)

后面的数字是城市代码,如果想查询其他城市的天气情况,只需要更换为对应的城市代码即可。那怎么知道城市代码呢?我这里有一份中国天气网城市代码文档。城市代码由 9 位数字组成,按照长度可以分为如下四个部分:
101(国家代号)01(省级行政区)01(二级地区)00(三级地区)101(国家代号)01(省级行政区)01(二级地区)00(三级地区) 101(国家代号)01(省级行政区)01(二级地区)00(三级地区)
比如,北京市海淀区是 101010200,广州是 101280101,台北是 101340101。


http://weather.com.cn/data/sk/101010100.html 返回的 JSON 数据:

{"weatherinfo":{"city":"北京","cityid":"101010100","temp":"27.9","WD":"南风","WS":"小于3级","SD":"28%","AP":"1002hPa","njd":"暂无实况","WSE":"<3","time":"17:55","sm":"2.1","isRadar":"1","Radar":"JC_RADAR_AZ9010_JB"}
}

http://weather.com.cn/data/cityinfo/101010100.html 返回的 JSON 数据:

{"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"18℃","temp2":"31℃","weather":"多云转阴","img1":"n1.gif","img2":"d2.gif","ptime":"18:00"}
}

请求与响应

为方便起见,我们设置一个输入框获取城市代码,设置一个按钮触发查询请求,然后将实时气温显示在下面。

Show the code !

【头文件】

#ifndef MAINWIDGET_H
#define MAINWIDGET_H#include <QWidget>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>namespace Ui {class MainWidget;
}class MainWidget : public QWidget
{Q_OBJECTpublic:explicit MainWidget(QWidget *parent = 0);~MainWidget();private slots:void slotReadyRead();void downloadFinished();void replyFinished(QNetworkReply *reply);void on_pushButton_clicked();private:Ui::MainWidget *ui;QNetworkAccessManager *manager;QNetworkReply *reply;
};#endif // MAINWIDGET_H

【源文件】

#include "mainwidget.h"
#include "ui_mainwidget.h"#include <QTextCodec>MainWidget::MainWidget(QWidget *parent) :QWidget(parent),ui(new Ui::MainWidget)
{ui->setupUi(this);this->setWindowTitle(tr("天气查询"));manager = new QNetworkAccessManager(this);connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}MainWidget::~MainWidget()
{delete ui;
}void MainWidget::on_pushButton_clicked()
{qDebug() << "clicked";QNetworkRequest request;request.setUrl(QUrl(QString("http://weather.com.cn/data/sk/%1.html").arg(ui->lineEdit->text())));/* Set header */request.setRawHeader(QByteArray("User-Agent"), QByteArray("Mozilla/5.0"));/* Auto redirect */request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);reply = manager->get(request);connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));connect(reply, SIGNAL(finished()), this, SLOT(downloadFinished()));
}void MainWidget::slotReadyRead()
{qDebug() << "ready";
}void MainWidget::downloadFinished()
{qDebug() << "download";reply->deleteLater();
}void MainWidget::replyFinished(QNetworkReply *reply)
{qDebug() << "reply";/* Get http status code */QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);if(statusCode.isValid()) {qDebug() << "status code:" << statusCode.toInt();}QVariant reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute);if(reason.isValid()) {qDebug() << "reason:" << reason.toString();}QNetworkReply::NetworkError err = reply->error();if(err != QNetworkReply::NoError) {qDebug() << "Failed:" << reply->errorString();}else {QByteArray bytes = reply->readAll();QString string = QString::fromUtf8(bytes);qDebug() << string;}
}

输入 101010100,点击查询按钮,可以看到终端打印如下:

需要特别注意的是,由于请求发生重定向,所以一定要加上这行代码,设置自动跳转,否则会返回 302。

/* Auto redirect */
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);

解析 JSON 数据

创建函数 parseFromJson 用于读取、解析 JSON 数据,并在 TextBrowser 中直接显示出来。

void parseFromJson(const QString &jsonStr);

具体代码实现如下:

void MainWidget::parseFromJson(const QString &jsonStr)
{QJsonParseError err;QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8(), &err);if(err.error != QJsonParseError::NoError) {qDebug() << "Parsed error";return;}QJsonObject obj = doc.object();if(obj.contains(QLatin1Literal("weatherinfo"))) {qDebug() << "Parsing";QJsonObject subObj = obj.value("weatherinfo").toObject();QString city = subObj["city"].toString();QString temp = subObj["temp"].toString();QString WD = subObj["WD"].toString();QString WS = subObj["WS"].toString();QString time = subObj["time"].toString();ui->textBrowser->setText(QString("城市:%1\n气温:%2\n风向:%3\n风速:%4\n时间:%5").arg(city).arg(temp).arg(WD).arg(WS).arg(time));}
}

运行程序,输入城市代码,查询… 如下:

OK,你学会了吗?

Qt5获取并解析中国天气网数据相关推荐

  1. Android解析中国天气网的Json数据

    在Android开发中.一般的APP都是通过获取server端的数据来更新UI.从server获取到的数据能够是Json.它的数据量要比XML要小,这里解析中国天气网上获取的数据,尽管已经不再更新了. ...

  2. 爬虫实战——中国天气网数据

    这次的爬虫主要目的就是爬取当日中国天气网的即时气候数据.我位于苏州所以爬取的是苏州7月19号的天气. 首先,使用的是beautifulsoup和xpath解析库,因为是纯练习性质,所以分别解析了两趟, ...

  3. 解析中国天气网页面获取七日天气 (Java, Python)

    说明 解析中国天气网的页面,获取七日天气. 使用 htmlparser .这是它的 API 文档. 代码 SevenDayWeather.java 1 import java.io.BufferedR ...

  4. R语言rvest包3步爬取中国天气网国内所有城市(县)7天实时天气预报数据

    接上一篇用R语言爬取中国天气网单个城市的7天实时天气预报数据,这篇文章综合一下,使用R语言rvest包3步爬取中国天气网国内所有城市(县)7天实时天气预报数据,这里的步数跨度可能有点长,但思路确实是3 ...

  5. 分享中国天气网的接口

    http://m.weather.com.cn/data/101010100.html 注意:1.101010100是北京的代号,想查询你的城市,请看更改城市代号,网上百度一大堆 2.不要丢掉.htm ...

  6. android往天气接口里面传城市,Android使用中国天气网API数据通过城市名称获取天气情况...

    项目要求在应用首页面展示本地当日天气的概况,首先想到的是google和雅虎,前者很久之前接触过,听说后来用不了了,后者由于邮箱事件的缘故个人不喜欢(虽然貌似苹果也用雅虎的天气预报),之后又想到了前段时 ...

  7. 最新!中国天气网api接口调用,key获取方式,数据请求秘钥获取,城市id获取方法

    以前的天气获取方式已经不支持了,虽然能获取到数据,但是获取到的信息已经不对了. 中国天气网提供的最新接口需要数据请求秘钥key.而且有效期只有7天,用完了还要重新购买,很麻烦,但是获取到的内容绝对是最 ...

  8. python爬虫获取中国天气网天气数据 requests BeautifulSoup re

    python获取中国天气网天气数据:http://www.weather.com.cn/textFC/henan.shtml main.py # -*- coding: utf-8 -*- impor ...

  9. 中国天气网api接口调用,key获取方式,数据请求秘钥获取,城市id获取方法

    以前的天气获取方式已经不支持了,虽然能获取到数据,但是获取到的信息已经不对了. 中国天气网提供的最新接口需要数据请求秘钥key.而且有效期只有7天,用完了还要重新购买,很麻烦,但是获取到的内容绝对是最 ...

最新文章

  1. ubuntu18.04.4 安装百度硬盘
  2. 0708---oop学习--用户密码管理
  3. jpa 测试_使用外星人进行测试:如何使用Arquillian测试JPA类型转换器
  4. 解决鼠标滚动的时候多次执行函数
  5. AVR单片机项目教程 基于C语言,AVR单片机项目教程:基于C语言(第2版)
  6. 计算机体检作用,QQ电脑管家什么是电脑体检?有什么作用?
  7. 电脑中病毒以后,如何删掉右键残留的菜单
  8. 语音预处理之分帧加窗
  9. 计算机类毕业设计评语导师评语,毕业设计导师评语
  10. 在64位win7上面卸载IE8
  11. Processing绘制随风飘扬的名画
  12. maven html项目自动版本控制(时间戳) com.google.code.maven-replacer-plugin插件 前端代码自动添加版本号
  13. 定时任务:springboot集成Quartz实现多任务多触发的动态管理
  14. fortigate防火墙虚拟机版本的使用
  15. 漫威所有电影的 按时间线的观影顺序
  16. 认知神经心理学(各种生理心理效应)
  17. window.open与window.showModalDialog的分析
  18. 微软发补丁解决0x0000003B蓝屏死机
  19. 探讨浏览器指纹(科普)
  20. (附源码)计算机毕业设计ssm二手书交易软件设计与实现

热门文章

  1. iOS 添加微信分享sdk流程
  2. 微信群视频代理服务器,在微信群里发大于20M的视频,方法竟然这么简单
  3. Spark基础练习系列
  4. 如何写一个bat批处理自动上传文件到FTP 转载
  5. 2023新年祝福代码[css动画特效]
  6. Nature :读博之前应该知道的二十件事情
  7. 数据预处理之白化(Whitening transformation)
  8. 2.9亿元信托财产“原状返还” ,信托公司“去通道”还要走多久?
  9. ILOG CPLEX OPL 编程手册,使用心得与简单例子
  10. android contacts电话查询头像,Androidの通过查询电话号码或ID获取联系人头像