Python之Requests库的使用

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

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)
相关文章
|
25天前
|
调度 开发者 Python
Python中的异步编程:理解asyncio库
在Python的世界里,异步编程是一种高效处理I/O密集型任务的方法。本文将深入探讨Python的asyncio库,它是实现异步编程的核心。我们将从asyncio的基本概念出发,逐步解析事件循环、协程、任务和期货的概念,并通过实例展示如何使用asyncio来编写异步代码。不同于传统的同步编程,异步编程能够让程序在等待I/O操作完成时释放资源去处理其他任务,从而提高程序的整体效率和响应速度。
|
28天前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
62 0
|
14天前
|
XML 存储 数据库
Python中的xmltodict库
xmltodict是Python中用于处理XML数据的强大库,可将XML数据与Python字典相互转换,适用于Web服务、配置文件读取及数据转换等场景。通过`parse`和`unparse`函数,轻松实现XML与字典间的转换,支持复杂结构和属性处理,并能有效管理错误。此外,还提供了实战案例,展示如何从XML配置文件中读取数据库连接信息并使用。
Python中的xmltodict库
|
2月前
|
数据采集 前端开发 算法
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
本文介绍了如何使用 Python 的 `requests` 库应对复杂的 HTTP 请求场景,包括 Spider Trap(蜘蛛陷阱)、SESSION 访问限制和请求频率限制。通过代理、CSS 类链接数控制、多账号切换和限流算法等技术手段,提高爬虫的稳定性和效率,增强在反爬虫环境中的生存能力。文中提供了详细的代码示例,帮助读者掌握这些高级用法。
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
|
21天前
|
数据库 Python
异步编程不再难!Python asyncio库实战,让你的代码流畅如丝!
在编程中,随着应用复杂度的提升,对并发和异步处理的需求日益增长。Python的asyncio库通过async和await关键字,简化了异步编程,使其变得流畅高效。本文将通过实战示例,介绍异步编程的基本概念、如何使用asyncio编写异步代码以及处理多个异步任务的方法,帮助你掌握异步编程技巧,提高代码性能。
53 4
|
21天前
|
API 数据处理 Python
探秘Python并发新世界:asyncio库,让你的代码并发更优雅!
在Python编程中,随着网络应用和数据处理需求的增长,并发编程变得愈发重要。asyncio库作为Python 3.4及以上版本的标准库,以其简洁的API和强大的异步编程能力,成为提升性能和优化资源利用的关键工具。本文介绍了asyncio的基本概念、异步函数的定义与使用、并发控制和资源管理等核心功能,通过具体示例展示了如何高效地编写并发代码。
31 2
|
2月前
|
网络协议 数据库连接 Python
python知识点100篇系列(17)-替换requests的python库httpx
【10月更文挑战第4天】Requests 是基于 Python 开发的 HTTP 库,使用简单,功能强大。然而,随着 Python 3.6 的发布,出现了 Requests 的替代品 —— httpx。httpx 继承了 Requests 的所有特性,并增加了对异步请求的支持,支持 HTTP/1.1 和 HTTP/2,能够发送同步和异步请求,适用于 WSGI 和 ASGI 应用。安装使用 httpx 需要 Python 3.6 及以上版本,异步请求则需要 Python 3.8 及以上。httpx 提供了 Client 和 AsyncClient,分别用于优化同步和异步请求的性能。
python知识点100篇系列(17)-替换requests的python库httpx
|
27天前
|
数据采集 JSON 测试技术
Python爬虫神器requests库的使用
在现代编程中,网络请求是必不可少的部分。本文详细介绍 Python 的 requests 库,一个功能强大且易用的 HTTP 请求库。内容涵盖安装、基本功能(如发送 GET 和 POST 请求、设置请求头、处理响应)、高级功能(如会话管理和文件上传)以及实际应用场景。通过本文,你将全面掌握 requests 库的使用方法。🚀🌟
45 7
|
27天前
|
机器学习/深度学习 数据采集 算法
Python机器学习:Scikit-learn库的高效使用技巧
【10月更文挑战第28天】Scikit-learn 是 Python 中最受欢迎的机器学习库之一,以其简洁的 API、丰富的算法和良好的文档支持而受到开发者喜爱。本文介绍了 Scikit-learn 的高效使用技巧,包括数据预处理(如使用 Pipeline 和 ColumnTransformer)、模型选择与评估(如交叉验证和 GridSearchCV)以及模型持久化(如使用 joblib)。通过这些技巧,你可以在机器学习项目中事半功倍。
38 3
|
1月前
|
数据采集 数据可视化 数据处理
如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`)
本文介绍了如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`),加载历史数据,计算均线和其他技术指标,实现交易逻辑,记录和可视化交易结果。示例代码展示了如何根据均线交叉和价格条件进行开仓、止损和止盈操作。实际应用时需注意数据质量、交易成本和风险管理。
50 5