LOADING

加载过慢请开启缓存 浏览器默认开启

2023/11/7

爬虫授课:web网络请求、抓包

计算机网络是指两台或更多的计算机组成的网络,在同一个网络中,任意两台计算机都可以直接通信,因为所有计算机都需要遵循同一种网络协议。

那什么是互联网呢?互联网是网络的网络(internet),即把很多计算机网络连接起来,形成一个全球统一的互联网。

对某个特定的计算机网络来说,它可能使用网络协议ABC,而另一个计算机网络可能使用网络协议XYZ。如果计算机网络各自的通讯协议不统一,就没法把不同的网络连接起来形成互联网。因此,为了把计算机网络接入互联网,就必须使用TCP/IP协议。

TCP/IP协议泛指互联网协议,其中最重要的两个协议是TCP协议和IP协议。只有使用TCP/IP协议的计算机才能够联入互联网,使用其他网络协议(例如NetBIOS、AppleTalk协议等)是无法联入互联网的。

IP地址

在互联网中,一个IP地址用于唯一标识一个网络接口(Network Interface)。一台联入互联网的计算机肯定有一个IP地址,但也可能有多个IP地址。IP地址分为IPv4和IPv6两种。IPv4采用32位地址,类似101.202.99.12,而IPv6采用128位地址,类似2001:0DA8:100A:0000:0000:1020:F2F3:1428

例如,百度的首页的网络接口ip地址为:14.215.177.39,大家可以尝试直接通过ip地址来访问百度的首页

域名/网址/url

因为直接记忆IP地址非常困难,如果每次都用ip地址来访问百度首页会很麻烦,所以我们通常使用域名访问某个特定的服务。百度的首页域名大家都知道: www.baidu.com

**为什么可以通过域名访问呢?有个域名解析服务器DNS专门负责把域名(www.baidu.com)翻译成对应的IP(14.215.177.39)**,客户端再根据IP地址访问服务器。

有一个特殊的本机域名localhost,它对应的IP地址总是本机地址127.0.0.1

常用协议

IP协议是一个分组交换,它不保证可靠传输。而TCP协议是传输控制协议,它是面向连接的协议,支持可靠传输和双向通信。TCP协议是建立在IP协议之上的

区别:简单地说,IP协议只负责发数据包,不保证顺序和正确性,而TCP协议负责控制数据包传输,它在传输数据之前需要先建立连接,建立连接后才能传输数据,传输完后还需要断开连接。TCP协议之所以能保证数据的可靠传输,是通过接收确认、超时重传这些机制实现的。并且,TCP协议允许双向通信,即通信双方可以同时发送和接收数据。

TCP协议也是应用最广泛的协议,许多高级协议都是建立在TCP协议之上的,例如HTTP、SMTP等。

———————————————————————————————————-

从这里开始,会先把web网络请求的理论内容先过一遍(会比较枯燥),然后再带大家实操一下

HTTP协议

什么是HTTP?HTTP就是目前使用最广泛的Web应用程序使用的基础协议,例如,浏览器访问网站,手机App访问后台服务器,都是通过HTTP协议实现的。

HTTP是HyperText Transfer Protocol的缩写,翻译为超文本传输协议,它是基于TCP协议之上的一种请求-响应协议。

