HTTP协议、Wireshark抓包工具、json解析、天气爬虫

 HTTP超文本传输协议

  • HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

  • HTTP 协议的重要特点: 一发一收,一问一答

  • 明文传输 ,https密文 (加密了的)

现在的主流网站都是https

网址:URL 统一资源定位符

URL

互联网上每个文件都有一个唯一的 URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
    <协议>://<主机>:<端口>/<路径>

    协议:HTTP       80         TCP 
          HTTPS     443         TCP 
    主机:  域名  ->  域名解析服务器 -> IP地址
    端口: 可以省略, HTTP 80
                    HTTPS 443
    路径: 想要获得对应的资源

https://www.example.com/path/to/resource?query=parameter#fragment

•https 是协议,

•www.example.com 是主机名,域名

•/path/to/resource 是路径,

•query=parameter 是查询参数,

•#fragment 是片段标识符。

HTTP交互过程:
    1.建立TCP连接
    2.发送HTTP请求报文
    3.回复HTTP相应报文
    4.关闭TCP连接

要一次建立一次tcp连接,关闭一次连接

 

HTTP请求报文的格式:

HTTP响应报文格式:

GET 方法
基本介绍:

以下几种方式都会触发 GET 方法的请求

Wireshark 抓包工具

sudo apt-get install wireshark

为什么很多软件都可以用apt-get install安装?

apt-get 是 Debian 及其衍生系统(如 Ubuntu、Linux Mint 等)中的高级包工具(Advanced Package Tool)的命令行接口。

1.集中化的软件仓库: Debian 和其衍生系统维护着庞大的软件仓库,这些仓库包含了成千上万个预编译的软件包。当软件开发者将他们的软件贡献给这些仓库时,软件就变得可供所有使用相同系统的用户通过 apt-get 安装。

2. 依赖关系管理: apt-get 能够解析和处理软件包之间的依赖关系。这意味着当你安装一个软件包时,apt-get 会自动安装所有必要的依赖包,确保软件能够正常运行。这种依赖关系管理大大简化了安装过程。

3.社区贡献和维护: 一个活跃的社区持续为 Debian 和其衍生系统贡献软件包。这些贡献者不仅提供新的软件包,还负责保持现有软件包的更新和维护,确保它们与最新系统兼容。

一般过滤条件先选择协议名  然后用端口过滤。 

 

先运行网站如何抓取http格式的数据

 Nowapi的ip地址和端口号 为  103.205.5.228:80   

         

GET /?app=weather.today&weaid=%E8%A5%BF%E5%AE%89&appkey=72317&sign=be43b728a4f27463d34f4fcbfea69134&format=json HTTP/1.1
Host: api.k780.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1

HTTP/1.1 200 OK
Server: nginx
Date: Thu, 18 Jul 2024 08:23:48 GMT
Content-Type: application/json; charset=utf-8;
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: *

{"success":"1","result":{"weaid":"316","days":"2024-07-18","week":".........","cityno":"xian","citynm":"......","cityid":"101110101","temperature":"33.../24...","temperature_curr":"33...","humidity":"75%","aqi":"40","weather":"......","weather_curr":"...","weather_icon":"http://api.k780.com/upload/weather/d/2.gif","weather_icon1":"","wind":"......","winp":"2...","temp_high":"33","temp_low":"24","temp_curr":"33","humi_high":"0","humi_low":"0","weatid":"3","weatid1":"","windid":"8","winpid":"2","weather_iconid":"2"}}

 用httl协议获取今日天气的信息(json格式)

