天气预报爬虫

2024-09-05 03:44
文章标签 爬虫 天气预报

本文主要是介绍天气预报爬虫,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、获取天气接口

主要通过nowapi注册用户之后,进入相应的接口,进行抓取报文。

二、wireshark抓取报文,解析cjson格式

Http的交互过程

1.建立TCP连接

2.发送HTTP请求报文

3.回复HTTP响应报文

4.断开TCP连接

CJSON的使用办法

1. JSON与cJSON
JSON —— 轻量级的数据格式
 JSON 全称 JavaScript Object Notation,即 JS对象简谱,是一种轻量级的
数据格式。
它采用完全独立于编程语言的文本格式来存储和表示数据,语法简洁、层
次结构清晰,易于人阅读和编写,同时也易于机器解析和生成,有效的提
升了网络传输效率。

2、CJSON的语法

构清晰,易于人阅读和编写,同时也易于机器解析和生成,有效的提
升了网络传输效率。
JSON语法规则

  • JSON对象是一个无序的"名称/值"键值对的集合:
  • 以"{“开始,以”}"结束,允许嵌套使用;
  • 每个名称和值成对出现,名称和值之间使用":"分隔;
  • 键值对之间用","分隔
  • 在这些字符前后允许存在无意义的空白符;
  • 对于键值,可以有如下值:
  • 一个新的json对象
  • 数组:使用"[“和”]"表示
  • 数字:直接表示,可以是整数,也可以是浮点数
  • 字符串:使用引号"表示
  • 字面值:false、null

3、CJOSN的解析

解析方法
解析JSON数据的过程,其实就是剥离一个一个链表节点(键值对)的过程。
解析方法如下:
① 创建链表头指针:
cJSON* cjson_test = NULL;
② 解析整段JSON数据,并将链表头结点地址返回,赋值给头指针:
解析整段数据使用的API只有一个:
(cJSON *) cJSON_Parse(const char *value);
③ 根据键值对的名称从链表中取出对应的值,返回该键值对(链
表节点)的地址
(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * 
const string);
④ 如果JSON数据的值是数组,使用下面的两个API提取数据:
(int) cJSON_GetArraySize(const cJSON *array);
(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);

三、设计框架

3.2、设计思路

了解服务器断口的http请求的基本格式之后,充当客户端,对该服务器进行请求,服务器对发送的报文,进行回发,我们只需将从服务器爬虫下来的数据进行解析即可。 

四、函数接口

4.1、命令接口

接口

参数

返回值

接口描述

void menu1(void)

0

菜单函数

int clink(const char *ip,const char *port)

Ip和端口号

fd

建立连接

void recieve(char *choice,char *buf,int fd,char *p)

选择的模式,城市,fd,堆空间

0

发送报文和接收服务器报文

void stime(char *p)

堆空间

0

实时时间

void fweek(char *p)

堆空间

0

未来世界

Break

8

0

退出

4.2、查看对应城市的天气

接口名称

参数说明

返回值

接口描述

Scanf(“%s”,&a)

传递指针数组的首地址

0

输入城市名

4.3、 查询实时天气 

接口名称

参数说明

返回值

接口描述

void stime(char *p)

堆空间的首地址

0

用来显示实时天气

4.4、查询未来天气

接口名称

参数说明

返回值

接口描述

voidfweek(char*p)

传递管道文件描述符

0

用来给mpalyer发送停止信息

五、函数的封装与代码实现

 5.1、主函数

