爬虫学习(01):了解爬虫超文本传输协议的理解

2023-12-19 12:40

本文主要是介绍爬虫学习(01):了解爬虫超文本传输协议的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    • 一、爬虫入门
    • 二、web请求过程(百度为例)
      • 2.1 页面渲染
        • 1. 服务器渲染 -> 数据直接在页面源代码里能搜到
        • 2. 前端JS渲染 -> 数据在页面源代码里搜不到
    • 三、浏览器工具的使用(重点)
      • 1. Elements
      • 2. Console
      • 3. Source
      • 4. Network
    • 四、超文本传输协议
      • 请求:
      • 响应:
      • https协议
        • 加密方法(三种)
          • 1. 对称密钥加密
          • 2. 非对称密钥加密
          • 3. 证书密钥加密
    • 五、总结

一、爬虫入门

什么是爬虫?

就是我们总是希望能够保存互联网上的一些重要的数据信息为己所用.
比如:

  • 在浏览到一些优秀的让人血脉喷张的图片时. 总想保存起来留为日后做桌面上的壁纸
  • 在浏览到一些重要的数据时(各行各业), 希望保留下来日后为自己进行各种销售行为增光添彩
  • 在浏览到一些奇奇怪怪的劲爆视频时, 希望保存在硬盘里供日后慢慢品鉴
  • 在浏览到一些十分优秀的歌声曲目时, 希望保存下来供我们在烦闷的生活中增添一份精彩

需要注意的是:爬取的一定是能看见的东西, 公开的一些东西.

爬虫的矛与盾

反爬机制:

  • 门户网站,可以通过制定相应的策略或者技术手段(加密),防止爬虫程序进行网站数据的爬取。

反反爬策略(JS逆向):

  • 爬虫程序可以通过制定相关的策略或者技术手段破解门户网站中具备的反爬机制,从而可以获取门户网站中相关的数据。
robots.txt协议:百度蜘蛛

俗称君子协议。规定了网站中哪些数据可以被爬虫爬取哪些数据不可以被爬取。只要在每个网站后缀加robots.txt就好了

这是淘宝网站的君子协议这是淘宝网站的君子协议

二、web请求过程(百度为例)

在访问百度的时候, 浏览器会把这一次请求发送到百度的服务器(百度的一台电脑), 由服务器接收到这个请求, 然后加载一些数据. 返回给浏览器, 再由浏览器进行显示. 需要注意的是, 百度的服务器返回给浏览器的不直接是页面, 而是页面源代码(由html, css, js组成). 由浏览器把页面源代码进行执行, 然后把执行之后的结果展示给用户. 所以我们能看到百度的源代码(就是那堆看不懂的鬼东西). 具体过程如图.
在这里插入图片描述

2.1 页面渲染

这里需要注意的是,不是所有的数据都是在页面源代码上的,有些是通过js等工具动态加载进来的,这就是页面渲染数据的过程, 我们常见的页面渲染过程有两种,一种叫做服务器渲染,另外一种叫做前端JS渲染

1. 服务器渲染 -> 数据直接在页面源代码里能搜到

我们在请求到服务器的时候, 服务器直接把数据全部写入html中, 我们浏览器就能直接拿到带有数据的html内容.
由于数据是直接写在html中的, 所以我们能看到的数据都在页面源代码中能找的到的.
这种网页一般都相对比较容易就能抓取到页面内容

2. 前端JS渲染 -> 数据在页面源代码里搜不到

这种就稍显麻烦了. 这种机制一般是第一次请求服务器返回一堆HTML框架结构. 然后再次请求到真正保存数据的服务器, 由这个服务器返回数据, 最后在浏览器上对数据进行加载. 就像这样:
在这里插入图片描述
那数据是何时加载进来的呢? 其实就是在我们进行页面向下滚动的时候, jd就在偷偷的加载数据了, 此时想要看到这个页面的加载全过程, 我们就需要借助浏览器的调试工具了(F12)
在这里插入图片描述
所以当你在页面源代码中找不到页面显示出来的数据的时候,可以在调试工具(F12)中寻找左侧相关的数据包,数据就藏在数据包里(记得先打开F12调试工具,再刷新页面,不然数据已经加载完毕,则数据包中没有内容)

三、浏览器工具的使用(重点)

浏览器是最能直观的看到网页情况以及网页加载内容的地方. 我们可以按下F12来查看一些普通用户很少能使用到的工具.
在这里插入图片描述
其中, 最重要的Elements, Console, Sources, Network前四个

1. Elements

Elements是我们实时的网页内容情况,有时候并不是页面源代码,前端JS渲染的内容也会在这上面呈现。所以这个是实时的网页内容情况

注意,

  1. 页面源代码是执行js脚本以及用户操作之前的服务器返回给我们最原始的内容
  2. Elements中看到的内容是js脚本以及用户操作之后的当时的页面显示效果.

你可以理解为, 一个是老师批改之前的卷子,一个是老师批改之后的卷子. 虽然都是卷子. 但是内容是不一样的. 而我们目前能够拿到的都是页面源代码. 也就是老师批改之前的样子. 这一点要格外注意.

Elements中我们可以使用左上角的小箭头.可以直观的看到浏览器中每一块位置对应的当前html状况. 还是很贴心的.
在这里插入图片描述

2. Console

