python爬虫之request库的使用(友好版)

news/2024/7/19 11:48:18 标签: python, 爬虫, 开发语言

以下所有爬取的网站都是可以爬取的,爬取时请先学学法律哦~

如有侵权,私信删除~

本章目录~。~

一,request库简介:

二,requests使用方法

1.GET请求

1.1,发起一个get请求

1.2,利用GET请求发送额外的信息

1.4,抓取网页信息

 1.5 抓取网页二进制数据(照片,视频,音频)

 1.6,请求头部(帮助我们转为浏览器的样式)

2.POST请求

2.1 POST请求访问

 2.2 POST请求的响应

2.2.1 网页访问状态码的几种结果:

3.requests高级用法

3.1文件上传 

3.2Cookie获取

3.3 Session维持

3.4 SLL证书验证

 3.5 超时设置

3.6 身份认证

 3.7 代理设置


一,request库简介:

        1,Requests是一个Python中的HTTP库,用于向Web服务器发送HTTP请求并获取响应。Requests库的使用方式与urllib库类似,但更加简单和灵活。Requests库支持HTTPS请求,并且可以自动处理cookies和会话,使得操作更加方便。

Requests库的主要特点如下:

  1. 简单易用:Requests库的使用方式简单明了,可以很容易地编写出高效、可靠的HTTP请求。
  2. 自动处理cookies和会话:Requests库可以自动处理cookies和会话,使得在处理Web服务器时更加方便和安全。
  3. 支持HTTPS:Requests库支持HTTPS请求,可以在安全的环境下发送HTTP请求。
  4. 可靠性高:Requests库的请求是异步的,这意味着它们可以在后台异步执行,不会阻塞主线程。此外,Requests库还支持连接池,可以确保每次请求都会使用相同的连接,提高了请求的可靠性。
  5. 多路复用:Requests库支持多路复用,可以将请求分派给多个异步线程处理,提高了处理效率。

2,安装下载

python">pip install requests

3,了解GET请求和POST请求

        HTTP中最常见的两种请求GET和OPST。

        GET请求:就是在浏览器中输入网址加回车就是GET请求,请求参数会直接包含到网址里,例如我们在百度搜索爬虫关键字,就会包含到请求的URL中

        

         POST请求:大多数在提交表单时发起的,例如在登录页面输入账号密码后,点击登录后通常以POST请求将数据以表单的形式传输,不会提现在URL中

        GET和POST是两种最常见的HTTP请求方法,它们在客户端与服务器之间传输数据时有一些关键区别:

  1. 用途:GET主要用于请求数据,而POST主要用于提交数据。GET请求用于获取数据,不会改变服务器上的数据;POST请求用于创建或更新服务器上的数据。
  2. 数据传输方式:GET请求将参数附加在URL上,参数之间使用&符号分隔。POST请求则将数据放在HTTP请求的消息体中,使用特定的编码格式。
  3. URL中的参数:GET请求中的参数是可见的,因为它们直接附加在URL上。这可能导致安全性问题,因为敏感信息可能会泄露。POST请求中的参数不会显示在URL中,因此相对更安全。
  4. 数据大小限制:GET请求对数据大小有限制,因为浏览器和服务器对URL长度有限制。POST请求没有这种限制,可以传输大量数据。
  5. 缓存:GET请求的响应通常会被浏览器缓存,而POST请求的响应通常不会被缓存。因此,使用GET请求可能会导致浏览器显示过时的数据,而POST请求不会。
  6. 幂等性:GET请求是幂等的,意味着无论请求多少次,服务器上的数据都不会发生变化。POST请求不是幂等的,因为每次请求都可能在服务器上创建或修改数据。
  7. 书签和历史记录:GET请求可以被添加到书签和浏览器历史记录中,而POST请求不会被添加。
  8. 服务器负载:一般来说,POST请求比GET请求对服务器产生更多的负载,因为POST请求可能需要处理更大的数据量和更复杂的操作。

二,requests使用方法

1.GET请求

1.1,发起一个get请求

python">import requests as rq  #别名为rq

