发送请求

HTTP请求类型有这么几种:GET,POST,PUT,DELETE,HEAD 以及 OPTIONS,下面分别进行介绍

request

request是requests中的一个重要方法,所有的HTTP请求都是基于这个方法

request(method, url, **kwargs)
  • method:请求方式OPTIONS, HEAD, POST, PUT, PATCH, or DELETE
  • 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'
最后修改:2022 年 12 月 20 日
如果觉得我的文章对你有用,请随意赞赏