天气预报爬虫

news2024/11/14 17:43:45

一、获取天气接口

主要通过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.coloradmin.cn/o/2107175.html

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

相关文章

关键字驱动的测试模式和代码实例分享

什么是关键字驱动测试&#xff1f; 关键字驱动测试 (KDT) 是一种软件测试方法&#xff0c;使用业务术语&#xff08;关键字&#xff09;来描述测试用例&#xff0c;而不是使用编程语言。它通过将测试逻辑与测试数据分离&#xff0c;简化了测试流程&#xff0c;并允许非技术人员…

Java运算符(详解)

前言&#xff1a; Java中运算符有哪些&#xff1f; 大致分为&#xff1a; 算术运算符、关系运算符、逻辑运算符、位运算符、移位运算符、条件运算符 接下来&#xff0c;一一分析。 算术运算符&#xff1a; 基本运算符&#xff1a; 加减乘除&#xff0c;是最基本的运算符。 例…

手搓 Java hashmap

1. 前言 都知道 hashmap 是哈希表&#xff0c;字典&#xff0c;这里全萌新向&#xff0c;至于为什么萌新向&#xff0c;因为我也不会&#xff0c;算是拷打自己对于一些流程的实现。 我们先把最基础的功能实现了&#xff0c;后面再考虑扰动&#xff0c;红黑冲突树&#xff0c;…

无线麦克风推荐哪些品牌,无线麦克风哪个品牌好,好的麦克风推荐

在声音创作与直播的领域里&#xff0c;无线领夹麦克风作为捕捉清晰声音的第一道防线&#xff0c;其重要性不言而喻。传统的有线麦克风及部分无线产品&#xff0c;难以在移动场景下提供稳定、清晰的录音效果&#xff1b;劣质无线领夹麦克风往往音质不稳定&#xff0c;甚至可能在…

爬虫 可视化 管理:scrapyd、Gerapy、Scrapydweb、spider-admin-pro、crawllab、feaplat、XXL-JOB

1、scrapyd 大多数现有的平台都依赖于 Scrapyd&#xff0c;这将选择限制在 python 和 scrapy 之间。当然 scrapy 是一个很棒的网络抓取框架&#xff0c;但是它不能做所有的事情。 对于重度 scrapy 爬虫依赖的、又不想折腾的开发者&#xff0c;可以考虑 Scrapydweb&#xff1b;…

Java IO异常处理:在Web爬虫开发中的实践

在当今的互联网时代&#xff0c;Web爬虫技术已经成为数据采集的重要手段之一。它们能够自动地从网页中提取信息&#xff0c;为数据分析、搜索引擎优化、内容聚合等提供了强大的支持。然而&#xff0c;Web爬虫在执行过程中可能会遇到各种输入/输出&#xff08;IO&#xff09;异常…

iomuxc、pinctrl子系统、gpio子系统(学习总结)

iomuxc、pinctrl子系统、gpio子系统三者的关系 相互依赖&#xff1a;IOMUXC、pinctrl子系统和gpio子系统在功能上相互依赖。IOMUXC提供了引脚复用和电气属性的配置能力&#xff0c;pinctrl子系统负责从设备树中获取这些配置信息并完成初始化&#xff0c;而gpio子系统则在引脚被…

华三防火墙第-安全策略02

一 安全策略的图解 安全策略是一种根据报文的属性信息对报文进行精细化转发控制的智能安全防护措施。它 融合了多维度精确报文识别、深度报文检测、安全动作执行、智能策略分析、应用风险调 优等多种安全防护功能,为网络的安全性提供全方位保障。 安全策略运行原理 安全策略对…

【代码解读】LLGC

对象创建&#xff1a; model LLGC(description.size(1), label.max().item()1, args.drop_out, args.use_bias).to(device)模型使用&#xff1a; output model(train_features)LLGC&#xff1a; # Lorentzian MODEL class LLGC(nn.Module):def __init__(self, nfeat, ncla…

家政保洁|基于SSM+vue的智能家政保洁预约系统(源码+数据库+文档)

智能家政保洁预约系统 基于SSMvue的智能家政保洁预约系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员功能实现 家政人员功能实现 用户功能实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…

多维动态规划-面试高频!-最长公共子序列和最长公共子串、回文串-c++实现和详解

1143. 最长公共子序列 中等 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删…

UE驻网失败问题(三)

这个问题是lab问题&#xff0c;现象如下&#xff1a; 期望UE注册在SA网络下&#xff0c;咋一看没有5G MIB/SIB1打印&#xff0c;好像是没搜到5G小区&#xff0c;而实际上并不是这样。 在查看搜网过程时会发现如下log打印&#xff1a; [I nr5g_rrc_acq.c 3544] RRC ACQ: Band 41…

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

01 引言 随着时间的发展&#xff0c;大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用&#xff0c;随着人们期望的不断增加&#xff0c;目标也发生了巨大的变化。在短短的几个月的时间里&#xff0c;人们对大模型的认识已经从对其zero-shot能力感到惊讶&#xff0c…

ElasticSearch-Ingest Pipeline Painless Script

Ingest Node & Pipeline & Processor Ingest NodePipeline & Processor内置的 Processors创建 pipeline使用 pipeline 更新数据借助 update_by_query 更新已存在的文档Ingest Node VS Logstash Painless Ingest Node & Pipeline & Processor 应用场景&…

坚持与等待的区别!看了当年高考状元如今的现状,我才明白所谓名校的真相——早读(逆天打工人爬取热门微信文章解读)

快 机会来了 引言Python 代码第一篇 洞见 看了当年高考状元如今的现状&#xff0c;我才明白所谓名校的真相第二篇 股市 之 空窗期结尾 &#xff08;不是 你改名 怎么改群名字&#xff01; 这下每个人都知道王妈妈单身了&#xff09; 引言 昨天忘记写了 真的很抱歉 说下借口哈…

Invicti-Professional-V24.8.1

前言 Invicti 专业 Web 应用程序安全扫描器 自动、极其准确且易于使用的 Web 应用程序安全扫描程序&#xff0c;可自动查找网站、Web 应用程序和 Web 服务中的安全漏洞。 Invicti Professional Edition 是一款商业 Web 应用程序安全扫描器。它旨在自动查找和修复 Web 应用程…

VScode:快捷键和技巧

格式化文档 搜索文件名

助贷CRM系统:为金融中介行业打造全新营销管理模式

助贷CRM&#xff08;客户关系管理&#xff09;系统是针对金融中介行业&#xff0c;特别是从事贷款助贷业务的机构设计的一套综合管理系统。该系统旨在通过数字化、智能化的手段&#xff0c;优化金融中介机构的营销、销售、客户管理及服务流程&#xff0c;提升运营效率&#xff…

构建高效在线拍卖系统:SpringBoot实践

MySQL数据库 数据库是系统开发过程中不可或缺的一部分。 在WEB应用方面&#xff0c;MySQL AB开发了一个具有很大优势的MySQL关系数据库管理系统。 MySQL可以将数据存储在不同的表中&#xff0c;这非常灵活&#xff0c;并且还可以提高系统在实际应用中的速度。 数据库访问最常用…

创客匠人8月总结|所有赋能都是服务,都是为了帮客户拿结果

“九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。”每一份伟大的成就都源自不懈的积累与坚定的步伐。 作为“知识变现整体解决方案服务商”&#xff0c;我们始终站在时代的前沿&#xff0c;致力于为每一位知识IP搭建桥梁&#xff0c;直通知识变现之…