requests基础
requests基础
介绍
一个强大的工具是Python的requests模块。它能够轻松地进行HTTP请求,处理响应以及提取数据。
允许您发送各种类型的请求,包括GET、POST、PUT、DELETE等。
pip install requests
各种请求方式
import requests
res = requests.get ()
# 发起POST请求
res = requests.post ()
# 发起PUT请求
res = requests.post ()
# 发起DELETE请求
res = requests.delete ()
# 发送HEAD请求
res = requests.head ()
# 发送OPTION请求
res = requests.options ()
其他写法
response = requests.get("http://www.baidu.com/")
# 也可以这么写
response = requests.request("get", "http://www.baidu.com/")
基本GET请求
# 基本写法
response=requests.get(url,params,**kwargs)
import requests
response = requests.get('http://httpbin.org/get?name=jyx&age=18')
print(response.text)
# 分装GET请求参数
param = {'name':'jyx','age':19}
# 设置GET请求参数(Params)
response = requests.get('http://httpbin.org/get',params=param)
print(response.text)
添加 headers 和 查询参数
import requests
kw = {'wd':'长城'}
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
# params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers)
# 查看响应内容,response.text 返回的是Unicode格式的数据
print response.text
# 查看响应内容,response.content返回的字节流数据
print response.content
# 查看完整url地址
print response.url
# 查看响应头部字符编码
print response.encoding
# 查看响应码
print response.status_code
基本POST请求
# 上传 文件
import requests
files = {'files':open('F:\\python\\test\\test_case\\files.txt','rb')}
r = requests.post('https://httpbin.org/post',files=files)
print(r.text)
{
"args":{
},
"data":"",
"files":{
"files":"hello worle!"
},
"form":{
},
"headers":{
"Accept":"*/*",
"Accept-Encoding":"gzip, deflate",
"Connection":"close",
"Content-Length":"158",
"Content-Type":"multipart/form-data; boundary=d2fb307f28aeb57b932d867f80f2f600",
"Host":"httpbin.org",
"User-Agent":"python-requests/2.19.1"
},
"json":null,
"origin":"113.65.2.187",
"url":"https://httpbin.org/post"
}
requests.request
请求参数
- url: 需要请求的网站地址
- params: get方法提交参数
- data: post方法提交参数
- data: 字典,字节序或文件对象,重点作为向服务器提供或提交资源是提交,
- json: json格式的数据,是http最经常使用的数据格式, 他是作为内容部分可以向服务器提交。
- headers:字典是http的相关语,对应了向某个url访问时所发起的http的头i字段, 可以用这个字段来定义http的访问的http头
- cookies:字典或CookieJar,指的是从http中解析cookie
- auth: 元组,用来支持http认证功能
- timeout: 用于设定超时时间, 单位为秒, 如果在timeout时间内请求内容没有返回, 将产生一个timeout的异常。
- proxies:字典, 用来设置访问代理服务器。
- allow_redirects: 开关, 表示是否允许对url进行重定向, 默认为True。
- stream: 开关, 指是否对获取内容进行立即下载, 默认为True。
- verify: 开关, 用于认证SSL证书, 默认为True。
- cert: 用于设置保存本地SSL证书路径
- data:在请求体里面传递的数据,后面可以是字典,字节等数据类型。
import requests
requests.request(
method = 'POST',
url = 'http://127.0.0.1:8080/example/request',
# 字典
data= { 'k1' : 'v1' , 'k2' : 'v2' , 'x':[1,2,3]}
# 字符串
data="k1=v1&k2=v2&x=[1,2,3]"
# 字节
data = bytes("k1=v1&k2=k2&x=[1,2,3]", encoding='utf8')
# 文件对象
data = open('data_file.py', mode='r', encoding='utf-8')
)
- json:在请求体里面传递数据,把整体序列化成一个大字符串
import requests
requests.request(
method = 'POST',
url = 'http://127.0.0.1:8080/example/request',
json = {'k1' : 'v1', 'k2' : 'v2'}
# "{ 'k1' : 'v1' , 'k2' : 'v2' }"
# 字典嵌套字典
json = json.dumps({'k1' : 'v1' , 'k2' : { 'kk1' : vv1 }})
)
处理响应
requests响应对象属性
属性 | 说明 | |
---|---|---|
r.status_code | http请求的返回状态,若为200则表示请求成功。 | |
r.headers | 返回响应头 | |
r.cookies | 返回cookie信息 | |
r.url | ||
r.text | http响应内容的字符串形式,即返回的页面内容 | |
r.encoding | 从http header 中猜测的相应内容编码方式 | |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) | |
r.content | http响应内容的二进制形式 | |
r.json() | 以json的方式返回,对象为dict |
print(response.status_code) # 获取响应状态码
print(response.url) # 获取url地址
print(response.text) # 获取文本
print(response.content) # 获取二进制流
print(response.headers) # 获取页面请求头信息
print(response.history) # 上一次跳转的地址
print(response.cookies) # # 获取cookies信息
print(response.cookies.get_dict()) # 获取cookies信息转换成字典
print(response.cookies.items()) # 获取cookies信息转换成字典
print(response.encoding) # 字符编码
print(response.elapsed) # 访问时间
- 200:请求成功。
- 201:资源已成功创建。
- 400:请求无效。
- 401:未经授权的请求。
- 403:请求被禁止。
- 404:未找到请求的资源。
- 500:服务器发生错误。
import requests
r= requests.get("https://www.baidu.com/index.php?tn=monline_3_dg")
print(r.status_code)
print(r.encoding)
print(r.apparent_encoding)
print(r.text)
# 200
# ISO-8859-1
# utf-8
# <!DOCTYPE html> ....
# </html>
import requests
r=requests.get("http://www.baidu.com")
print(r.status_code)
200
print(r.encoding)
'ISO-8859-1'
print(r.apparent_encoding)
'utf-8'
print(r.text)
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8>ipt> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">æ\x9b´å¤\x9a产å\x93\x81</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a com/ class=cp-feedback>æ\x84\x8fè§\x81å\x8f\x8dé¦\x88</a> 京ICPè¯\x81030173å\x8f· <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'
print(r.encoding='utf-8')
print(r.text)
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta chref=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css="h读</a> <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号 <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'
Cookies
当需要cookie时,直接调用 response.cookies (response为请求后的返回值)
import requests
response = requests.get('http://www.example.com')
# 查看响应中的Cookie
print(response.cookies)
# 将Cookie保存到字典中
cookies = requests.utils.dict_from_cookiejar(response.cookies)
# 将Cookie添加到请求头中
headers = {
'Cookie': '; '.join([f'{k}={v}' for k, v in cookies.items()])
}
response = requests.get('http://www.example.com', headers=headers)
print(response.text)
session
在 requests 里,session对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开。
response = requests.get("百度一下,你就知道")
print(response.cookies)
for key, value in response.cookies.items():
print(key + '=' + value)
# #<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
# BDORZ=27315
# 采用Session请求,并设这是超时和请求次数
from requests.adapters import HTTPAdapter
session = requests.Session()
session.mount('http://', HTTPAdapter(max_retries=2))
session.mount('https://', HTTPAdapter(max_retries=2))
req = session.get(imgurl,stream=True,timeout=1)
上传文件
import requests
files = {'file': open('cookie.txt', 'rb')}
response = requests.post("http://httpbin.org/post", files=files)
print(response.text)
......
同时上传多个文件
# {"name": fileObj}
files = {
'file1': open('/Downloads/hello.txt', 'rb'),
'file2': open('/Downloads/hello2.txt', 'rb')
}
# [("name", fileObj)]
files = [
('file1', open('/Downloads/hello.txt', 'rb')),
('file2', open('/Downloads/hello2.txt', 'rb'))
]
query = {}
data = {"key": "val"}
response = requests.post('http://httpbin.org/post', data=data
params=query,
files=files,
timeout=10)
超时设置
timeout 仅对连接过程有效,与响应体的下载无关。 timeout 并不是整个下载响应的时间限制
# requests, 默认是无延迟,在执行中会等待线程,形成阻塞
import requests
reqmsg = requests.post(url,data=body,headers=head,timeout=(5,8))
print(reqmsg.text)
# 第一个是连接超时-设置为5s
# 第二个是设置读取下载超时-设置时间为8秒
requests.exceptions.ConnectTimeout
requests.exceptions.ReadTimeout
异常处理
常见异常类型
requests.exceptions.RequestException 请求异常
requests.exceptions.Timeout: 请求超时
requests.exceptions.ConnectionError: 连接错误
requests.exceptions.HTTPError: HTTP错误
requests.exceptions.TooManyRedirects: 重定向次数过多
import requests
try:
response = requests.get('http://www.example.com', timeout=0.1)
response.raise_for_status()
except requests.exceptions.Timeout:
print('请求超时')
except requests.exceptions.HTTPError as err:
print(f'HTTP错误:{err}')
except requests.exceptions.ConnectionError:
print('连接错误')
except requests.exceptions.TooManyRedirects:
print('重定向次数过多')
else:
print(response.text)
参考资料
https://blog.csdn.net/godnightshao/article/details/129967510