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.根据网站所使用的协议不同,需要使用相应协议的代理服务
从代理服务请求使用的协议可以分为:
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)