# 该网页会判断客户端发起的请求是否为GET请求
url = "https://www.httpbin.org/get"
rq = rq.get(url)  # 发起GET请求
print(rq.text)  # 将内容转为text格式

如果成功发送了GET请求那么会返回一下结果: 

1.2,利用GET请求发送额外的信息

例如,我们要出入name值和age值:

python">import requests as rq

# 设定参数,以字典的形式传入
data = {
    "name": "张三",
    "age": "22"
}
# 该网页会判断客户端发起的请求是否为GET请求
url = "https://www.httpbin.org/get"
rq = rq.get(url, params=data)  # 发起GET请求,并用params传入设定参数
print(rq.text)  # 将内容转为text格式

传入的参数中如果带中文,那么久会自动转为十六进制的信息

如图: 

1.3,返回JSON格式数据方法

如果网页返回的类型虽然是str类型,但是它时JSON格式,如果想直接解析并返回结果,得到一个json格式的数据,可以直接调用json方法

python">import requests as rq


# 该网页会判断客户端发起的请求是否为GET请求
url = "https://www.httpbin.org/get"
rq = rq.get(url)  # 发起GET请求,并用params传入设定参数
print(f"字符串格式:{type(rq.text)}")  # 直接返回的格式类型为字符串
print(f"转为json格式:{type(rq.json())}")  # 转为json格式
print(f"json格式输出内容:{rq.json()}")  # 转为json格式

可以发现调用json格式的字符串转为了字典 

1.4,抓取网页信息

我想抓取以下网页的电影标签:Scrape | Movie

进入网页--摁F12进入开发者模式---用左上角 小箭头点击电影名字,可以看到该名字在h2的二号标题下 

当我们想抓取该网站的时候会出现以下错误:

python">requests.exceptions.SSLError: HTTPSConnectionPool(host='ssr1.scrape.center', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)')))

当出现该错误表示 “请求异常,SSL错误”解决办法就是引用urllib3的disable_warnings()来关闭警告,在用verify=False的方式关闭ssl认证,但还有其他方式请走链接:

(16条消息) requests.exceptions.SSLError 请求异常,SSL错误,证书认证失败问题解决_Xin学数据的博客-CSDN博客https://blog.csdn.net/qq_45476428/article/details/107254054

python">import requests as rq
import urllib3
urllib3.disable_warnings()  # 关闭不安全请求警告


url = "https://ssr1.scrape.center/"
# 发起GET请求,并用params传入设定参数,传入 verify=False 避免ssl认证
request = rq.get(url, verify=False)  
print(request.text) # 以text的格式返回

抓取到网页返回结果以后,想要提取h2包裹的电影名称,那么我们就用正则表达式的方式去提取

 那么正则表达式不熟悉的小伙伴请走一下链接:

(16条消息) Python3正则表达式_i鲸落i的博客-CSDN博客

 那么我们截取h2标题下的内容就可以了:

python">import requests as rq
import urllib3
import re

urllib3.disable_warnings()  # 关闭不安全请求警告


url = "https://ssr1.scrape.center/"
# 发起GET请求,并用params传入设定参数,传入 verify=False 避免ssl认证
request = rq.get(url, verify=False)
pattern = re.compile('<h2.*?>(.*?)</h2>', re.S) # 截取h2标题的内容,包括换行符在内的任意字符(. 不包括换行符)
titles = re.findall(pattern, request.text)
print(titles)

 抓取后的内容:

 1.5 抓取网页二进制数据(照片,视频,音频)

例如我们要抓取莫网站的免费音乐下载到本地:

打开网页---点到音乐详情---摁F12打开开发者模式----找到.mp3结尾的网址,发起请求即可 

例如:

我们知道图片,视频,音频这些文件本质上就是二进制吗组成的,所以我们在抓取网页的时候,将抓取的信息以二进制的信息转为字节码格式写入到文件中,保存下来就是一个完整的文件

文件写入,读取不会的可以走以下链接:

链接先等等 马上补上0.0 或者 自行百度,回头我会更新哈~

python">import requests as rq

