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

news2024/9/22 7:36:33

 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里存放的内容拼接到 tmpbuff
	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);
	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.coloradmin.cn/o/1935499.html

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

相关文章

vscode+wsl2+anaconda环境的配置与使用

目录 下载anaconda Anaconda使用参考 vscodeubuntuanaconda 先用vscode连接本地ubuntu。 如果没有安装wsl2与ubuntu&#xff0c;可点击下面的链接。 问题&#xff1a;wsl install 无法解析服务器 成功记录&#xff1a; 在vscode终端用ubuntu安装anaconda。 创建pytho…

mybatis 主键的特殊要求

这是一条插入语句: 其目的就是为了将这个role对象插入到数据库, 然后他会根据getGeneratedKeys来自动回填id. 但是, 实际工作往往不是我们想象的那么简单&#xff0c;需要根据一些特殊的关系设置主键id 的值。 假设我们取消表trole 的id自增的规则&#xff0c;我们的要求是:如…

【element plus】el-tooltip限制宽度及自定义背景色

根据官方文档&#xff0c;使用popper-class参数为tooltip添加自定义内容&#xff1b;其中该类名注意不能够加scope标签中&#xff0c;否则无效。 <el-tooltip effect"dark" :popper-class"box-item" :hide-after"100" placement"right&q…

PyTorch 深度学习实践-处理多维特征的输入

视频指路 参考博客笔记 参考笔记二 通过多个线性模型来模拟非线性的空间变换&#xff0c;矩阵计算就是不同维度之间的空间转换 说明&#xff1a;1、乘的权重(w)都一样&#xff0c;加的偏置(b)也一样。b变成矩阵时使用广播机制。神经网络的参数w和b是网络需要学习的&#xff0c…

【Chatgpt大语言模型医学领域中如何应用】

随着人工智能技术 AI 的不断发展和应用&#xff0c;ChatGPT 作为一种强大的自然语言处理技术&#xff0c;无论是 自然语言处理、对话系统、机器翻译、内容生成、图像生成&#xff0c;还是语音识别、计算机视觉等方面&#xff0c;ChatGPT 都有着广泛的应用前景。特别在临床医学领…

Web3D:WebGL为什么在渲染性能上输给了WebGPU。

WebGL已经成为了web3D的标配&#xff0c;市面上有N多基于webGL的3D引擎&#xff0c;WebGPU作为挑战者&#xff0c;在渲染性能上确实改过webGL一头&#xff0c;由于起步较晚&#xff0c;想通过这个优势加持&#xff0c;赶上并超越webGL仍需时日。 贝格前端工场为大家分享一下这…

大数据架构对比记录

Lambda架构 -维护两套项目&#xff0c;开发和维护成本高 -两套链路&#xff0c;数据容易不一致 -数据计算成本大&#xff08;例如原定每小时计算一次&#xff0c;但有额外新需求需要计算两点半-三点半之间数据&#xff0c;则需要重新计算&#xff09; Kappa -过于依赖kafka消…

Fiddler下载安装使用教程(包含移动端抓包)

一、官网下载安装 Download Fiddler Web Debugging Tool for Free by Telerik 1、下载Classic版本&#xff0c;并安装 2、安装完成后展示页面如下 3、点击Tools-options&#xff0c;如图所示勾选&#xff0c;允许抓取https请求 4、点击Actions-Export Root Certificate to D…

Spring如何管理Mapper

目录 一、背景二、猜测三、源码查看步骤1、创建MapperScannerConfigurer.java2、MapperScan注解3、MapperScannerRegistrar执行registerBeanDefinitions方法4、MapperScannerConfigurer执行postProcessBeanDefinitionRegistry方法5、执行doscan6、设置beanClass7、使用jdk生成代…

【自学安全防御】三、企业双机热备和带宽管理的综合实验

实验拓扑&#xff1a; 实验任务&#xff1a; 12&#xff0c;对现有网络进行改造升级&#xff0c;将当个防火墙组网改成双机热备的组网形式&#xff0c;做负载分担模式&#xff0c;游客区和DMZ区走FW3&#xff0c;生产区和办公区的流量走FW1 13&#xff0c;办公区上网用户限制流…

