基于http协议的天气爬虫

该系统将基于目前比较流行的网络爬虫技术, 对网站上的天气数据进行查询分析, 最终使客户能够通过简单的操作, 快速, 准确的获取目标天气数据。主要包括两部分的功能, 第一部分是天气数据查询, 包括时间段数据查询, 实时天气数据查询;第二部分是打印查询出的天气数据。

实现这个项目时,可以先学习一下cJSON

main.c

#include <stdio.h>
#include <unistd.h>

#include "grab.h"


int main(int argc,const char *argv[])
{
    char city[128] = {0};
    int choose = 0;

    int sockfd = init_cli();           //初始化客户端

    while(1)
    {
        menu();                        //打印一个菜单

        printf("input need find city:");
        scanf("%s",city);
        
        printf("input need find weather:");
        scanf("%d",&choose);

        switch(choose)
        {
            case 1:
            find_now_weather(sockfd,city);    //查找当前天气
            recv_weather(sockfd);             //接收并打印当前天气
            break;

            case 2:
            find_future_weather(sockfd,citi);   //查找未来天气
            recv_weather1(sockfd);              //接收并打印未来天气
        }
    }

    close(sockfd);
    
    return 0;
}

grab.c:

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include "cJSON.h"

int init_cli()
{
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd < 0)
    {
        return -1;
    }

    struct sockaddr_in ser;
    ser.sin_family = AF_INET;
    ser.sin_port = htons(80);
    ser.sin_addr.s_addr = inet_addr("103.205.5.228");

    int ret = connect(sockfd,(struct sockaddr *)&ser,sizeof(ser));
    if(ret < 0)
    {
        perror("fail connect:");
        return -1;
    }

    return sockfd;
}


void menu()
{
    printf("---------1.查询实时天气----------\n");
    printf("---------2.查询未来天气----------\n");
}

void find_now_weather(int sockfd,char *city)
{
    char buff[1024] = {0};
    memset(buff,0,sizeof(buff));

    sprintf(buff,"GET /?app=weather.today&cityNm=%s&appkey=75258&sign=368fe47199076f69e8509979b1d9eeff&format=json HTTP/1.1\r\n""Host: api.k780.com\r\n""User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0\r\n""Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.Z\r\n""Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\r\n""connection: close\r\n\r\n",city);                 

//请求报文,把要查询的城市拼进去,实现城市天气的查询

    ssize_t size = send(sockfd,buff,strlen(buff),0);
    if(size < 0)
    {
        perror("fail send:");
        return;
    }

    return;
}

