深入了解Python中Requests库的使用
作者:CodeDevMaster
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.text
或response.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.根据网站所使用的协议不同,需要使用相应协议的代理服务
从代理服务请求使用的协议可以分为:
proxies代理参数的使用
为了让服务器以为不是同一个客户端在请求,为了防止频繁向一个域名发送请求被封ip,所以需要使用代理ip
http代理:目标url为http协议
https代理:目标url为https协议
socks隧道代理,例如socks5代理:
- socks 代理只是简单地传递数据包,不关心是何种应用协议(FTP、HTTP和HTTPS等)
- socks 代理比http、https代理耗时少
- socks 代理可以转发http和https的请求
注意:
如果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)
以上就是深入了解Python中Requests库的使用的详细内容,更多关于Python Requests库的资料请关注脚本之家其它相关文章!