第二个窗口, Console是用来查看程序员留下的一些打印内容, 以及日志内容的. 我们可以在这里输入一些js代码自动执行.
在这里插入图片描述

3. Source

第三个窗口, Source, 这里能看到该网页打开时加载的所有内容. 包括页面源代码. 脚本. 样式, 图片等等全部内容.
在这里插入图片描述

4. Network

第四个窗口, Network, 我们一般习惯称呼它为抓包工具. 就是刚才讲的前端JS渲染就是在这里看到的, 我们能看到当前网页加载的所有网络请求, 以及请求的详细内容. 这一点对我们爬虫来说至关重要.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、超文本传输协议

协议: 就是两个计算机之间为了能够流畅的进行沟通而设置的一个君子协定. 常见的协议有TCP/IP. SOAP协议, HTTP协议, SMTP协议等等…

不同的协议. 传输的数据格式不一样.

HTTP协议, Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议. 直白点儿, 就是浏览器和服务器之间的数据交互遵守的就是HTTP协议.

HTTP协议用的最多的是加载网页.

HTTP协议把一条消息分为三大块内容. 无论是请求还是响应都是三块内容

请求:

请求行 -> 请求方式(get/post) 请求url地址 协议
请求头 -> 放一些服务器要使用的附加信息(cookie验证,token,各式各样的反扒信息)请求体 -> 一般放一些请求参数

响应:

状态行 -> 协议 状态码 
响应头 -> 放一些客户端要使用的一些附加信息(cookie验证,token,各式各样的反扒信息)响应体 -> 服务器返回的真正客户端要用的内容(HTML,json)等 页面代码

在写爬虫的时候要格外注意请求头和响应头. 这两个地方一般都隐含着一些比较重要的内容

注意, 浏览器实际上把 HTTP的请求和响应的内容进行重组了. 显示成我们更容易阅读的效果.

在这里插入图片描述

请求头中最常见的一些重要内容(爬虫需要):

  1. User-Agent : 请求载体的身份标识(用啥发送的请求)
  2. Referer: 防盗链(这次请求是从哪个页面来的? 反爬会用到)
  3. cookie: 本地字符串数据信息(用户登录信息, 反爬的token)
  4. Content-Type:服务器响应回客户端的数据类型(str,json等类型)

响应头中一些重要的内容:

  1. cookie: 本地字符串数据信息(用户登录信息, 反爬的token)
  2. 各种神奇的莫名其妙的字符串(这个需要经验了, 一般都是token字样, 防止各种攻击和反爬)

https协议

http协议几乎相同,s表示安全,表示安全的超文本传输协议。(数据加密)

加密方法(三种)
1. 对称密钥加密

指客户端会先将即将发送给服务器端的数据进行数据加密加密的方式是由客户端自己指定的,加密完毕之后,将密文包括解密的方式(密钥)一块发送给服务器端,服务器端接收到了密钥和加密的密文数据之后,会使用密钥将密文数据进行解密,最后服务器端会获得原文数据

弊端
  • 在进行密钥和密文数据传输的过程中,很有可能会被第三方机构拦截到,可能存在数据暴露的风险
    在这里插入图片描述
2. 非对称密钥加密

针对对称加密的安全隐患,进行改良的加密方法,在使用的时候有两把锁,一把叫做“私有密钥”,一把是“公开密钥”,使用非对象加密的加密方式的时候,服务器首先告诉客户端按照自己给定的公开密钥进行加密处理,客户端按照公开密钥加密以后,服务器接收到信息再通过自己的私有密钥进行解密,这样做的好处就是解密的钥匙根本就不会进行传输,因此也就避免了被挟持的风险。就算公开密钥被窃听者拿到,它也很难进行解密,因为解密过程是对离散对数求值,这可不是轻而易举能做到的事。

缺点:
  • 1.效率比较低,处理起来更加复杂,通信过程中使用就有一定的效率问题而影响通信速度
  • 2.只要是发送密钥,就有可能有被挟持的风险,如果中间机构将公钥篡改,再发送给客户端,这样就不能保证客户端拿到的公钥一定是由服务器所创建的。

在这里插入图片描述

3. 证书密钥加密

针对非对称密钥加密的缺陷,我们没法保证客户端所拿到的公钥一定是由服务器端所创建的,引入证书密钥加密。
服务器的开发者携带公开密钥向数字证书认证机构提出公开密钥的申请,数字证书认证机构在认清申请者的身份,审核通过以后,会对开发者申请的公开密钥做数字签名,然后分配这个已经签名的公开密钥,并将密钥放在证书里面,绑定在一起。
服务器将这份数字证书发送给客户端,因为客户端也认可证书机构,客户端通过数字证书中的数字签名来验证公钥的真伪,来确保服务器传过来的公开密钥是真实的。一般情况下,证书的数字签名很难被伪造的,这取决于认证机构的公信力。一旦确认信息无误之后,客户端就会通过公钥对报文进行加密发送服务器接收到以后用自己的私钥进行解密
​​在这里插入图片描述

五、总结

  1. 你要的东西在页面源代码. 直接拿源代码提取数据即可
  2. 你要的东西,不在页面源代码, 需要想办法找到真正的加载数据的那个请求. 然后提取数据
  3. 注意遵守君子协定
  4. 请求头中常见的内容:User-Agent, referer, cookie, Content-Type

这篇关于爬虫学习(01):了解爬虫超文本传输协议的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/512193

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言