url = "https://lu-sycdn.kuwo.cn/dddd43c69c11a0cf9a27988208dea300/645c9a7e/resource/n3/6/44/3638605905.mp3"
request = rq.get(url)  
# 当我们直接抓取返回数据的时候是二进制数据,会乱码,所以我们要将二进制码写到文件中
with open('可能.mp3', 'wb') as f:
    # content 转为字节码,也就是转为二进制的方式写入文件中
    f.write(request.content)

 抓取后的效果: 双击就可以播放啦

 

 1.6,请求头部(帮助我们转为浏览器的样式)

        在上面的实验中我们没有添加请求头部,这样的话在某些网站会发现这并不是一个正常的浏览器发送的请求信息,于是返回错误的结果或者异常报错,所以我们添加请求头部的方式如下:

随便找一个网页打开---摁下F12---找到user-Agent,就是你浏览器的头部信息,复制下来并以字典的格式定义一个变量加入到访问请求中

 在请求网页的时候加入:

python">import requests as rq

# 定义请求头部
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62"
}

url = "https://lu-sycdn.kuwo.cn/dddd43c69c11a0cf9a27988208dea300/645c9a7e/resource/n3/6/44/3638605905.mp3"
request = rq.get(url, headers=headers) # 将请求头部加入到get访问请求中

2.POST请求

2.1 POST请求访问

POST请求与GET请求类似,例如:我们访问一个可以测试post的网页

python">import requests as rq


# 定义请求头部
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62"
}

data = {'name': "zhangsan", "password": "123456"}  # 定义发起请求的数据
url = "https://www.httpbin.org/post" # 测试post请求的网址
request = rq.post(url=url, headers=headers, data=data) # data字样就是定义传输的数据所用
print(request.text)

会将我们的内容传入到网页中,并返回 

 2.2 POST请求的响应

当我们用post请求访问网页的时候,如何将页面中的信息(状态码,响应头等)返回呢?

python">import requests as rq


# 定义请求头部
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62"
}

# data = {'name': "zhangsan", "password": "123456"}
url = "https://www.baidu.com"
request = rq.get(url=url, headers=headers)
print(f"访问网页状态码:{request.status_code}")
print(f"访问网页头部信息:{request.headers}")
print(f"访问网页cookies:{request.cookies}")
print(f"访问网页网址:{request.url}")
print(f"访问网页历史:{request.history}")

测试结果:

2.2.1 网页访问状态码的几种结果:

  • 200:服务器正常响应。
  • 404:未找到请求的内容。
  • 500:服务器内部错误。
  • 503:服务器临时维护。
  • 403:禁止访问。
  • 301:永久重定向。
  • 302:重定向。
  • 303:可重定向。
  • 307:临时重定向。
  • 400:不允许的请求。
  • 401:未授权。
  • 402:付款表单未提交。
  • 403:禁止访问。
  • 404:未找到请求的内容。
  • 405:方法不受支持。
  • 406:不接受 HTTP 方法。
  • 407:请求的 URI 不合法。
  • 408:重复请求。
  • 409:冲突。
  • 410:超时。
  • 411:未知错误。
  • 412:格式错误。
  • 413:请求太大。
  • 414:不允许的请求体。
  • 415:未描述的错误。
  • 416:不支持的媒体类型。
  • 417:请求包含无效的参数。
  • 418:未处理的错误。
  • 429:过载。
  • 500:服务器内部错误。
  • 503:服务器临时维护。
  • 504:服务器遇到错误。
  • 505:网络错误。

----------------------------------以上就是request的基本操作-----------------------------------------------

3.requests高级用法

requests库高级用法,例如文件上传,Cookie设置,代理设置等

3.1文件上传 

我们随便传一张很小的图片到网页上试试看:

python">import requests as rq


# 定义请求头部
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62"
}

data = {'picture': open('1.png', 'rb')}  # 以二进制的方式读取文件内容
url = "https://httpbin.org/post"  
request = rq.post(url, files=data) # 将文件以二进制的方式传入到网页中
print(request.text)

运行结果:

上传文件后,网站会返回响应,响应中包含files字段和from字段,而from字段是空的,证明文件上传部分会单独用一个files字段来标识