#include"head.h"int CreatTcpClient(char *pip,int port)
{int ret = 0;int sockfd = 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(pip);ret = connect(sockfd,(struct sockaddr *)&seraddr,sizeof(seraddr));if(-1 == ret){perror("fail to connect ");return -1;}return sockfd;}int SendHttpRequest(int sockfd,char *purl)
{char tmpbuff[4096] = {0};ssize_t nsize = 0;sprintf(tmpbuff,"GET %s HTTP/1.1\r\n",purl);      //%s  用于将 purl里存放的内容拼接到 tmpbuffsprintf(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);if(-1 == nsize){perror("fail to send");return -1;}return 0;}int main(int argc, const char *argv[])
{int sockfd = 0;ssize_t nsize = 0;char tmpbuff[4096] = {0};sockfd = CreatTcpClient("103.205.5.228",80);SendHttpRequest(sockfd,"/?app=weather.today&weaid=%E8%A5%BF%E5%AE%89&appkey=72317&sign=be43b728a4f27463d34f4fcbfea69134&format=json");nsize = recv(sockfd,tmpbuff,sizeof(tmpbuff),0);if(-1 == nsize){perror("fial to recv");return -1;}printf("*********RECV***********\n");printf("%s\n",tmpbuff);printf("************************\n");close(sockfd);return 0;
}

 

 json数据解析

{"success":"1","result":{"weaid":"316","days":"2024-07-18","week":"星期四","cityno":"xian","citynm":"西安","cityid":"101110101","temperature":"33℃/24℃","temperature_curr":"32℃","humidity":"82%","aqi":"41","weather":"多云","weather_curr":"多云","weather_icon":"http://api.k780.com/upload/weather/d/1.gif","weather_icon1":"","wind":"西南风","winp":"1级","temp_high":"33","temp_low":"24","temp_curr":"32","humi_high":"0","humi_low":"0","weatid":"2","weatid1":"","windid":"5","winpid":"1","weather_iconid":"1"}
}

这是一个两层的

JSON格式

一种数据格式

JSON(JavaScript Object Notation)通常用于Web应用程序之间以及客户端与服务器之间的数据交换。

JSON的基本结构包括对象和数组:‘

•对象是一系列无序的键值对。对象以   开始 ,以  结束。每个键后面跟一个冒号 : 每个键值对之间用逗号 , 分隔。

•数组是值的有序集合。数组以 [ 开始,以 ] 结束。值之间使用逗号 , 分隔。

字符串: 

{"name":"code","gender":"male"
}

数字:

{"key1":10,"key2":20.0
}

 数组:

 {"key1" : [0, 1],"key2" : [2, 3]}

允许嵌套 

{"name": "John Doe","age": 30,"isEmployed": true,"address": {"street": "123 Main St","city": "Anytown"},"phoneNumbers": [{"type": "home","number": "555-1234"},{"type": "mobile","number": "555-5678"}]
}

name、age 和 isEmployed 是简单的键值对。address 是一个嵌套的对象,phoneNumbers 是一个包含对象的数组。 

利用cJOSN解析json格式:

http://t.csdnimg.cn/KbuRZ

NowAPI天气爬虫

 json请求

 

URL: http://api.k780.com/?app=weather.today&weaId=1&appkey=APPKEY&sign=SIGN&format=json

 注意:
        appkey:换成自己的APPKey
        sign:换成自己的sign标识 

1.正常返回
{"success": "1","result": {"weaid": "1","days": "2014-07-30","week": "星期三","cityno": "beijing","citynm": "北京","cityid": "101010100","temperature": "31℃/24℃", /*白天 夜间温度  (注: 夜间只有一个温度如24℃/24℃)*/"temperature_curr": "25℃", /*当前温度*/"humidity": "50%",/*湿度*/"aqi": "100",/*pm2.5 说明详见weather.pm25*/"weather": "多云转晴", /*天气*/"weather_icon": "http://api.k780.com/upload/weather/d/1.gif", /*气象图标 全部气象图标下载*/"weather_icon1": "", /*无意义不必理会*/"wind": "微风",/*风向*/"winp": "小于3级", /*风力*/"temp_high": "31", /*最高温度*/"temp_low": "24", /*最低温度*/"humi_high": "87.8", /*最大湿度 [历史遗留栏位不再更新]*/"humi_low": "75.2", /*最小湿度 [历史遗留栏位不再更新]*/"weatid": "2", /*天气ID,可对照weather.wtype接口中weaid*/"weatid1": "", /*无意义不必理会*/"windid": "1", /*风向ID(暂无对照表)*/"winpid": "2" /*风力ID(暂无对照表)*/"weather_iconid": "1"  /*气象图标编号,对应weather_icon 1.gif*/}
}

 请求报文格式:
 

GET 是最常用的 HTTP 方法,常用于获取服务器上的某个资源。

在浏览器中直接输入 URL 回车或点击浏览器收藏夹中的链接,此时浏览器就会发送出一个 GET 请求。

响应报文格式:
HTTP/1.1 200 OK\r\n
Server: nginx\r\n
Date: Fri, 08 Mar 2024 06:33:44 GMT\r\n
Content-Type: application/json; charset=utf-8;\r\n
Transfer-Encoding: chunked\r\n
Connection: keep-alive\r\n                         
Access-Control-Allow-Origin: *\r\n
\r\n
{"success":"1","result":{"weaid":"316","days":"2024-03-08","week":".........","cityno":"xian","citynm":"......","cityid":"101110101","temperature":"13.../0...","temperature_curr":"12...","humidity":"29%","aqi":"65","weather":"............","weather_curr":"...","weather_icon":"http://api.k780.com/upload/weather/d/0.gif","weather_icon1":"","wind":"......","winp":"2...","temp_high":"13","temp_low":"0","temp_curr":"12","humi_high":"0","humi_low":"0","weatid":"1","weatid1":"","windid":"4","winpid":"2","weather_iconid":"0"}}\r\n
 

  • HTTP 在传输层依赖 TCP 协议,TCP 是面向字节流的。如果没有这个空行,就会出现”粘包问题“所以报文中会有很多 \r\n        
  • 因为 HTTP 协议并没有规定报头部分的键值对有多少个,使用空行就相当于是报文的结束标记或报文和正文之间的分隔符

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

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

相关文章

JVM:MAT内存泄漏检测原理

文章目录 一、介绍 一、介绍 MAT提供了称为支配树&#xff08;Dominator Tree&#xff09;的对象图。支配树展示的是对象实例间的支配关系。在对象引用图中&#xff0c;所有指向对象B的路径都经过对象A&#xff0c;则认为对象A支配对象B。 支配树中对象本身占用的空间称之为…

Spire.PDF for .NET【文档操作】演示:如何在 C# 中切换 PDF 层的可见性

我们已经演示了如何使用 Spire.PDF在 C# 中向 PDF 文件添加多个图层以及在 PDF 中删除图层。我们还可以在 Spire.PDF 的帮助下在创建新页面图层时切换 PDF 图层的可见性。在本节中&#xff0c;我们将演示如何在 C# 中切换新 PDF 文档中图层的可见性。 Spire.PDF for .NET 是一…

【LabVIEW作业篇 - 1】:中途停止for和while循环

文章目录 for循环while循环如何使用帮助 for循环 在程序框图中&#xff0c;创建for循环结构&#xff0c;选择for循环&#xff0c;鼠标右键-条件接线端&#xff0c;即出现像while循环中的小红圆心&#xff0c;其作用与while循环相同。 运行结果如下。&#xff08;若随机数>…

分布式搜索引擎ES-Elasticsearch进阶

1.head与postman基于索引的操作 引入概念&#xff1a; 集群健康&#xff1a; green 所有的主分片和副本分片都正常运行。你的集群是100%可用 yellow 所有的主分片都正常运行&#xff0c;但不是所有的副本分片都正常运行。 red 有主分片没能正常运行。 查询es集群健康状态&…

ExoPlayer架构详解与源码分析(15)——Renderer

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

Pytest+selenium UI自动化测试实战实例

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 今天来说说pytest吧&#xff0c;经过几周的时间学习&#xff0c;有收获也有疑惑&#xff0c;总之…

适用于618/7xx芯片平台 AT开发 远程FOTA升级指南教程

简介 AT版本的远程升级主要是对AT固件版本进行升级&#xff0c;实际方式为通过合宙官方IOT平台升级或者使用自己搭建的服务器进行升级服务。 该文档教程流程适用于 618/716S/718P 芯片平台的Cat.1模块 合宙IOT平台配置 升级日志 —— 如何查看 升级日志 —— 响应码列表 响应…

PCB(印制电路板)制造涉及的常规设备

印制电路板&#xff08;PCB&#xff09;的制造涉及多种设备和工艺。从设计、制作原型到批量生产&#xff0c;每个阶段都需要不同的专业设备。以下是一些在PCB制造过程中常见的设备&#xff1a; 1. 计算机辅助设计&#xff08;CAD&#xff09;软件&#xff1a; - 用于设计PC…

深度解析 containerd 中的 CNI 插件

CNI&#xff08;Container Network Interface&#xff09;插件是独立的可执行文件&#xff0c;遵循 CNI 规范。Kubernetes 通过 kubelet 调用这些插件来创建和管理容器的网络接口。CNI 插件的主要职责包括网络接口的创建和删除、IP 地址的分配和回收、以及相关网络资源的配置和…

Memcached介绍与使用

引言 本文是笔者对Memcached这个高性能分布式缓存组件的实践案例&#xff0c;Memcached是一种高性能的分布式内存对象缓存系统&#xff0c;用于减轻数据库负载&#xff0c;加速动态Web应用&#xff0c;提高网站访问速度。它通过在内存中缓存数据和对象来减少读取数据库的次数&…

IAR嵌入式开发解决方案已全面支持芯科集成CX3288系列车规RISC-V MCU,共同推动汽车高品质应用的安全开发

中国上海&#xff0c;2024年7月16日 — 全球领先的嵌入式系统开发软件解决方案供应商IAR与芯科集成电路&#xff08;以下简称“芯科集成”&#xff09;联合宣布&#xff0c;最新版本IAR Embedded Workbench for RISC-V 3.30.2功能安全版已全面支持芯科集成CX3288系列车规RISC-V…

解决vue多层弹框时存在遮挡问题

本文给大家介绍vue多层弹框时存在遮挡问题&#xff0c;解决思路首先想到的是找到对应的遮挡层的css标签&#xff0c;然后修改z-index值&#xff0c;但是本思路只能解决首次问题&#xff0c;再次打开还会存在相同的问题&#xff0c;故该思路错误&#xff0c;下面给大家带来一种正…

中间件的理解

内容来源于学习网站整理。【一看就会】什么是前端开发的中间件&#xff1f;_哔哩哔哩_bilibili 每日八股文~白话说mq&#xff0c;消息中间件_哔哩哔哩_bilibili 例如&#xff1a; 1&#xff09;两个人打电话&#xff0c;中间的通信网络就是中间件。 2&#xff09;菜鸟驿站&…

流式数据库 |RisingWave 的架构、容错、数据持久化

在上一篇文章中&#xff0c;已经为大家分享了 RisingWave 相关核心概念和术语。本文将在此基础上为大家介绍 RisingWave 的架构、容错以及数据持久化。 1. 架构 RisingWave 的架构如下图所示。它由三个主要部分组成&#xff1a;Meta 节点、Compute 节点和 Compactor 节点。 …

linux环境安装mongoDB

一、安装单体mogodb 目标&#xff1a;在Linux中部署一个单机的MongoDB&#xff0c;作为生产环境下使用。 提示&#xff1a;和Windows下操作差不多。 步骤如下&#xff1a; &#xff08;1&#xff09;先到官网下载压缩包 mongod-linux-x86_64-4.0.10.tgz 。 &#xff08;2&…

SpringBoot Bean管理

我们知道可以通过Spring当中提供的注解Component以及它的三个衍生注解&#xff08;Controller、Service、Repository&#xff09;来声明IOC容器中的bean对象&#xff0c;同时我们也学习了如何为应用程序注入运行时所需要依赖的bean对象&#xff0c;也就是依赖注入DI。 本篇主要…

c++初阶知识——内存管理与c语言内存管理对比

目录 前言&#xff1a; 1.c&#xff0b;&#xff0b;内存管理方式 1.1 new和delete操作自定义类型 2.operator new与operator delete函数 2.1 operator new与operator delete函数 3.new和delete的实现原理 3.1 内置类型 3.2 自定义类型 new的原理 delete的原理 new…

gite+picgo+typora打造个人免费笔记软件

文章目录 1️⃣个人笔记软件2️⃣ 配置教程2.1 使用软件2.2 node 环境配置2.3 软件安装2.4 gite仓库设置2.5 配置picgo2.6 测试检验2.7 github教程 &#x1f3a1; 完结撒花 1️⃣个人笔记软件 最近换了环境&#xff0c;没有之前的生产环境舒适&#xff0c;写笔记也没有劲头&…

图——图的遍历(DFS与BFS算法详解)

前面的文章中我们学习了图的基本概念和存储结构&#xff0c;大家可以通过下面的链接学习&#xff1a; 图的定义和基本术语 图的类型定义和存储结构 这篇文章就来学习一下图的重要章节——图的遍历。 目录 一&#xff0c;图的遍历定义&#xff1a; 二&#xff0c;深度优先…

【代码随想录】【算法训练营】【第58天 2】 [卡码102]沉没孤岛

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 58&#xff0c;周四&#xff0c;ding~ 题目详情 [卡码102] 沉没孤岛 题目描述 卡码102 沉没孤岛 解题思路 前提&#xff1a;修改孤岛的值 思路&#xff1a;DFS or BFS&#xff0c;使用visite…