2021-12-06 python之requests三方库1-http协议

摘要

准备系统地学习下python的三方库 - requests。python自带的urllib, urllib3就不写了。
参考书籍是另一位大佬的
系统环境:MacOS,python3
参考内容:Requests API参考书籍下载

预备知识

HTTP的消息结构

参考资料:https://www.runoob.com/http/http-messages.html
有两种类型的消息:客户端到服务器、服务器到客户端
消息结构都有三部分:起始行、头域、空行、消息体

起始行头域空行消息体
客户端请求消息请求行(request line)请求头(header)空行请求体
服务器响应消息响应行响应头空行响应体

HTTP请求消息

参考资料:https://www.runoob.com/http/http-methods.html
在这里插入图片描述

  1. 请求行
    HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
    HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
序号方法描述
1GET请求指定的页面信息,并返回实体主体。
2HEAD类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
3POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件,数据被包含在请求体中。
POST 请求可能会导致新的资源的建立和/或已有资源的修改。
4PUT从客户端向服务器传送的数据取代指定的文档的内容。
5DELETE请求服务器删除指定的页面。
6CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
7OPTIONS允许客户端查看服务器的性能。
8TRACE回显服务器收到的请求,主要用于测试或诊断。
9PATCH是对 PUT 方法的补充,用来对已知资源进行局部更新 。
  1. 请求头
方法描述
Accept浏览器声明请求接收的文件类型。
Accept-Encoding浏览器声明接受的响应内容的编码格式。
Accept-Language浏览器声明其接受的自然语言类型。
Connection浏览器声明此次请求的连接模式。
Cookie浏览器发出的为了声明本次请求的身份、便于进行 session 跟踪而储存在本地的数据。
通常由键值对组成,常用于用户身份的持久化认证。
Host表示浏览器请求的主域名。
User-Agent浏览器的标识。不同操作系统、不同版本、不同厂商的浏览器的标识各不一致。
  1. 请求体
    通常只有post、put请求方法会用到。

HTTP响应消息

参考资料:https://www.runoob.com/http/http-status-codes.html
在这里插入图片描述

  1. 响应行
    响应行即是状态码,由三个十进制数字组成,第一个十进制数字定义了状态码的类型。
    响应分为五类:信息响应(100–199),成功响应(200–299),重定向(300–399),客户端错误(400–499)和服务器错误 (500–599)。
分类分类描述
1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误

常见的HTTP状态码:

状态码说明
200请求成功
301资源(网页等)被永久转移到其它URL
404请求的资源(网页等)不存在
500内部服务器错误
  1. 响应头
key说明
Connection表示这个 HTTP 连接的模式
Content-Encoding表示响应实体的编码方式。浏览器在发送请求的时候,会通过 Accept-Encoding 头域带上自己支持的内容编码格式列表;服务器端接收到之后,会从中挑选一种用来对响应实体进行编码,并通过 Content-Encoding 响应头指明选定的格式;浏览器拿到响应正文后,依据 Content-Encoding 进行解压。
Content-Type表示响应实体的类型,用于定义响应的文件类型和网页的编码,以此来决 定浏览器以什么形式、什么编码来读取这个响应实体。
Date当前的GMT时间。
Server表示响应服务器的架构。
Transfer-Encoding表示响应实体的传输编码模式。
  1. 响应体
    网页正文

这里有更详细的说明

安装requests库

在terminal中直接安装。

pip3 install requests

注意terminal使用的是系统bash还是zsh,两个脚本的环境变量不通用,之前用的哪个就用哪个。

requests的基本使用

# 导包
import requests
# 网址
url = "https://www.baidu.com"
# 请求方式
method = "get"
# 获取内容
response = requests.request(method, url)

# 查看返回的内容
a = dir(response)
print("_______________响应结果的所有属性_______________")
for i in range(len(a)):
    if i % 5 == 0:
        print()
    print(f'{a[i]}'.ljust(25), end = ' ')

在这里插入图片描述

print("\n_______________目标地址_______________")
print(response.url)

print("\n_______________响应头_______________")
h = response.headers
for i in h:
    print(f'{i}'.ljust(20)+':'+f'{h[i]}')
# 编码方式
print("\n_______________响应体的编码方式_______________")
print(f"原编码方式:"+response.encoding)
response.encoding = "utf-8"
print(f'修改后的编码方式:'+response.encoding)
# 响应体的内容

print("\n_______________响应体的内容_______________")
print(f'通过text方法获取:\n'+response.text[:100] + "...")
print(f'通过content方法获取:\n', response.content[:100])

在这里插入图片描述

requests的正常使用

参考资料:https://docs.python-requests.org/en/latest/_modules/requests/api/#head
常这样去请求服务器:

url = "https://www.baidu.com"
r = requests.get(url)
r = requests.post(url)
r = requests.put(url)
r = requests.options(url)
...

但代码内部实际上是执行的下面这句话

method = "post"
requests.request(method, url)
...

添加请求头信息

import requests
header = {
    'Host': 'www.baidu.com',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36',
    'Connection': 'Keep-Alive',
    'Content-Type': 'text/plain; Charset=UTF-8', 'Accept-Language': 'zh-cn',
    'Cookie': '1111',
}
r = requests.get("https://www.baidu.com", headers=header)
c = requests.request("get", "https://www.baidu.com", headers=header)
# 两种方法都一样
print(r.text[:222])
print(c.text[:222])

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值