解读「快意」大模型关键技术,揭秘实践中的挑战与创新

导读 2024年6月&#xff0c;GAITC 2024全球人工智能技术大会在杭州举办&#xff0c;在视觉大模型关键技术与应用主题论坛上&#xff0c;快手NLP专家林梓佳向参会者汇报了快手「快意」大模型研发过程中的多个关键技术创新&#xff0c;以及应用落地过程中的经验与挑战。 快手作…

为什么需要加密软件?2024五款电脑文件加密软件推荐

在高度数字化的2024年&#xff0c;数据安全对于个人和企业而言都显得至关重要。加密软件作为保护敏感信息的利器&#xff0c;扮演着不可或缺的角色。从个人隐私数据到企业财务记录、健康信息乃至企业核心机密&#xff0c;加密软件都能有效防止未经授权的访问。 加密软件的重要…

GitHub私有派生仓库(fork仓库) | 派生仓库改为私有

GitHub私有派生仓库 前言解决方案 前言 在GitHub上Fork的派生仓库默认为公有仓库&#xff0c;且无法修改为私有仓库。 若想创建私有的派生仓库&#xff0c;可通过GitHub的导入仓库功能实现&#xff0c;具体步骤请参见下文解决方案。 解决方案 打开GitHub页面&#xff0c;在个…

06.截断文本 选择任何链接 :root 和 html 有什么区别

截断文本 对超过一行的文本进行截断,在末尾添加省略号(…)。 使用 overflow: hidden 防止文本超出其尺寸。使用 white-space: nowrap 防止文本超过一行高度。使用 text-overflow: ellipsis 使得如果文本超出其尺寸,将以省略号结尾。为元素指定固定的 width,以确定何时显示省略号…

One-Class SVM

前提知识&#xff1a;支持向量机&#xff08;SVM&#xff09;-CSDN博客 主要思想 找一个超平面将样本中的正例圈出来&#xff0c;预测就是用这个超平面做决策&#xff0c;在圈内的样本就认为是正样本&#xff0c;圈外的是其他样本&#xff0c;如图1所示&#xff1a; 图1 OSVM…

怎样在 PostgreSQL 中优化对大表的分区裁剪和索引选择?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样在 PostgreSQL 中优化对大表的分区裁剪和索引选择一、分区裁剪&#xff1a;精准切割&#xff0c;提…

中科微电子ATGM336H GPS定位模块STM32应用

文章目录 前言1. 中科微电子ATGM336H的使用1.1 ATGM336H引脚说明1.2 数据帧介绍1.3 经纬度介绍1.4 ATGM336H的启动方式 2 数据处理前置C语言知识2.1 strstr函数2.2 memset函数2.3 memcpy函数2.4strtod函数 3. 开始移植3.1 usart初始化程序3.2 串口中断接收函数3.4 数据帧的解析…

【日常记录】【插件】excel.js导出的时候给单元格设置下拉选择、数据校验等

文章目录 1. 代码基本结构2. 导出的excel 某单元格的值设置为下拉选择3. 如何把下拉选择项设置为动态4. 单元格设置校验、提示5. 在WPS上的设置 1. 代码基本结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><…

推出全新的ZL3079x、ZL3069x、ZL3066x同步器,优化用于5G运输和无线基础设施设备

一、单通道、双通道和三通道IEEE1588/SyncE网络同步器 ZL3079x提供1个、2个和三个独立的组合硬件和软件平台定时通道&#xff0c;包括IEEE 1588-2008精确时间协议栈和同步算法。该设备使用miTimePLL定时技术&#xff0c;为5G传输和无线基础设施设备提供新的改进功能。该器件非…

文章六:Java中的同步机制

目录 6.1 引言 同步机制在并发编程中的作用 本文的内容结构 6.2 synchronized关键字 使用synchronized进行线程同步 同步方法示例 synchronized的底层实现 6.3 显式锁 ReentrantLock的使用和优势 ReentrantLock示例 Condition接口和多条件等待的示例 Condition示例…