##天气预报爬虫 项目

//主要功能 #include "head.h"
#include "cJSON.h"void FunWeather(void);
void RecvSendWeather(void);
int RealTimeWeather(void);
int CreateTcpClient(char *p,int port);
int SendHttpRequest(int sockfd,char *q);
void RecvSendWeather(void);char city[256] = {0};
int sockfd = 0;typedef struct media
{int id;char menulist[512];//菜单名字的长度
}MEDIA_CFG_S;typedef struct menuinfo
{int id;int pos_start;int pos_end;int focus;}MENU_CFG_S;MEDIA_CFG_S medialist[32]=
{{1,"选择城市"},               {2,"实时天气"},               {3,"未来天气"},               {4,"历史天气"},               {5,"退出"},               
};int pos_start=0;		//界面起始位置
int pos_end = 4;	//界面结束位置
int focus;			//界面焦点位置void PrintfMenu(void)
{int i =0;printf("+-----------------------------+\n");printf("|---------天气预报系统--------|\n");for(i = pos_start;i<= pos_end;i++){if(i == focus){printf("|                             |\r|\033[30;43m%2d.%-20s\033[0m\n",medialist[i].id,medialist[i].menulist);}else {printf("|                             |\r|%2d.%-20s\n",medialist[i].id,medialist[i].menulist);}}printf("+-----------------------------+\n");return;
}void MenuChoose(void)
{	char tmpbuff[1024]={0};char w[10] = {0};memset(w,0,sizeof(w));fgets(w,sizeof(w),stdin);if(27 == w[0] && 10 == w[1])//esc{}if(10 == w[0] && focus ==4)//回车{exit(1);}if(10 == w[0] && focus ==0){	system("clear");printf("请输入要查询的城市:");  //选择城市scanf("%s",city);while(getchar()!= '\n');
//		SendWeather();}if(10 == w[0] && focus ==1)	//实时天气{system("clear");
//		memset(w,0,sizeof(w));
//		fgets(w,sizeof(w),stdin);
//		if(10 == w[0])
//		{CreateTcpClient("103.205.5.249",80);sprintf(tmpbuff,"/?app=weather.today&weaid=%s&appkey=72316&sign=f17235c2563dbbc6643d7a49d83fbc1d",city);SendHttpRequest(sockfd,tmpbuff);RecvSendWeather();RealTimeWeather();}if(10 == w[0] && focus ==2) //未来天气{
//		system("clear");CreateTcpClient("103.205.5.249",80);sprintf(tmpbuff,"http://api.k780.com/?app=weather.future&weaid=%s&appkey=72316&sign=f17235c2563dbbc6643d7a49d83fbc1d&format=json",city);SendHttpRequest(sockfd,tmpbuff);RecvSendWeather();FunWeather();}if(27 == w[0] && 91==w[1]){if(65 == w[2])//上{if(focus > pos_start){system("clear");focus--;}else if(focus == pos_start && pos_start ==0){return;}else if(focus == pos_start){system("clear");pos_start--;pos_end--;focus--;}}else if(66 ==w[2]) //下{if(focus < pos_end){system("clear");focus++;}else if(focus == pos_end && pos_end == 4){return;}else if(focus == pos_end){system("clear");pos_start++;pos_end++;focus++;}}}}int CreateTcpClient(char *p,int port) //创建一个TCP用户端
{int ret = 0;struct sockaddr_in seraddr;sockfd = socket(AF_INET,SOCK_STREAM,0);if(-1==sockfd){perror("fail to socket");return -1;}seraddr.sin_family = AF_INET;seraddr.sin_port = htons(port);seraddr.sin_addr.s_addr = inet_addr(p);ret = connect(sockfd,(struct sockaddr *)&seraddr,sizeof(seraddr));if(-1==ret){perror("fail to connect");return -1;}return 0;
}int SendHttpRequest(int sockfd,char *q)  //向http里面发送 
{char tmpbuff[4096]={0};ssize_t nsize = 0;sprintf(tmpbuff,"GET %s HTTP/1.1\r\n",q);sprintf(tmpbuff,"%sHost: api.k780.com\r\n",tmpbuff);sprintf(tmpbuff,"%sUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0\r\n",tmpbuff);sprintf(tmpbuff,"%sAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8\r\n",tmpbuff);sprintf(tmpbuff,"%sAccept-Language: en-US,en;q=0.5\r\n",tmpbuff);sprintf(tmpbuff,"%sConnection: keep-alive\r\n\r\n",tmpbuff);nsize = send(sockfd,tmpbuff,strlen(tmpbuff),0);return 0;
}int RealTimeWeather(void)
{int fd = 0;char tmpbuff[1000000] = {0};fd = open("recv.txt",O_RDONLY);cJSON *proot = NULL;cJSON *pvalue = NULL;cJSON *ptmp = NULL;read(fd,tmpbuff,sizeof(tmpbuff));proot = cJSON_Parse(tmpbuff);if(NULL == proot){fprintf(stderr,"creat root json failed!\n");}pvalue = cJSON_GetObjectItem(proot,"result");if(NULL == pvalue){fprintf(stderr,"can not find result\n");return -1;}ptmp = cJSON_GetObjectItem(pvalue,"days");printf("时间:%s\n",ptmp->valuestring);ptmp = cJSON_GetObjectItem(pvalue,"week");printf("星期:%s\n",ptmp->valuestring);ptmp = cJSON_GetObjectItem(pvalue,"citynm");printf("地点:%s\n",ptmp->valuestring);ptmp = cJSON_GetObjectItem(pvalue,"temperature_curr");printf("当前温度:%s\n",ptmp->valuestring);ptmp = cJSON_GetObjectItem(pvalue,"temp_high");printf("最高温度:%s\n",ptmp->valuestring);ptmp = cJSON_GetObjectItem(pvalue,"temp_low");printf("最低温度:%s\n",ptmp->valuestring);ptmp = cJSON_GetObjectItem(pvalue,"weather");printf("天气:%s\n",ptmp->valuestring);ptmp = cJSON_GetObjectItem(pvalue,"humidity");printf("当前湿度:%s\n",ptmp->valuestring);ptmp = cJSON_GetObjectItem(pvalue,"humi_high");printf("最大湿度:%s\n",ptmp->valuestring);ptmp = cJSON_GetObjectItem(pvalue,"humi_low");printf("最小湿度:%s\n",ptmp->valuestring);ptmp = cJSON_GetObjectItem(pvalue,"temperature");printf("白天 夜间温度:%s\n",ptmp->valuestring);ptmp = cJSON_GetObjectItem(pvalue,"aqi");printf("pm2.5:%s\n",ptmp->valuestring);ptmp = cJSON_GetObjectItem(pvalue,"wind");printf("风向:%s\n",ptmp->valuestring);ptmp = cJSON_GetObjectItem(pvalue,"winp");printf("风力:%s\n",ptmp->valuestring);close(fd);cJSON_Delete(proot);
}void FunWeather(void)
{cJSON *proot = NULL;cJSON *pvalue = NULL;cJSON *ptmp = NULL;cJSON *p = NULL;int fd = 0;int i = 0;char tmpbuff[4096] = {0};fd = open("recv.txt",O_RDONLY);read(fd,tmpbuff,sizeof(tmpbuff));proot = cJSON_Parse(tmpbuff);if(NULL == proot){fprintf(stderr,"creat root json failed!\n");}pvalue = cJSON_GetObjectItem(proot,"result");if(NULL == pvalue){fprintf(stderr,"can not find result\n");//	return -1;}for( i = 0;i < cJSON_GetArraySize(pvalue);++i){ptmp = cJSON_GetArrayItem(pvalue,i);if(NULL == ptmp){fprintf(stderr, "can not find location json struct %d item\n", i);//		return -1;}p = cJSON_GetObjectItem(ptmp,"days");printf("时间:%-20s",p->valuestring);p = cJSON_GetObjectItem(ptmp,"week");printf("星期:%-20s",p->valuestring);p = cJSON_GetObjectItem(ptmp,"citynm");printf("地点:%-20s",p->valuestring);p = cJSON_GetObjectItem(ptmp,"weather");printf("天气:%-20s",p->valuestring);putchar('\n');p = cJSON_GetObjectItem(ptmp,"temperature");printf("白天 夜间温度:%-20s",p->valuestring);p = cJSON_GetObjectItem(ptmp,"temp_high");printf("白天温度:%-20s",p->valuestring);p = cJSON_GetObjectItem(ptmp,"temp_low");printf("夜间温度:%-20s",p->valuestring);putchar('\n');p = cJSON_GetObjectItem(ptmp,"wind");printf("风向:%-20s",p->valuestring);p = cJSON_GetObjectItem(ptmp,"winp");printf("风力:%-20s",p->valuestring);putchar('\n');}close(fd);cJSON_Delete(proot);
}
void RecvSendWeather(void)
{	int fd = 0;char buff[30000];char cmpbuff[30000];char tmpbuff[4096]={0};ssize_t nsize = 0;char *ptmp = NULL;char *pstart = NULL;char *pend =NULL;fd = open("recv.txt",O_RDWR|O_CREAT|O_TRUNC,0664);while(1){memset(tmpbuff,0,sizeof(tmpbuff));nsize = recv(sockfd,tmpbuff,sizeof(tmpbuff),0);strcat(buff,tmpbuff);if(strstr(tmpbuff,"0\r\n") != NULL){break;}}ptmp = strstr(buff,"\r\n\r\n");ptmp += 4;ptmp = strstr(ptmp,"\r\n");ptmp += 2;pstart = ptmp;pend = strstr(ptmp,"\r\n");memset(cmpbuff,0,sizeof(cmpbuff));strncpy(cmpbuff,pstart,pend - pstart);write(fd,cmpbuff,strlen(cmpbuff));/*sockfd = CreateTcpClient("103.205.5.249",80);SendHttpRequest(sockfd,"/?app=weather.today&weaid=西安&appkey=44923&sign=c9815919d111da6c2c9ca64a304f640b&format=json");nsize = recv(sockfd,tmpbuff,sizeof(tmpbuff),0);printf("================================= RECV ================================\n");printf("%s\n", tmpbuff);printf("=======================================================================\n");
*/close(sockfd);	close(fd);
}int main(void)
{	while(1){
//		system("clear");PrintfMenu();MenuChoose();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/738060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.6什么是“空洞卷积”?简述空洞卷积的设计思路

1.6 简述空洞卷积的设计思路 背景&#xff1a;在语义分割(Semantic Segmentation)任务中&#xff0c;一般需要先缩小特征图尺寸&#xff0c;做信息聚合&#xff1b; 然后再复原到之前的尺寸&#xff0c;最终返回与原始图像尺寸相同的分割结果图。 问题&#xff1a;常见的语义分…

AI新工具(20240311) 国内免费使用Claude 3 Sonnet;Pika推出视频加音效功能

1: 国内免费使用Claude 3 Sonnet Claude 3现已登陆Amazon Bedrock&#xff0c;国内就能够免费使用&#xff0c;以下是网友整理的使用流程。 地址&#xff1a;https://lab.amazoncloud.cn/ 2: Pika Sound Effects Pika推出视频加音效功能&#xff0c;为视频创作带来声音定制…

python请求url下载网站中的视频

举例网站&#xff1a;Mini Impresora Trmica Bluetooth Porttil Inalmbrico | Envo gratis ctrlF4 先搜mp4 搜不到就搜m3u8 了 视频格式如下 &#xff08; AVI&#xff08;Audio Video Interleave&#xff09;&#xff1a;是一种由微软公司开发的音频和视频文件格式。MOV&…

Django环境下使用Ajax

Django环境下使用Ajax 目录 Django环境下使用Ajax介绍前情提要示例JS实现Ajax实现 传递JSON格式数据传递文件数据Django自带的序列化组件基于jsonresponse序列化数据基于Django自带的serializers 注册示例 介绍 AJAX 的主要目标是在不刷新整个页面的情况下&#xff0c;通过后台…

面具安装LSP模块时提示 Unzip error错误的解决办法

面具(Magisk Delta)安装LSP模块时提示 Unzip error错误的解决办法 ​​ 如果前面的配置都正常的话&#xff0c;可能是LSP版本有问题重新去Github下载一个最新版的吧&#xff1b;我是这么解决的。 我安装1.91那个版本的LSP就是死活安装不上&#xff0c;下载了1.92的版本一次就…

FTP,SFTP,FTPS,SSL,TSL简介,区别,联系,使用场景说明

文章目录 简介FTPFTPSSFTP加密场景选择FTPS还是SFTPFTP、SFTP、FTPS区别、联系和具体使用场景如何使用FTP、SFTP和FTPSSSLTLSSSL和TLS区别和联系&#xff0c;以及使用场景SSL和TLS技术上的区别一些问题隐式的TLS&#xff08;FTPS/SSL&#xff09;或者显式的TLS&#xff08;FTPS…

ffmpeg 从avio_write 到 udp_write

ffmpeg 从avio_write 到 udp_write --------------------------------------------- author: hjjdebug date: 2024年 03月 11日 星期一 14:16:44 CST description: ffmpeg 从avio_write 到 udp_write --------------------------------------------- 文章目录: 1. main 调用a…

第十八章 配置 Apache 以与 Web 网关配合使用 (UNIX® Linux macOS)

文章目录 第十八章 配置 Apache 以与 Web 网关配合使用 (UNIX Linux macOS)AssumptionsApache for UNIX、Linux、macOS 的安装位置&#xff08;推荐选项&#xff09; 第十八章 配置 Apache 以与 Web 网关配合使用 (UNIX Linux macOS) 本页介绍如何配置 Apache Web 服务器以与 …

C#多态例讲

在 C# 中&#xff0c;多态性&#xff08;polymorphism&#xff09;是指不同的类可以有相同名称但不同实现的方法。通过多态性&#xff0c;你可以在运行时根据对象的实际类型来调用相应的方法&#xff0c;从而实现更加灵活和可扩展的代码。比较类似子类方法重写&#xff0c;如py…

[密码学]Base64编码

一、相关指令 1. 查看工具版本号 base64 --version2. 对字符串加密 echo 字符串 | base64 echo "Hello base64" | base643. 对字符串解密 echo 字符串 |base64 -d echo "SGVsbG8gTGV0aWFuLVJTQQo" | base64 -d4. 对文件加密 base64 文件名 base64 tex…

搭建交换机模拟环境及SSH连接,华为NSP软件入门使用教程

搭建交换机模拟环境及SSH连接&#xff0c;华为NSP软件入门使用教程 如果你是通过搜索搜到了这篇文章&#xff0c;那么一定是工作或者学习中需要用交换机&#xff0c;但是又没物理机测试学习&#xff0c;所以需要搭建本地的虚拟环境学习。 这篇文章是我进行交换机命令入门学习写…

使用Flask快速搭建轻量级Web应用【第119篇—Flask】

使用Flask快速搭建轻量级Web应用 在Web开发领域&#xff0c;选择适合项目需求的框架至关重要。Flask&#xff0c;一个轻量级的Python Web框架&#xff0c;以其简洁、灵活和易扩展的特性而备受开发者青睐。本文将介绍如何使用Flask迅速搭建一个轻量级的Web应用&#xff0c;并通过…

js导出的excel文件无法打开/打开乱码,excel无法打开xxx.xlsx因为文件格式或文件扩展无效

excel无法打开xxx.xlsx因为文件格式或文件扩展无效 使用 a 标签导出这里就不细说了&#xff0c;直接说上述问题解决方案 在调用导出接口的时候加上两个参数 responseType: “blob” responseEncoding: “utf8” export function test(data) {return util({url: /test,method: …

04-微服务 面试题

1.Spring Cloud 常见的组件有哪些? Spring Cloud 5大组件有哪些? 基础的内容考察回答原则:简单的问题不能答错(一道面试题就能淘汰一个人)新手和老手都要注意面试参考回答: 面试官:Spring Cloud 5大组件有哪些? 候选人:早期我们一般认为的Spring Cloud五大组件是 …

【C++】反向迭代器仿函数模板进阶

反向迭代器&仿函数&模板进阶 一&#xff0c;反向迭代器1. 什么是反向迭代器2. 模拟实现3. 如何使用 二&#xff0c;仿函数1. 仿函数的概念2. 仿函数的用法 三&#xff0c;模板1. 非类型模板参数2. 模板的特化2.1 特化概念2.2 函数模板特化2.3 类模板特化2.3.1 全特化2.…

Flink 性能优化总结(内存配置篇)

内存配置优化 Flink 内存模型 内存模型详解 进程内存&#xff08;Total Process Memory&#xff09;&#xff1a;Flink 进程内存分为堆上内存和堆外内存&#xff0c;堆上内存和 堆外内存的主要区别在于它们的管理方式不同和使用方式不同&#xff0c;这些会影响到它们的性能和…

矩阵最大权值

题目描述 现有一个n∗m大小的矩阵&#xff0c;矩阵中的每个元素表示该位置的权值。现需要从矩阵左上角出发到达右下角&#xff0c;每次移动只能向上下左右移动一格&#xff08;不允许移动到曾经经过的位置&#xff09;。求最后到达右下角时路径上所有位置的权值之和的最大值。…

python实现--折半查找

python实现–顺序查找 python实现–折半查找 python实现–分块查找 python实现B/B树 折半查找&#xff08;Binary Search&#xff09;&#xff0c;也称为二分查找&#xff0c;是一种高效的查找算法&#xff0c;适用于有序数组或列表。它的基本思想是通过每次将查找范围缩小为原…

vue 渲染pdf并盖章之后生成新的pdf

目录 1.渲染pdf 1.页面准备渲染的容器,使用canvas渲染 2.把文件流渲染到canvas上面 3.下载pdf.js插件 4.使用 2.盖章 1.印章图片 2.自定义指令拖拽 3.生成新的pdf 1.下载生成pdf插件 2.使用 4.页面效果图 1.展示pdf 2.拖拽盖章 3.生成pdf文件 5.整体代码 …

蓝月亮,蓝禾,奇安信,三七互娱,顺丰,康冠科技,金证科技24春招内推

蓝月亮&#xff0c;蓝禾&#xff0c;奇安信&#xff0c;三七互娱&#xff0c;顺丰&#xff0c;康冠科技&#xff0c;金证科技24春招内推 ①蓝月亮 【招聘岗位】技术&#xff0c;研发&#xff0c;lT&#xff0c;供应链&#xff0c;市场&#xff0c;职能等 【网申链接】https://s…