一、请求方式
HTTP常用的请求方式是GET和POST,Requests对此区分两种不同的请求方式。
(1)GET请求
Requests的GET请求分为两种:不带参数和带参数。判断URL是否带有参数,通过对“?”进行判断,“?”表示带有参数。
import requests
# 第一种方法
r = requests.get('https://www.baidu.com/s?wd=python')
# 第二种方法
url = 'https://www.baidu.com/s'
# params表示GET请求中的参数
params = {'wd': 'python'}
r = requests.get(url,params = params)
print(r.url)
两种方法都表示请求同一URL,实际开发选择第一种方法,因为不仅代码简单,而且如果参数动态变化,那么可以使用字符串格式对URL动态设置,比如:'https://www.baidu.com/s?wd=%s'%('python')。
(2)POST请求
POST请求就是提交表单,表单的数据内容就是POST的请求参数,Requests实现POST请求需设置请求参数data,数据格式可以是字典,元组,列表,JSON格式。
# 字典类型
data = {
'key1': 'value1',
'key2': 'value2',
'key3': 'value3'
}
# 元组或列表
(('key1', 'value1'), ('key2', 'value2'), ('key3', 'value3'))
# JSON
import json
# 将字典转化为JSON
data = json.dumps(data)
# 发送POST请求
import requests
# data是POST方法的请求参数
r = requests.post('https://www.baidu.com/', data=data)
print(r.text)
Requests的GET和POST方法的请求参数分别是params和data。
(3)response(响应对象)
当向网站发送请求时,网站会返回相应的响应对象,包含服务器响应的信息。
Requests提供以下方法响应内容:
r.status_code:响应状态码
r.raw:原始响应体,使用r.raw.read()读取
r.content:字节方式的响应体,需要进行解码。
r.text:字符串方式的响应体。
r.header:以字典对象存储服务器响应头。
r.json:Requsts内置的JSON解码器。
r.raise_for_status():请求失败(非200响应),抛出异常。
r.url:获取请求链接。
r.cookies:获取请求后的cookies。
r.encoding:获取编码格式。
二、复杂的请求方式
(1)添加请求头(headers)
import requests
headers = {
'content-type': 'application/json',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6756.400 QQBrowser/10.3.2473.400'
}
requests.get('http://www.baidu.com/', headers=headers)
(2)使用代理IP(proxies)
import requests
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'https://10.10.1.10:1080'
}
requests.get('http://www.baidu.com/', proxies=proxies)
(3)证书验证(verify)
通常设置关闭验证。
import requests
url = 'https://kyfw.12306.cn/otn/leftTicket/init'
# 关闭证书验证
r = requests.get(url, verify=False)
print(r.status_code)
# 开始证书验证
# r = requests.get(url, verify=True)
# 设置证书路径
# r = requests.get(url, verify='/path/to/certfile')
(4)设置超时时间(timeout)
发送请求后超出设置的时间便会停止等待响应,如果服务器在该时间之内没有响应就会导致异常。
import requests
# GET请求
requests.get('http://www.baidu.com/', timeout=0.001)
# POST请求
requests.post('http://www.baidu.com/', timeout=0.001)
(5)标识识别身份(Cookies)
import requests
url = 'https://static.zhihu.com/heifetz/vendor.995451a211dcf23e7059.js'
temp_cookies = '_zap=e6bcb677-f710-4bf1-8ceb-de51e97415c9; _xsrf=685f3baf-45be-43b4-8f32-02de3367b5e5; d_c0="AEDkwu2GVA6PThq56D3xIo2-6W-daZoS90s=|1538970683"; q_c1=185fcb11f0f7429eaba419368a2f4b7e|1538970685000|1538970685000; l_n_c=1; n_c=1; l_cap_id="Y2E3MGY5ZTdhZWFiNDE0ZjkzMmQ0MTQzOGM1YWExM2Y=|1539332192|46faa5b9406b718f99e6c369465bccbde3cc5ba9"; r_cap_id="ZWEwODQwMTkyMGM0NDE1N2E3YWFhNDI5ZTZmOTE5NmU=|1539332192|405231c0a71396732f27d6a4368c78c0f7bb86cb"; cap_id="YjAxNGUzN2M1MzFjNDhjNWE4M2UyZjg3MDBkNWJiNWY=|1539332192|4758bc5f5a4678861d6990b9dd2dc86bb2812364"; tgw_l7_route=5bcc9ffea0388b69e77c21c0b42555fe'
cookies_dict = {}
for i in temp_cookies.split(';'):
value = i.split('=')
cookies_dict[value[0]] = value[1]
r = requests.get(url, cookies=cookies_dict)
print(r.text)
当程序发送请求时,自动生成一个RequestsCookieJar对象,用于存放Cookies对象。
requests.utils.dict_from_cookiesjar()方法提供RequestsCookieJar转化为字典。
requests.utils.cookiesjar_from_dict()方法提供字典转化为RequestsCookieJar。