3.2Cookie获取

3.2.1Cookie的作用:

Cookie是一种用于在Web应用程序中保存敏感信息,例如登录信息、个人身份验证码等,以便在用户与Web应用程序之间提供一个安全的通信通道。

Cookie的作用如下:

  1. 存储会话信息:Cookie允许您在不同的Web浏览器之间共享会话状态,这样您就可以在多个浏览器之间保持一致的用户体验。
  2. 提供安全性:Cookie只能在已经登录的用户之间传输,这样就可以防止未经授权的用户访问敏感信息。
  3. 加快网站的响应速度:由于Cookie只存储一次会话信息,因此可以减少网站的响应时间,提高用户的访问体验。
  4. 改进移动设备浏览体验:Cookie在移动设备上也能很好地工作,因为它们不会像浏览器那样被缓存。
  5. 支持跨域请求:Cookie可以允许来自不同域名的浏览器访问您的网站,这样就可以轻松地实现跨域资源共享。

需要注意的是,Cookie的使用也存在一些安全风险,如跨站脚本攻击(XSS)和中间人攻击等,因此应该采取一些措施来保护Web应用程序和用户的安全。

3.2.2获取Cookie:

当我们打开一个网页的时候---摁F12打开开发者模式----接着找到右边的cookie即可 

找到cookie以后将他加入到我们访问的头部即可,以字典的形式添加

例如:

 在访问请求时加入即可

3.3 Session维持

简介:

Session(会话)是一种在Web应用程序中用于管理用户身份验证和数据共享的机制。在Web应用程序中,每个用户都有一个唯一的会话ID,用于标识他们在Web应用程序中的身份。会话是用户与Web应用程序之间的关键部分,它允许用户在应用程序中进行相互操作,例如创建、更改和删除表单数据、上传文件和浏览历史记录等。

在传统的Web应用程序中,会话通常由服务器端的脚本语言(如PHP、Python和Ruby)或服务器端的框架(如Apache和Nginx)来管理。这些脚本或框架会在每次用户请求时生成一个新的会话ID,并将其存储在服务器端的数据库中。每次用户请求的响应都会包含一个包含新会话ID的响应头,以便服务器可以识别当前会话的状态。

在现代的Web应用程序中,会话管理已经变得更加容易和自动化。许多Web服务器和框架都提供了内置的会话管理功能,例如Nginx的session模块和PHP的session函数。这些功能可以自动处理会话的创建、存储、刷新和销毁等操作,并确保会话的安全性和可靠性。

为了维护会话,Web应用程序通常会在用户请求的处理过程中跟踪当前会话的状态,并在用户会话结束时将其状态刷新为“不活动”状态。这可以通过在服务器端存储会话ID并在每次请求的响应头中包含一个过期时间来实现。当用户会话过期时,服务器会将其状态刷新为“不活动”状态,并从数据库中删除相关数据。这可以通过定期重置会话ID和清理无用数据来确保会话的高可用性和安全性。

request如何实现呢?

例如:

python">import requests as rq

# 首先加入Session会话保持
s = rq.Session()
# 在访问请求的时候加入往里面传入的cookies # “/number/123”这就是我们加入的cookies
url = "https://www.httpbin.org/cookies/set/number/123"
request = s.get(url)
print(request.text)

输出结果:

         所以,利用Session可以做到模拟同一个会话而不用担心cookie的问题,它通常在模拟登录成功之后,进行下一次操作的时会用到。

3.4 SLL证书验证

        当我们访问一个网页的时候会出现,如图的问题,那么我门通过代码的方式绕开ssl认证,直接访问网页内容:

例如:

我们访问该网页  https://ssr2.scrape.center/

SLL证书提示:“连接不是私密连接”

我们通过get请求直接访问会出现以下问题:

requests.exceptions.SSLError: HTTPSConnectionPool(host='ssr2.scrape.center', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:997)')))

通过以下方式绕开:

# 在请求网页的时候将verify参数设置为False 表示忽略ssl证书验证

python">import requests as rq

