基于tcp协议网络爬虫获取天气数据

1.项目功能

通过此程序可方便获取NowAPI 数据接口服务商 诺派数据 网站的天气信息,可实现简单页面输入,根据用户输入,输出相应天气结果,并可以将用户查询到的历史信息保存在log文件中。

按功能可分为以下模块:网络套接字初始模块、ui显示模块、命令接收及分析模块、执行命令模块、日志写入模块。

#include"head.h"
#include"cJSON.h"
int cmd = 0;
char cityname[16] ={0};
char bigbuff[4096] = {0};
char date[4096] = {0};
char day[16] ={0};
int init_tcp_cli(const char *ip,unsigned short port)
{
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == sockfd)
    {
        perror("fail socket");
        return -1;
    }
    struct sockaddr_in ser;
    ser.sin_family = AF_INET;
    ser.sin_port =htons(port);
    ser.sin_addr.s_addr = inet_addr(ip);
    int ret = connect(sockfd,(struct sockaddr*)&ser,sizeof(ser));
    if(-1 == ret )
    {
        perror("error connect!");
        return -1;
    }
    return sockfd;

}
int send_http_today_response(int sockfd)
{
    char buff1[1024]={0};
    sprintf(buff1,"GET /?app=weather.%s&cityNm=%s&appkey=73565&sign=6d208c1c8a7c71712037c7063e1d17fd&format=json HTTP/1.1\r\n"
    "Host: api.k780.com\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;5q=0.5\r\n"
    "Connection: close\r\n\r\n",day,cityname);
    char *prep = buff1; 
    size_t size = send(sockfd,prep,strlen(prep),0);
    if(size < 0)
    {
        return -1;
    }
    return 0;

}


int recv_http_today_response(int sockfd)
{
    char buff[1024] ={0};
    while(1)
    {
        memset(buff,0,sizeof(buff));
        size_t size = recv(sockfd,buff,sizeof(buff)-1,0);
        if(size < 0)
        {
            perror("fail recv");
            
            return -1;
        }
        else if(0 == size)
        {
            break;
        }
        strcat(bigbuff,buff);

    }
    char *p;
    p = strchr(bigbuff, '{');
    strcpy(date, p);
    return 0;
}
int recv_http_today_response1(int sockfd)
{
    char buff[1024] ={0};
    while(1)
    {
        memset(buff,0,sizeof(buff));
        size_t size = recv(sockfd,buff,sizeof(buff)-1,0);
        if(size < 0)
        {
            perror("fail recv");
            
            return -1;
        }
        else if(0 == size)
        {
            break;
        }
        strcat(bigbuff,buff);

    }
    char *p;
    p = strchr(bigbuff, '{');
    strcpy(date, p);
    return 0;
}

int show_cmd(void)
{
    printf("输入想要查询的城市\n");
    scanf("%s",cityname);
    printf("查询未来天气输入1\n");
    printf("查询当前天气输入2\n");
    scanf("%d",&cmd );
    if(1 == cmd)
    {
       
        printf("当前城市:%s\n",cityname);
      
    }
    else if(2 == cmd)
    {
        printf("当前城市:%s\n",cityname);
        
    }
   
    return 0;

}
int cjson_hander()
{
    cJSON *item;
    cJSON* root = cJSON_Parse(date);
    if(root == NULL)
    {
        printf("pasrse fail.\n");
        return -1;
    }
    cJSON* object =cJSON_GetObjectItem(root,"result");
    item =cJSON_GetObjectItem(object,"days");
    printf("%s\n", item->valuestring);
    item=cJSON_GetObjectItem(object,"week");
    printf("%s\n", item->valuestring);
    item=cJSON_GetObjectItem(object,"temperature");
    printf("%s\n", item->valuestring);
    item=cJSON_GetObjectItem(object,"humidity");
    printf("%s\n", item->valuestring);
    item=cJSON_GetObjectItem(object,"aqi");
    printf("%s\n", item->valuestring);
    item=cJSON_GetObjectItem(object,"weather");
    printf("%s\n", item->valuestring);
    item=cJSON_GetObjectItem(object,"wind");;
    printf("%s\n", item->valuestring);
    cJSON_Delete(root);
return 0;

}
int cjson_hander1()
{
    char data_num[7] = {0};
    cJSON* root = cJSON_Parse(date);
    
    cJSON* arrayitem =cJSON_GetObjectItem(root,"result");
    int kind = cJSON_GetArraySize(arrayitem);
    printf("一共%d组\n",kind);
    for(int i = 0;i<kind;i++)
    {
        printf("第%d组\n",i+1);
        cJSON *Object = cJSON_GetArrayItem(arrayitem, i);
        
        cJSON *item = cJSON_GetObjectItem(Object, "days");  
        printf("%s\n", (char *)item->valuestring);
    
        item = cJSON_GetObjectItem(Object, "week");
        printf("%s\n", (char *)item->valuestring);

    
        item = cJSON_GetObjectItem(Object, "citynm");
        printf("%s\n", (char *)item->valuestring);

        item = cJSON_GetObjectItem(Object, "temperature");
        printf("温度范围: ");
        printf("%s\n", (char *)item->valuestring);
    
        printf("天气: ");
        item = cJSON_GetObjectItem(Object, "weather");
        printf("%s\n", (char *)item->valuestring);

        printf("\n");
    }
    cJSON_Delete(root);
    return 0;
}

int main()
{
    int sockfd =init_tcp_cli("103.205.5.228",80);
    show_cmd();
    if(2 == cmd)
    {
        sprintf(day,"today");
        send_http_today_response(sockfd);
        recv_http_today_response(sockfd);
        cjson_hander();
        close(sockfd);
    }

    else if(1 == cmd)
    {
        sprintf(day,"future");
        send_http_today_response(sockfd);
        recv_http_today_response(sockfd);
        cjson_hander1();
        close(sockfd); 
    }
    return 0;
}


  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值