##天气预报爬虫 项目

//主要功能 #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…

[密码学]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;这些会影响到它们的性能和…

中兴R5300G4无法识别全部硬盘与服务器Smart31002100RAID卡修改端口模式配置方法

中兴R5300G4无法识别全部硬盘&#xff0c;需要启动UEFI模式。 问题描述 硬盘配置RAID或者HBA直通模式需要修改RAID卡的端口模式。 本文介绍服务器分别在legacy、UEFI模式下的配置方法。 适用产品 R5300 G4、R5500 G4、R8500 G4 解决方案 一&#xff0e;Legacy启动模式&#x…

《剑指 Offer》专项突破版 - 面试题 77 和 78 : 详解归并排序(C++ 实现)

目录 归并排序详解 递归实现 迭代实现 面试题 77 : 链表排序 面试题 78 : 合并排序链表 法一、利用最小堆选取值最小的节点 法二、按照归并排序的思路合并链表 归并排序详解 归并排序就是将两个或两个以上的有序表合并成一个有序表的过程。将两个有序表合并成一个有序表…

机器学习-04-分类算法-01决策树案例

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中分类算法&#xff0c;本篇为分类算法开篇与决策树部分。 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程…

redis 缓冲区详解(性能优化缓冲区优化)

目录 前言 客户端输入缓冲区 输出缓冲区 集群缓冲区 全量复制缓冲区问题 增量复制缓冲区问题 前言 在我的《Redis 为啥那么快》这篇文章中&#xff0c;详细总结了Redis 为啥那么快。今天当我要详细阐述Redis 的缓冲区时&#xff0c;意识到应该加上Redis 的缓冲区。我们假…

01_04_JavaWEB03_XML、Tomcat、http

XML_Tomcat10_HTTP 参考尚硅谷再总结复习 一 XML XML是EXtensible Markup Language的缩写&#xff0c;翻译过来就是可扩展标记语言。所以很明显&#xff0c;XML和HTML一样都是标记语言&#xff0c;也就是说它们的基本语法都是标签。 可扩展 三个字表面上的意思是XML允许自定义…

VBA combox/listbox 控件响应鼠标滚轮事件

在vba中&#xff0c;我们在用户窗体中如果添加有combox控件&#xff0c;或者是listbox控件。正常情况下&#xff0c;combox 和 listbox 是不响应鼠标滚轮事件的&#xff0c;且默认的VBA控件中&#xff0c;也没有提供响应鼠标滚轮事件的方法和入口。如此以来&#xff0c;我们在c…

【毕设级项目】基于AI技术的多功能消防机器人(完整工程资料源码)

基于AI技术的多功能消防机器人演示效果 竞赛-基于AI技术的多功能消防机器人视频演示 前言 随着“自动化、智能化”成为数字时代发展的关键词&#xff0c;机器人逐步成为社会经济发展的重要主体之一&#xff0c;“机器换人”成为发展的全新趋势和时代潮流。在可预见的将来&#…