我们来看一下浏览器请求访问某个网站时发送的HTTP请求-响应。当浏览器希望访问某个网站时,浏览器和网站服务器之间首先建立TCP连接,然后,浏览器向服务器发送一个HTTP请求,服务器收到后,返回一个HTTP响应,并且在响应中包含了HTML的网页内容,这样,浏览器解析HTML后就可以给用户显示网页了。一个完整的HTTP请求-响应如下:

            GET / HTTP/1.1
            Host: www.sina.com.cn
            User-Agent: Mozilla/5 MSIE
            Accept: */*                ┌────────┐
┌─────────┐ Accept-Language: zh-CN,en  │░░░░░░░░│
│O ░░░░░░░│───────────────────────────>├────────┤
├─────────┤<───────────────────────────│░░░░░░░░│
│         │ HTTP/1.1 200 OK            ├────────┤
│         │ Content-Type: text/html    │░░░░░░░░│
└─────────┘ Content-Length: 133251     └────────┘
  Browser   <!DOCTYPE html>              Server
            <html><body>
            <h1>Hello</h1>
            ...

HTTP请求的格式是固定的,它由 1、请求头(HTTP Header)和2、请求体(HTTP Body)两部分构成

请求头会标注出请求方法 路径 HTTP版本,例如,GET / HTTP/1.1表示使用GET请求,路径是/,版本是HTTP/1.1

请求头是按键值对的格式阻滞信息的,即Header: Value格式,我们称为HTTP Header,服务器依靠某些特定的Header来识别客户端请求,例如:

  • Host:表示请求的域名,因为一台服务器上可能有多个网站,因此有必要依靠Host来识别请求是发给哪个网站的;
  • User-Agent:表示客户端自身标识信息,不同的浏览器有不同的标识,服务器依靠User-Agent判断客户端类型是IE还是Chrome,是Firefox还是一个Python爬虫;
  • Accept:表示客户端能处理的HTTP响应格式,*/*表示任意格式,text/*表示任意文本,image/png表示PNG格式的图片;
  • Accept-Language:表示客户端接收的语言,多种语言按优先级排序,服务器依靠该字段给用户返回特定语言的网页版本。

HTTP响应也是由响应头(Header)和响应体(Body)两部分组成

响应头会标注出HTTP版本 响应代码 响应说明,例如,HTTP/1.1 200 OK表示版本是HTTP/1.1,响应代码是200,响应说明是OK。客户端只依赖响应代码判断HTTP响应是否成功。HTTP有固定的响应代码:

  • 1xx:表示一个提示性响应,例如101表示将切换协议,常见于WebSocket连接;
  • 2xx:表示一个成功的响应,例如200表示成功,206表示只发送了部分内容;
  • 3xx:表示一个重定向的响应,例如301表示永久重定向,303表示客户端应该按指定路径重新发送请求;
  • 4xx:表示一个因为客户端问题导致的错误响应,例如400表示因为Content-Type等各种原因导致的无效请求,404表示指定的路径不存在;
  • 5xx:表示一个因为服务器问题导致的错误响应,例如500表示服务器内部故障,503表示服务器暂时无法响应。

GET和POST请求

HTTP请求有很多种方式,但是HTTP响应却都一样,这里介绍两种常见的HTTP请求方法,也是爬虫最常用的:GET和POST

我们之前说过,HTTP请求包括请求头和请求体,GET和POST请求最大区别在于:GET请求的请求体必须反映在 域名(即url)中,而POST请求不需要

例如,如果你想登录校园网,那么你肯定得输入账号和密码;如果校园网靠GET请求登录,那么GET请求会把账号和密码明文组织在校园网url的?后面;而如果靠POST,则你在url中看不到账号和密码,相对来说,POST请求“稍微”安全一些

HTML、CSS与JavaScript简介 以及json格式文件

通过HTTP协议,我们可以得到远程服务器发送给我们的内容,这些内容一般称为“前端”内容,我们爬虫主要获得的信息就来源于服务器返回给我们的前端内容(bilibili页面呈现),后端私密内容(bilibili所有账户、密码,还有大会员信息等)较难获得且很大概率违法。

HTML、CSS和JavaScript就是浏览器主要发送给我们的“前端”内容。

HTML:超文本标记语言,浏览器通过返回的HTML语言组织并呈现出页面,!!!!并且根据HTML语言进一步发出更多资源请求,比如别人在HTML语言中插入一个<img>标签,并在标签中给出了对应图片资源的url,那么浏览器会“自动”根据这个url“自动”再发一次请求,去请求这张图片的资源!!!!

CSS:浏览器通过CSS渲染页面,主要起美化作用

JavaScript:脚本语言,和Python其实是同一类,你可以把浏览器内核视作JavaScript的解释器,主要作用有提高安全性,实现复杂的功能并动态呈现页面

json:也是一种键值对形式的数据,例如 {“xiaoming”:”24”},注意它可以迭代,值可能是另一个键值对

总结

前面讲了一大堆概念,可能会有些绕,现在来总结下HTTP通信的一个基本过程

你在浏览器键入url后,DNS将其解析为ip地址,浏览器通过ip地址访问到远程服务器,远程服务器根据请求头(记录GET/POST请求类型、允许接收的语言类型…)和请求体(可能是你的登录账号和密码),返回响应体和响应体(HTML内容),浏览器再根据响应头和响应体呈现页面,并同时发出更多的资源请求(CSS、JS、请求图片、视频链接等),然后再把请求到的资源渲染呈现,最终得到我们“看到”的页面

即:

域名解析 —> 与服务器建立连接 —> 发起HTTP请求 —> 服务器响应HTTP请求,浏览器得到html代码 —> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片) —> 浏览器对页面进行渲染呈现给用户

实际上url不仅仅是自己键入的,你点击视频链接、点击“登录”按钮,都相当于发送一次url

实操讲解