Void recv_weather(int sockfd)
{
    char buff[10240] = {0};
    ssize_t size = recv(sockfd,buff,sizeof(buff) - 1,0);
    if(size < 1)
    {    
        perror("fail recv:");
        return;
    }
    
    printf("%s\n",buff);


    int i=0;                            //从这里开始使用cJSON进行解析
    while(1)                              //首先定位到cJSON数据的开头
    {    
        if('{' == buff[i])
        {    
            break;
        }
        i++;
    }

    const char *json_string = &buff[i];
    cJSON *root = cJSoN_Parse(json_string);
    if(!root)
    {
        printf("fail get root\n");   
        return;
    }

    cJSoN *success = cJsoN_GetobjectItem(root,"success"); 
    //先解析未被嵌套的键值对,根结点

    cJSON *result = cJsoN_GetobjectItem(root,"result");
    printf("success:%s\n",success->valuestring);

    if(cJsoN_IsArray(result)) //判断result中有没有数组,如果有使用数组的解析方法
    {
        i = 0;
        for(i = 0;i < soN_GetArraySize(result);++i)
        {
            cJSON *item = cJSoN_GetArrayItem(result,i); //解析result键值对数组
            
            cJSON *weaid = cJSON_GetobjectItem(item,"weaid");
            //根据得到的item解析键值对成员

            printf("weaid:%s\n",weaid->valuestring);
        }
        
        return;
    }

    cJSON *weaid = cJsoN_GetobjectItem(result,"weaid"); 
    //再解析嵌套中的键值对,result结点
    printf("weaid:%s\n",weaid->valuestring);

    cJSON *days = cJSON_GetobjectItem(result,"days");
    printf("days:%s\n",days->valuestring);

    cJSON *week = cJSON_GetobjectItem(result,"week");
    printf("week:%s\n",week->valuestring);

    cJSON *citynm = cJsoN_GetobjectItem(result,"citynm");
    printf("citynm:%s\n",citynm->valuestring);   

    return;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何用 ESP32-CAM 做一个实时视频流服务器

文章目录 ESP32-CAM 概述ESP32-S 处理器内存Camera 模块MicroSD 卡槽天线板载 LED 和闪光灯其他数据手册和原理图ESP32-CAM 功耗 ESP32-CAM 引脚参考引脚排列GPIO 引脚哪些 GPIO 可以安全使用&#xff1f;GPIO 0 引脚MicroSD 卡引脚 ESP32-CAM 的烧录方式使用 ESP32-CAM-MB 编程…

UE5中制作地形材质

在创作大场景内容时&#xff0c;地形的设计和优化是至关重要的一步。利用UE中的地形系统&#xff0c;开发者能够高效地创建复杂的地形形态&#xff0c;同时保持游戏的性能和视觉效果。 1.在创建地形之前&#xff0c;先新建一个地形使用的混合材质球&#xff0c;添加节点Landsc…

通过 route 或 ip route 管理Linux主机路由

目录 一&#xff1a;route 使用说明1、查看路由信息2、删除指定路由3、增加指定路由 二&#xff1a;ip route 使用说明1、查看主机路由2、新增主机路由3、删除主机路由 通过route 或者ip route修改Linux主机路由后属于临时生效&#xff0c;系统重启后就恢复默认值了&#xff0c…

数据结构C语言描述11(图文结合)--二叉搜索树(BST树)的实现(数据采用KV存储形式进行封装)

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;有C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…

rabbitmq的三个交换机及简单使用

提前说一下&#xff0c;创建队列&#xff0c;交换机&#xff0c;绑定交换机和队列都是在生产者。消费者只负责监听就行了&#xff0c;不用配其他的。 完成这个场景需要两个服务哦。 1直连交换机-生产者的代码。 在配置类中创建队列&#xff0c;交换机&#xff0c;绑定交换机…

【数据库系统概论】第6章 (二)范式(重点讲在函数依赖范畴内)

目录 第一范式&#xff08;1NF&#xff09; 第二范式&#xff08;2NF&#xff09; 第三范式&#xff08;3NF&#xff09; BC范式&#xff08;BCNF&#xff09; 多值依赖 第四范式&#xff08;4NF&#xff09; 范式&#xff08;Normalization&#xff09; 是一种结构化的设…

Supermaven 加入 Cursor:AI 编码新篇章

引言 2024 年 11 月 11 日&#xff0c;我们迎来了一个激动人心的时刻——Supermaven 正式加入 Cursor&#xff01; 这一合作标志着 AI 编程工具进入了一个新的发展阶段&#xff0c;为开发者提供更智能、更高效的编码体验。本文将带您了解此次合并的背景、意义以及未来的发展方…

通信与网络安全管理之ISO七层模型与TCP/IP模型

一.ISO参考模型 OSI七层模型一般指开放系统互连参考模型 (Open System Interconnect 简称OSI&#xff09;是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型&#xff0c;为开放式互连信息系统提供了一种功能结构的框架。 它从低到高分别是…

【灵码助力安全3】——利用通义灵码辅助智能合约漏洞检测的尝试

前言 随着区块链技术的快速发展&#xff0c;智能合约作为去中心化应用&#xff08;DApps&#xff09;的核心组件&#xff0c;其重要性日益凸显。然而&#xff0c;智能合约的安全问题一直是制约区块链技术广泛应用的关键因素之一。由于智能合约代码一旦部署就难以更改&#xf…

网络安全设备主要有什么

网络安全设备指的肯定是硬件设备了&#xff0c;国内卖安全硬件的没几家&#xff0c;天融信&#xff0c;启明星辰&#xff0c;绿盟&#xff0c;深信服&#xff0c;就这四家卖的比较齐全吧&#xff0c;上它们官网看一下&#xff0c;就知道市面上主要的网络安全设备有哪些了。分类…

Springboot3.4整合jsp

文章目录 环境 springboot3.4 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency> <!--用于编译jsp--> <!-- Tomcat Embed Jasper --> <dependency>…

软件自动定时启动器

点击添加软件&#xff0c;可以添加可执行文件软件&#xff0c;设置启动的时间&#xff0c;也可以设置关闭的时间 注意&#xff0c;时间为00&#xff1a;00&#xff1a;00 等于没设置&#xff0c;这个时间不在设置范围&#xff0c;其他任何时间都可以 1.1更新 1&#xff1a;修复…

[java基础-集合篇]LinkedList源码粗析

LinkedList 的数据结构 实现List、Deque 接口&#xff0c;基于 双向链表实现的列表。与基于数组的 ArrayList 不同&#xff0c;基于链表的LinkedList 允许在列表的任何位置快速地插入和删除元素。 Java中LinkedList实现了Deque&#xff0c;它提供了 add, offer, remove, poll, …

error: linker `link.exe` not found

开始学习rust&#xff0c;安装好rust的环境&#xff0c;开始从hello world开始&#xff0c;结果用在win10环境下&#xff0c;使用vs code或cmd窗口编译rust报错&#xff1a; PS E:\study_codes\rust-demo\chart01> rustc hello.rs error: linker link.exe not found| note:…

STM32使用ITM调试_通过仿真器实现串口打印

IDE&#xff1a;CLion MCU: STM32F407VET6 工具&#xff1a;OpenOCD Telnet 一、简介 调试单片机时&#xff0c;如果要打印数据往往需要另接一根线通过USB转TTL接到电脑上。但这样做往往并不方便&#xff0c;尤其是身边没有USB转TTL工具时。这时可以使用单片机自带的ITM单元…

网络基础1 http1.0 1.1 http/2的演进史

http1.0 1.1 http/2的演进史&#x1f60e; &#xff08;连接复用 队头阻塞 服务器推送 2进制分帧&#xff09; 概述 我们主要关注的是应用层 传输层 http协议发展历史 http的报文结构&#xff1a;起始行 Header Body http的典型特征 http存在的典型问题 Keep Alive机制 chun…

汽车牌照识别系统的设计与仿真(论文+源码)

1设计原理 车牌识别系统的设计是一项利用车辆的动态视频或者静态图像实现牌照区域定位车牌号码识别的技术。其硬件部分通常包括触发设备、拍摄设备、照明设备、图像收集设备、进行车牌号码识别的处理器等&#xff0c;其软件的关键部分包含车牌区域定位的算法、车牌字符的分割算…

springboot 集成 mybatisplus

本案例版本 springboot 3.1.12 mybatis-plus 3.5.9 源码地址 stormlong/springboot-mybatisplus 集成 mybatis-plus 官方文档&#xff1a;快速开始 | MyBatis-Plus 引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-…

本地服务器Docker搭建个人云音乐平台Splayer并实现远程访问告别烦人广告

前言 大家好&#xff01;今天我要给大家分享的是如何在Ubuntu上用Docker快速搭建高颜值无广告的某抑云音乐播放器Splayer的详细流程&#xff0c;并且结合cpolar内网穿透工具实现远程访问。如果你是音乐爱好者&#xff0c;经常需要在外办公或旅行&#xff0c;这个教程绝对能让你…

phpenc加密程序源码

免费扩展加密程序&#xff0c;类似于sg11加密&#xff0c;支持单个PHP&#xff08;免费&#xff09;文件以及批量PHP文件&#xff08;ZIP压缩包格式&#xff09;源码加密的保护平台&#xff0c;加密后的源码文件保持原有代码结构&#xff0c;可以跨平台运行&#xff0c;可以运行…