/*************************************************************************> File Name: main.c> Author: yas> Mail: rage_yas@hotmail.com> Created Time: Sat 24 Aug 2024 05:01:26 PM************************************************************************/#include<stdio.h>
#include"menu.h"
#include"send.h"
#include<stdlib.h>
#include<string.h>
#include <unistd.h>int main(int agrc,char *agrv[])
{int a;char city[10] = {0};int ret;char *p = (char *)malloc(1024*1024*3);menu();printf("输入城市名称:");scanf("%s",city);while(1){menu1();scanf("%d",&a);if(a == 2){char choice[] = "app=weather.today";ret = clink("103.205.5.228","80");recieve(choice,city,ret,p);// seto(p,ret);stime(p,ret);}else if(a == 3){char choice[] = "app=weather.future";ret = clink("103.205.5.228","80");memset(p,0,3*1024*1024);recieve(choice,city,ret,p);//seto(q,ret);fweek(p,ret);}else if(a == 4){break;}}free(p);return 0;
}

5.2、菜单栏

#include<stdio.h>
void menu(void)
{printf("+-----------------------+\n");printf("|1.配置城市             |\n");printf("|2.查看实时天气         |\n");printf("|3.查看未来一周天气     |\n");printf("|4.退出                 |\n");printf("|                       |\n");printf("+-----------------------+\n");
}

5.3、发送报文

 

/*************************************************************************> File Name: send.c> Author: yas> Mail: rage_yas@hotmail.com> Created Time: Sun 25 Aug 2024 02:27:12 PM************************************************************************/#include<stdio.h>
#include<head.h>
#include<string.h>
#include<cJSON.h>
#include <unistd.h>
void menu1(void)
{printf("----------选择模式--------------\n");printf("2.查看实时天气                  \n");printf("3.查看未来天气                  \n");printf("4.退出                          \n");printf("-------------------------------\n");
}
int clink(const char *ip,const char *port)
{int fd = socket(AF_INET,SOCK_STREAM,0);if(fd < 0)handle_error_ret("socket fail");struct sockaddr_in seraddr;memset(&seraddr,0,sizeof(seraddr));seraddr.sin_family = AF_INET;seraddr.sin_addr.s_addr = inet_addr(ip);seraddr.sin_port = htons(atoi(port));if(connect(fd,(const struct sockaddr *)&seraddr,sizeof(seraddr)) < 0)handle_error_ret("connect_server fail");return fd;
}
void recieve(char *choice,char *buf,int fd,char *p)
{char buf1[1024] = {0};int i = 0;sprintf(buf1,"GET /?%s&weaid=%s&appkey=73824&sign=800f3bbca4119c9624422f593f4caa36&format=json HTTP/1.1\r\n",choice,buf);char * buf2[] = {"Host: api.k780.com\r\n","User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0\r\n","Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\n","Accept-Language: en-US,en;q=0.5\r\n","Accept-Encoding: gzip, deflate\r\n","Connection: close\r\n","Upgrade-Insecure-Requests: 1\r\n\r\n",NULL};write(fd,buf1,strlen(buf1));while(buf2[i] != NULL){write(fd,buf2[i],strlen(buf2[i]));++i;}while(1){char buf3[1024] = {0};int ret =read(fd,buf3,sizeof(buf3)-1);if(ret <= 0){break;}strcat(p,buf3);}
}
void stime(char *p,int fd)
{char *q = index(p,'{');cJSON* cjson_test = NULL;cJSON* cjson_result = NULL;cJSON* cjson_result_humidity = NULL;cJSON* cjson_result_temp_high = NULL;cJSON* cjson_result_temp_low = NULL;cJSON* cjson_result_temperature_curr = NULL;cJSON* cjson_result_humi_high = NULL;cJSON* cjson_result_humi_low = NULL;cJSON* cjson_result_weather_curr = NULL;cJSON* cjson_result_wind = NULL;cjson_test = cJSON_Parse(q);if(cjson_test == NULL){perror("parse fail");}cjson_result = cJSON_GetObjectItem(cjson_test,"result");cjson_result_humidity = cJSON_GetObjectItem(cjson_result,"humidity");cjson_result_temperature_curr = cJSON_GetObjectItem(cjson_result,"temperature_curr");cjson_result_temp_high = cJSON_GetObjectItem(cjson_result,"temp_high");cjson_result_temp_low = cJSON_GetObjectItem(cjson_result,"temp_low");cjson_result_humi_high = cJSON_GetObjectItem(cjson_result,"humi_high");cjson_result_humi_low = cJSON_GetObjectItem(cjson_result,"humi_low");cjson_result_weather_curr = cJSON_GetObjectItem(cjson_result,"weather_curr");cjson_result_wind = cJSON_GetObjectItem(cjson_result,"wind");printf("湿度     %.0f\n",cjson_result_humidity->valuedouble);printf("温度     %s\n",cjson_result_temperature_curr->valuestring);printf("最高温度 %d\n",cjson_result_temp_high->valueint);printf("最低温度 %d\n",cjson_result_temp_low->valueint);printf("最高湿度 %d\n",cjson_result_humi_high->valueint);printf("最低湿度 %d\n",cjson_result_humi_low->valueint);printf("天气     %s\n",cjson_result_weather_curr->valuestring);printf("风力     %s\n",cjson_result_wind->valuestring);cJSON_Delete(cjson_test);close(fd);
}
void fweek(char *p,int fd)
{cJSON* cjson_test = NULL;cJSON* cjson_result = NULL;char *q = index(p,'{');//printf("-----------------------\n%s----------------\n",q);cjson_test = cJSON_Parse(q); if(cjson_test == NULL){printf("-------");perror("parsier error");}cjson_result = cJSON_GetObjectItem(cjson_test,"result");if(cjson_result == NULL){perror("result");}int Arrlen = cJSON_GetArraySize(cjson_result);for(int i = 0;i < Arrlen;++i){cJSON* SubObj = cJSON_GetArrayItem(cjson_result,i);if(NULL == SubObj){perror("erro");continue;}if(cJSON_GetObjectItem(SubObj,"weaid") == NULL){perror("fai;");return ;}if(cJSON_GetObjectItem(SubObj,"week") == NULL){perror("fail1");return;// printf("星期 %s\n", cJSON_GetObjectItem(SubObj,"week")->valuestring);}if(cJSON_GetObjectItem(SubObj,"temperature") == NULL){perror("fail1");return ;//printf("温度 %s\n", cJSON_GetObjectItem(SubObj,"temperature")->valuestring);}if(cJSON_GetObjectItem(SubObj,"humidity") == NULL){perror("fail1");return;//printf("湿度 %.0f\n", cJSON_GetObjectItem(SubObj,"humidity")->valuedouble);}if(cJSON_GetObjectItem(SubObj,"temp_high") == NULL){perror("faili2");return;//printf("星期 %d\n", cJSON_GetObjectItem(SubObj,"temp_high")->valueint);}if(cJSON_GetObjectItem(SubObj,"temp_low") == NULL){perror("fail3");return;// printf("星期 %d\n", cJSON_GetObjectItem(SubObj,"temp_low")->valueint);}if(cJSON_GetObjectItem(SubObj,"humi_high") == NULL){perror("fail4");return;// printf("星期 %d\n", cJSON_GetObjectItem(SubObj,"humi_high")->valueint);}if(cJSON_GetObjectItem(SubObj,"humi_low") == NULL){perror("fail5");return ;//printf("星期 %d\n", cJSON_GetObjectItem(SubObj,"humi_low")->valueint);}if(cJSON_GetObjectItem(SubObj,"weather") == NULL){perror("fail6");return ;// printf("星期 %s\n", cJSON_GetObjectItem(SubObj,"weather")->valuestring);}if(cJSON_GetObjectItem(SubObj,"wind") == NULL){perror("fail7");return;//printf("星期 %s\n", cJSON_GetObjectItem(SubObj,"wind")->valuestring);}printf("星期 %s\n温度 %s\n湿度%.0f\n最高温度%d\n最低温度%d\n最高湿度%d\n最低湿度%d\n天气%s\n风力%s\n",cJSON_GetObjectItem(SubObj,"week")->valuestring,cJSON_GetObjectItem(SubObj,"temperature")->valuestring,cJSON_GetObjectItem(SubObj,"humidity")->valuedouble,cJSON_GetObjectItem(SubObj,"temp_high")->valueint,cJSON_GetObjectItem(SubObj,"temp_low")->valueint,cJSON_GetObjectItem(SubObj,"humi_high")->valueint,cJSON_GetObjectItem(SubObj,"humi_low")->valueint,cJSON_GetObjectItem(SubObj,"weather")->valuestring,cJSON_GetObjectItem(SubObj,"wind")->valuestring);}//  cJSON_Delete(cjson_test);close(fd);
}

六、实现效果展示

 

 

这篇关于天气预报爬虫的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137866

相关文章

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使

Golang网络爬虫框架gocolly/colly(四)

爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟。回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫,那时由于项目需要,要访问各大国际社交网站,Facebook,myspace,filcker,youtube等等,国际上叫得上名字的社交网站都爬过,大部分网站提供restful api,有些功能没有api,就只能用http抓包工具分析协议,自己爬;国内的优酷、

Golang网络爬虫框架gocolly/colly(三)

熟悉了《Golang 网络爬虫框架gocolly/colly 一》和《Golang 网络爬虫框架gocolly/colly 二》之后就可以在网络上爬取大部分数据了。本文接下来将爬取中证指数有限公司提供的行业市盈率。(http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio) 定义数据结构体: type Zhj

014.Python爬虫系列_解析练习

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

urllib与requests爬虫简介

urllib与requests爬虫简介 – 潘登同学的爬虫笔记 文章目录 urllib与requests爬虫简介 -- 潘登同学的爬虫笔记第一个爬虫程序 urllib的基本使用Request对象的使用urllib发送get请求实战-喜马拉雅网站 urllib发送post请求 动态页面获取数据请求 SSL证书验证伪装自己的爬虫-请求头 urllib的底层原理伪装自己的爬虫-设置代理爬虫coo

Python 爬虫入门 - 基础数据采集

Python网络爬虫是一种强大且灵活的工具,用于从互联网上自动化地获取和处理数据。无论你是数据科学家、市场分析师,还是一个想要深入了解互联网数据的开发者,掌握网络爬虫技术都将为你打开一扇通向丰富数据资源的大门。 在本教程中,我们将从基本概念入手,逐步深入了解如何构建和优化网络爬虫,涵盖从发送请求、解析网页结构到保存数据的全过程,并讨论如何应对常见的反爬虫机制。通过本教程,你将能够构建有效的网络爬

0基础学习爬虫系列:网页内容爬取

1.背景 今天我们来实现,监控网站最新数据爬虫。 在信息爆炸的年代,能够有一个爬虫帮你,将你感兴趣的最新消息推送给你,能够帮你节约非常多时间,同时确保不会miss重要信息。 爬虫应用场景: 应用场景主要功能数据来源示例使用目的搜索引擎优化 (SEO)分析关键词密度、外部链接质量等网站元数据、链接提升网站在搜索引擎中的排名市场研究收集竞品信息、价格比较电商网站、行业报告制定更有效的市场策略舆情

0基础学习爬虫系列:程序打包部署

1.目标 将已经写好的python代码,打包独立部署或运营。 2. 环境准备 1)通义千问 :https://tongyi.aliyun.com/qianwen 2)0基础学习爬虫系列–网页内容爬取:https://blog.csdn.net/qq_36918149/article/details/141998185?spm=1001.2014.3001.5502 3. 步骤 1)不知道