url = "https://ssr2.scrape.center/"
# 在请求网页的时候将verify参数设置为False 表示忽略ssl证书验证
request = rq.get(url,verify=False)
print(request.text)

这样访问网页会提示我们url的证书时无效的,不过页面内容以及反馈给我们了:

 消除以上提示的方法如下:

看这个博客即可,上面也有类似的问题,所以这个地方是给直接跳到这部分的小伙伴看的哈~

(42条消息) requests.exceptions.SSLError 请求异常,SSL错误,证书认证失败问题解决_Xin学数据的博客-CSDN博客

 3.5 超时设置

        当我们访问一个页面的时候为了提升效率设置一个超时时间,如果规定时间内没有及时反馈信息,那么我们就让它异常报错即可,我们在请求中加入timeout参数即可

请求分为两个阶段:连接(connect)和读取(read)

以下是timeout的几种写法:

python">import requests as rq

url = "https://www.baidu.com/"
# 超过0.1秒没有反馈,就抛出异常
request = rq.get(url, timeout=0.1)
# 如果分别指定作用连接和读取的timeout 可以传入一个元组的方式
request = rq.get(url, timeout=(5, 30))
# 如果想永久等待 直接等于None,或者直接不加
request = rq.get(url, timeout=None)
request = rq.get(url)

3.6 身份认证

当我们遇到以下页面的时候,需要输入账户密码:

https://ssr3.scrape.center/

这个网站就是启用了基本身份认证

我门想得到该网页的信息用代码登录的方法如下:

可以通过requests库自带的身份验证功能auth参数

python">import requests as rq
from requests.auth import HTTPBasicAuth
import urllib3

# 关闭安全警告
urllib3.disable_warnings()

url = "https://ssr3.scrape.center"
request = rq.get(url, auth=HTTPBasicAuth('admin', 'admin'), verify=False)
print(request.status_code)  # 返回该网页请求的状态码
print(request.text)  # 将网页内容以text格式返回

 运行结果:

 3.7 代理设置

        在我们访问网站在测试的时候,请求几次都可得到返回的内容,但开始大规模爬取,频繁请求的时候,这些网页会跳出验证码或者其他认证网页,也可能直接对你的IP进行封禁,导致一定时间无法访问,那么为了防止这种情况,我们需要代理设置来解决问题,这时候需要用到proxies参数。当然还有一种方式那就是挂vpn。这里并不就不尝试了,就来说说proxies参数

使用 requests 库发送请求时,可以通过设置 proxies 参数来使用代理服务器。proxies 参数是一个字典,包含 http 和 https 两个键,分别对应 http 和 https 请求的代理地址。

python">import requests as rq

proxies = {
    "http:": "http://1.234.178.32:24200",
    "https:": "http://1.234.178.32:24200"
}

# 网页
url = "http://httpbin.org/ip"
# proxies 代理参数
request = rq.get(url, proxies=proxies)
print(request.status_code) # 网页请求返回值,200为正常
print(request.text.encode("utf-8")) # 将网页内容以text格式返回,字符级为utf8

        在上述代码中,我们首先定义了一个proxies字典,其中包含http和https两个键,分别对应代理服务器的地址。然后,在发送http请求时,我们将proxies参数设置为proxies字典,requests库会自动使用代理服务器发送请求。最后,我们打印出响应内容。

注意,在设置代理服务器地址时,必须包含连接方式(http或https)。同时,需要根据实际需要选择代理服务器的地址和端口号。

运行结果:

该ip是你的本机ip地址,如果网页有反代理技术,那么可以使用vpn的方式破解

还有一种代理方式SOCKS:

        SOCKS代理是一种计算机代理服务器,它能够为用户提供更高级别的网络连接和数据传输服务。SOCKS代理是一种全能代理,支持多种网络协议和数据传输方式,包括HTTP、FTP、SSH等。它可以将一端的系统连接到另外一端,提供更高效、更安全的数据传输服务。SOCKS代理标准端口为1080。

        这里不进行演示了~自行研究吧~

