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>&nbsp;京ICPè¯\x81030173å\x8f·&nbsp; <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>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <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

posted @ 2023-09-01 20:12  贝壳里的星海  阅读(17)  评论(0编辑  收藏  举报