Python之Requests库的使用

Requests模块

Requests是一个功能强大的Python HTTP库,用于发送HTTP请求,获取响应数据。它简化了与HTTP资源的交互,提供了简洁且易于使用的API。

文档:https://requests.readthedocs.io/projects/cn/zh_CN/latest/

要使用Requests模块,首先需要安装它,可以使用pip来安装最新版本的Requests

pip install requests

pip3 install requests

简单使用

安装完成后,就可以在Python代码中导入Requests模块并使用它了。

发送GET请求

使用Requests发送GET请求:

# 导入模块
import requests

# 目标url
url = 'https://www.baidu.com'

# 向目标url发送get请求
response = requests.get(url)

# 打印响应内容
print(response.text)

# 解码:解决中文乱码问题
print(response.content.decode())

发送POST请求

使用Requests发送POST请求:

# 导入模块
import requests

# 定义请求地址
url = 'http://127.0.0.1:8080/login'
# 定义自定义请求头
headers = {
    
    
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
# 定义post请求参数
data = {
    
    
    "username": "admin",
    "password": "123456"
}

# 使用 POST 请求参数发送请求
response = requests.post(url, headers=headers, data=data)
# 获取响应的 html 内容
html = response.content.decode("utf-8")
print(html)

使用Response响应对象

获取响应内容可以使用response.textresponse.content

response.text是将response.content(bytes类型)进行解码的字符串。

response.content是直接从网络上抓取的数据,没有经过任何解码,是一个 bytes类型的数据。

解码需要指定一个编码方式,服务器不指定的话, requests会根据HTTP头部对响应的编码,如<meta charset="utf-8">进行猜测,默认编码是"ISO-8859-1"。猜测错误,就会导致解码产生乱码。因此需要使用response.content.decode()来解决中文乱码

decode函数解决中文乱码

常见编码字符集

utf-8
gbk
gb2312
ascii
iso-8859-1
response.content.decode() 默认utf-8

response.content.decode("GBK")

常用属性或方法

response = requests.get(url):response是发送请求获取的响应对象

response.text、response.content:获取响应内容

response.url响应的url:有时候响应的url和请求的url并不一致

response.status_code:响应状态码

response.request.headers:响应对象的请求头

response.headers:响应头

response.request._cookies:响应对应请求的cookie,返回cookieJar类型

response.cookies:应中携带的cookies,经过set-cookie动作,返回cookieJar类型

response.json():自动将json字符串类型的响应内容转换为python对象(dict or list

设置headers请求头

可以使用headers参数来设置请求头

headers参数用于携带请求头发送请求的方法

headers参数接收字典形式的请求头,请求头字段名作为key,字段对应的值作为value
import requests

# 目标url
url = 'https://www.baidu.com'

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

# 向目标url发送get请求
response = requests.get(url, headers=headers)

# 打印响应内容
print(response.content.decode())

# 打印请求头信息
print(response.request.headers)

处理Cookies

1.携带cookie

在headers参数中携带cookie。

从浏览器中复制User-Agent和Cookie

浏览器中的请求头字段和值与headers参数中必须一致

headers请求参数字典中的Cookie键对应的值是字符串
# 请求头
import requests

# 构造请求头字典
headers = {
    
    
    # 浏览器中复制的User-Agent
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',
    # 浏览器中复制的Cookie
    'Cookie': 'BIDUPSID=DA34A47255629CF319B6868F08DC207F; PSTM=1658846527; BAIDUID=DA34A47255629CF32D59A4FD90F6BB95:SL=0:NR=10:FG=1;'
}
url = 'https://www.baidu.com/s'

# 请求参数 字典
params = {
    
    'wd': 'java'}

# 向目标url发送get请求
response = requests.get(url, headers=headers, params=params)

# 打印响应内容
print(response.content.decode())

2.cookies参数

可以在headers参数中携带cookie,也可以使用专门的cookies参数。cookie一般有过期时间,一旦过期需要重新获取

cookies参数是一个字典形式:

cookies = {
    
    "cookie的name":"cookie的value"}

cookies参数的使用:

# 构造cookies字典
cookies_str = '浏览器中复制的cookies字符串'

cookies_dict = {
    
    cookie.split('=')[0]: cookie.split('=')[-1] for cookie in cookies_str.split('; ')}

# 请求头参数字典中携带cookie字符串
response = requests.get(url, headers=headers, cookies=cookies_dict)

3.cookieJar对象

使用requests获取的resposne对象,具有cookies属性。该属性值是一个cookieJar类型,包含服务器设置在本地的cookie。

cookies操作

# 返回 RequestsCookieJar对象
cookies = response.cookies

# RequestsCookieJar 转 cookies字典
requests.utils.dict_from_cookiejar(cookies)

# cookies字典 转 RequestsCookieJar
requests.utils.cookiejar_from_dict()

# 对cookie进行操作,把一个字典添加到cookiejar中
requests.utils.add_dict_to_cookiejar()

设置超时时间

使用timeout参数来设置请求的超时时间(秒)。

import requests

url = 'url'
# 设置超时时间,发送请求后,3秒钟内返回响应,否则就抛出异常
response = requests.get(url, timeout=3)

发送带参数的请求

在url携带参数

import requests

# 目标url
url = 'https://www.baidu.com/s?wd=java'

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

# 向目标url发送get请求
response = requests.get(url, headers=headers)

# 打印响应内容
print(response.content.decode())

通过params携带参数

构建请求参数字典,向接口发送请求的时候带上参数字典,参数字典设置给params

# 请求头
import requests

headers = {
    
    
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"}

url = 'https://www.baidu.com/s'

# 请求参数 字典
params = {
    
    'wd': 'java'}

# 向目标url发送get请求
response = requests.get(url, headers=headers, params=params)

# 打印响应内容
print(response.content.decode())

proxy代理

概述

在Requests模块中,可以使用代理服务器proxy来发送HTTP请求。代理可以在你和目标服务器之间充当中间人,用于在请求过程中转发请求和响应。使用代理有多种用途,例如隐藏真实的IP地址、绕过网络限制等。

通过指定代理IP,可以让代理服务器转发发送请求。这种方式被称为正向代理,它充当了客户端和目标服务器之间的中间人,代理服务器接收来自客户端的请求,并将其转发给目标服务器,然后将响应返回给客户端。

正向代理和反向代理区别:

1.正向代理

为发送请求的一方(浏览器或客户端)转发请求的,会知道最终处理请求的服务器的真实地址,例如VPN

2.反向代理

不为发送请求的一方(浏览器或客户端)转发请求、而是为最终处理请求的服务器转发请求的,不会知道服务器的真实地址,例如nginx

代理分类

1.根据代理ip的匿名程度,代理IP可以分为三类:

1.透明代理(Transparent Proxy):

透明代理虽然可以直接隐藏你的IP地址,但是还是可以查到你是谁。

目标服务器接收到的请求头如下:

REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Your IP

2.匿名代理(Anonymous Proxy):

使用匿名代理,别人只能知道你用了代理,无法知道你是谁。

目标服务器接收到的请求头如下:

REMOTE_ADDR = proxy IP
HTTP_VIA = proxy IP
HTTP_X_FORWARDED_FOR = proxy IP

3.高匿代理(Elite proxy或High Anonymity Proxy):

高匿代理让别人根本无法发现你是在用代理,所以是最好的选择。毫无疑问使用高匿代理效果最好。

目标服务器接收到的请求头如下:

REMOTE_ADDR = Proxy IP
HTTP_VIA = not determined
HTTP_X_FORWARDED_FOR = not determined

2.根据网站所使用的协议不同,需要使用相应协议的代理服务

从代理服务请求使用的协议可以分为:

http代理:目标url为http协议

https代理:目标url为https协议

socks隧道代理,例如socks5代理:
	socks 代理只是简单地传递数据包,不关心是何种应用协议(FTP、HTTP和HTTPS等)
	socks 代理比http、https代理耗时少
	socks 代理可以转发http和https的请求

proxies代理参数的使用

为了让服务器以为不是同一个客户端在请求,为了防止频繁向一个域名发送请求被封ip,所以需要使用代理ip

# 构造proxies字典
proxies = {
    
    
    "http": "http://ip:端口",
    "https": "https://ip:端口",
}

response = requests.get(url, proxies=proxies)

注意:

如果proxies字典中包含有多个键值对,发送请求时将按照url地址的协议来选择使用相应的代理ip

其他功能服务

忽略CA证书

浏览器访问某些网址时,会提示:您的连接不是私密连接,这是因为网站的CA证书没有经过受信任的根证书颁发机构的认证。当执行请求时,会抛出包含ssl.CertificateError等字样的异常。

import requests

url = "url "
# 设置忽略证书 verify参数设置为False表示不验证CA证书
response = requests.get(url,verify=False)

图片下载

下载图片时,后缀名和请求的后缀名一致,必须使用response.content进行保存文件

import requests

# 下载图片地址
url = "https://pic.netbian.com/uploads/allimg/180826/113958-153525479855be.jpg"
# 发送请求获取响应
response = requests.get(url)
# 保存图片
with open('image.png', 'wb') as f:
    f.write(response.content)

重试处理

retrying模块可以通过装饰器模式对某个函数进行监控,如果该函数引发异常就会触发重试操作

安装retrying模块

pip install retrying
# 导入模块
import time

import requests
# 使用第三方模块 retrying 模块
from retrying import retry


# 使用装饰器进行重试设置
# stop_max_attempt_number 表示重试次数
@retry(stop_max_attempt_number=3)
def test():
    print("Test 重试次数")
    headers = {
    
    
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
    }
    url = "http://127.0.0.1:8888"
    # 设置超时参数
    response = requests.get(url, headers=headers, timeout=1)

    return response.text


if __name__ == '__main__':
    try:
        html = test()
    except Exception as e:
        print(e)

    time.sleep(10)
Test 重试次数
Test 重试次数
Test 重试次数
HTTPConnectionPool(host='127.0.0.1', port=8888): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x000001CF901742B0>, 'Connection to 127.0.0.1 timed out. (connect timeout=1)'))

session状态保持

requests模块中的Session类能够自动处理发送请求获取响应过程中产生的cookie,进而达到状态保持的目的。

session实例在请求一个网站后,对方服务器设置在本地的cookie会保存在session中,下一次再使用session请求对方服务器的时候,会带上前一次的cookie

session对象发送get或post请求的参数,与requests模块发送请求的参数完全一致

# 实例化session对象
session = requests.session() 
# 一次请求
response = session.get(url, headers)
# 下一次请求
response = session.post(url, data)

猜你喜欢

转载自blog.csdn.net/qq_38628046/article/details/129016909
今日推荐