#注意:这里有代理,那么就有反向代理

        反向代理(Reverse Proxy)是一种代理服务器技术,它主要用于将来自客户端的请求转发到后端服务器。反向代理服务器位于后端服务器的前端,它接收来自客户端的请求,并将其转发到后端服务器。后端服务器处理完请求后,将结果返回给反向代理服务器,反向代理服务器再将结果返回给客户端。

        反向代理的主要功能包括缓存、负载均衡和安全性。它可以缓存静态内容,减少对后端服务器的请求,提高网站的性能和可靠性。同时,反向代理还可以作为负载平衡器,将请求路由到多个后端服务器,提高网站的并发能力和可用性。此外,反向代理还可以隔离客户端和后端服务器,提高网站的安全性。

        反向代理可以通过两种方式实现:一种是多个网站的web服务器提供代理,其域名都指向反向代理服务器;另一种是为网站的web服务器集群提供代理,反向代理作为负载平衡器来决定哪个Web服务器接收请求。

        总之,反向代理是一种重要的代理服务器技术,它可以提供缓存、负载均衡和安全性等功能,提高网站的性能、可靠性和安全性。

反向代理的技术让我们电脑端的ip一样会出现在网页中:

本次内容大概这么多,感谢观看~


http://www.niftyadmin.cn/n/353758.html

相关文章

chatgpt赋能Python-python_qrcode解码

Python QR码解码&#xff1a;了解QR码及其在Python中的使用 QR码&#xff08;Quick Response Code&#xff09;也被称为二维条码&#xff0c;是一种可以储存文本、链接等信息的矩阵条码。QR码已广泛应用于各个行业&#xff0c;例如商业广告、政府宣传、电子票据等领域。Python…

总结877

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;1800基础部分&#xff0c;背诵15篇短文&#xff0c;熟词僻义300词基础词&#xff09; 周目标&#xff1a;1800高等数学相应的习题并记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#xff09; 线…

17.plantUML画类图的语法、组合关系和聚合关系之间的区别

文章目录 plantUML画类图的语法组合关系和聚合关系之间的区别依赖关系和关联关系的区别一个类图语法示例 plantUML画类图的语法 泛化关系就是继承关系 语法解释&#xff1a;<|-- 表示组合&#xff0c;<|-表示继承 表示 public&#xff0c; #表示protect - 表示 private…

第1章 初识软件工程-测验题--作业

软件工程方法是&#xff08;B &#xff09;。 为了获得高质量软件而实施的一系列活动为开发软件提供技术上的解决方法为支持软件开发、维护、管理而研制的计算机程序系统为了理解问题和确定需求而采取的一些技术和方法下面的&#xff08;B &#xff09;是正确的。 运行正确的软…

chatgpt赋能Python-python_print快捷键

Python print快捷键——简化开发效率 作为Python开发者&#xff0c;我们经常需要使用print语句来调试代码。然而&#xff0c;在大型项目中&#xff0c;如果频繁使用print并手动打印变量名称和内容&#xff0c;会浪费大量时间&#xff0c;影响开发效率。此时&#xff0c;使用Py…

chatgpt赋能Python-python_pensize

Python Pensize: How to Adjust Your Pen Size in Python If you’re new to Python, you might be struggling to master the art of the pen. Thankfully, Python Pensize is here to help. In this article, we’ll discuss how to adjust your pen size in Python so you …

数据结构与算法之霍夫曼树

霍夫曼树是一种压缩数据的方法&#xff0c;它利用了不同字符出现的概率不同的特点&#xff0c;将出现概率较小的字符用较少的比特表示&#xff0c;从而达到压缩数据的目的。霍夫曼树的建树方法简单高效&#xff0c;对于大量词频不同的文本&#xff0c;能够有效地压缩数据。 本…

Packet Tracer - 综合技能练习(配置 VLAN 间路由、配置静态路由以及默认路由)

Packet Tracer - 综合技能练习 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 VLAN R1 S0/0/0 172.31.1.2 255.255.255.0 不适用 不适用 G0/0.10 172.31.10.1 255.255.255.0 不适用 10 G0/0.20 172.31.20.1 255.255.255.0 不适用 20 G0/0.30 172.31.…