发送请求
HTTP请求类型有这么几种:GET,POST,PUT,DELETE,HEAD 以及 OPTIONS,下面分别进行介绍
request
request是requests中的一个重要方法,所有的HTTP请求都是基于这个方法
request(method, url, **kwargs)
- method:请求方式
OPTIONS
,HEAD
,POST
,PUT
,PATCH
, orDELETE
- url:请求的网址
**kwargs:其他可选参数
- params:字典或字节序列,作为参数增加到url中
- data:字典、字节序列或文件对象,作为Request的内容
- json:JSON格式的数据,作为Request的内容。
- headers:字典,HTTP定制请求头
- cookies:字典或CookieJar,Request中的cookie
- files:字典,用于传输文件
- auth:元组,支持HTTP的认证功能
- timeout:设定超时时间,单位为秒
- allow_redirects:布尔,重定向开关。默认True
- proxies:字典,设定代理服务器,可以增加登录认证
- verify:布尔,认证SSL证书的开关。默认True
- stream:布尔,获取内容立即下载开关。默认True
- cert:本地SSL证书路径
- stream:布尔,获取内容立即下载开关。默认True
GET请求
get(url, params=None, **kwargs)
参数与上面的request一致,例如:
r = requests.get('https://api.github.com/events')
POST请求
post(url, data=None, json=None, **kwargs)
参数与上面的request一致,例如:
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
PUT请求
put(url, data=None, **kwargs)
参数与上面的request一致,例如:
r = requests.put('http://httpbin.org/put', data = {'key':'value'})
DELETE请求
delete(url, **kwargs)
参数与上面的request一致,例如:
r = requests.delete('http://httpbin.org/delete')
HEAD请求
head(url, **kwargs)
参数与上面的request一致,例如:
r = requests.head('http://httpbin.org/get')
OPTIONS请求
options(url, **kwargs)
参数与上面的request一致,例如:
r = requests.options('http://httpbin.org/get')
向url传递参数
url_params = {'key':'value'} # 字典传递参数,如果值为None的键不会被添加到url中
r = requests.get('your url',params = url_params)
print(r.url) # 打印内容your url?key=value
响应内容
r.encoding #获取当前的编码
r.encoding = 'utf-8' #设置编码
r.text #以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。
r.content #以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。
r.request.headers #获取请求头
r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
r.headers['Content-Type'] #访问headers的Content-Type内容
r.headers.get('Content-Type') #访问响应头部分内容的两种方式
r.request._cookies #获取请求的cookie
r.cookies #获取响应的cookie
r.cookies['example_cookie_name'] #读取cookies
r.history #返回重定向信息,当然可以在请求是加上allow_redirects = false 阻止重定向
r.status_code #响应状态码
r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read()
r.ok # 查看r.ok的布尔值便可以知道是否登陆成功
#*特殊方法*#
r.json() #Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
r.raise_for_status() #失败请求(非200响应)抛出异常
定制请求头
如果你想为请求添加 HTTP 头部,只要简单地传递一个 dict 给 headers 参数
url = 'http://www.baidu.com/'
headers = {'content-type': 'application/json',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Mobile Safari/537.36'}
r = requests.get(url, headers=headers)
Cookie
header = {'user-agent': 'my-app/0.0.1''}
cookie = {'key':'value'}
r = requests.get/post('your url',headers=header,cookies=cookie)
发送post请求
通常,你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)
{
...
"form": {
"key2": "value2",
"key1": "value1"
},
...
}
post发送json请求:
import requests
import json
payload = {'some': 'data'}
r = requests.post('https://api.github.com/some/endpoint', data=json.dumps({'some': 'data'}))
#如果传递的payload是string而不是dict,需要先调用dumps方法格式化一下
# r = requests.post(url, json=payload) #这中不用转json较方便
print(r.json())
post多部分编码文件
Requests 使得上传多部分编码文件变得很简单:
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
超时
r = requests.get('url',timeout=1) #设置秒数超时,仅对于连接有效
设置访问代理
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.100:4444",
}
r = requests.get('http://m.ctrip.com', proxies=proxies)
#如果代理需要用户名和密码,则需要这样:
proxies = {
"http": "http://user:pass@10.10.1.10:3128/",
}
会话对象
会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie
import requests
# 请求数据url
member_url = 'https://www.yaozh.com/member/'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
}
# session 类 可以自动保存cookies === cookiesJar
session = requests.session()
# 1.代码登录
login_url = 'https://www.yaozh.com/login'
login_form_data = {
'username':'xiaomaoera12',
'pwd': 'lina081012',
'formhash': '54AC1EE419',
'backurl': 'https%3A%2F%2Fwww.yaozh.com%2F',
}
login_response = session.post(login_url,data=login_form_data,headers=headers)
print(login_response.content.decode())
# 2.登录成功之后 带着 有效的cookies 访问 请求目标数据
data = session.get(member_url,headers=headers).content.decode()
SSL 证书验证
import requests
url = 'https://www.12306.cn/mormhweb/'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
}
# 因为hhtps 是有第三方 CA 证书认证的
# 但是 12306 虽然是https 但是 它不是 CA证书, 他是自己 颁布的证书
# 解决方法 是: 告诉 web 忽略证书 访问
response = requests.get(url=url, headers=headers, verify=False)
data = response.content.deco
客户端证书
你也可以指定一个本地证书用作客户端证书,可以是单个文件(包含密钥和证书)或一个包含两个文件路径的元组:
requests.get('https://kennethreitz.org', cert=('/path/client.cert', '/path/client.key'))
<Response [200]>
或者保持在会话中:
s = requests.Session()
s.cert = '/path/client.cert'