requests 请求库
requests库建立在urllib库的基础上,是一个处理HTTP请求的第三方库,最大的优点是程序编写的过程更接近正常URL访问过程。
基本用法
GET请求
- requests.get()函数的参数url链接必须采用HTTP或HTTPS方式访问
- 调用requests.get()函数后,返回一个Response对象代表响应
Response对象的属性(4个)
属性 | 描述 |
---|---|
status_code | HTTP请求的响应状态码 |
text | HTTP响应内容的字符串形式 |
encoding | HTTP响应内容的编码方式 |
content | HTTP响应内容的二进制形式 |
Response对象的方法(2个)
方法 | 描述 |
---|---|
json | 解析HTTP响应内容包含的JSON格式数据(若有) |
raise_for_status | 如果响应状态码不是200,则产生异常 |
- requests.get()函数可通过params参数构造URL以传递某些数据,数据以字符串字典的形式提供
- requests.get()函数可通过timeout参数设定请求超时时间
import requests
headers = {
'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}
r = requests.get('http://www.baidu.com',headers = headers) # 通过headers参数传递头信息(多用于避免被某些网页禁止抓取)
print(type(r)) # <class 'requests.models.Response'>
print(type(r.status_code)) # <class 'int'>
print(r.status_code) # 200(或404等)
print(r.encoding) # ISO-8859-1(或utf-8等)
print(type(r.text)) # <class 'str'>
print(r.text) # 响应内容的文本形式
print(type(r.content)) # <class 'bytes'>
print(r.content) # 响应内容的二进制形式(图片、音频和视频等文件可通过该方法获取)
POST请求
import requests
url = 'https://httpbin.org/post'
data = {'key':'value'}
r = requests.post('url',data = data)
print(r.text) # 返回结果中from部分即为提交数据
响应
- 除了使用text和content获取响应内容外,还有多种属性和方法可获得响应的其他信息
import requests
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}
params = {'wd':'requests'}
r = requests.get('https://www.baidu.com/s',headers = headers,params = params,timeout = 10)
print(type(r.cookies)) # <class 'requests.cookies.RequestsCookieJar'>
print(r.cookies)
print(type(r.headers)) # <class 'requests.structures.CaseInsensitiveDict'>
print(r.headers)
print(type(r.url)) # <class 'str'>
print(r.url) # https://www.baidu.com/s?wd=requests
print(type(r.history)) # <class 'list'>
print(r.history) # []
高级用法
文件上传
- requests可模拟提数据
import requests
files = {'file':open('favion.ico','rb')}
r = requests.post('http://httpbin.org/post',files = files)
print(r.text) # 文件上传部分由files字段标识
Cookies
import requests
r = requests.get('https://www.baidu.com')
print(r.cookies)
headers = {
'Cookie':'略',
'Host':'www.baidu.com',
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}
# 将cookies设置到headers
q = requests.get('https://www.baidu.com')
print(q.text)
- 通过r.cookies的方式获取Cookies
- 将Cookies设置到Headers参数中发送请求
- 也可通过cookies参数单独设置Cookies(需利用split()方法分割cookies,并利用set()方法设置每个cookies的key与value)
会话维持
- 利用Session对象实现会话维持
- Session对象可模拟在一个浏览器打开同一站点的不同页面,常用于模拟登陆成功后的下一步操作
import requests
url_1 = '……'
url_2 = '……'
# 同一站点的不同页面
s = requests.Session()
s.get(url_1)
r = s.get(url_2)
SSL证书验证
- requests可以为 HTTPS 请求验证 SSL 证书
- requests的SSL验证默认开启(verify参数默认为True)
- 可通过verify参数传入可信任的CA证书文件的文件夹路径
- 若证书验证失败,Requests会抛出SSLError
import requests
r = requests.get('https://www.12306.cn',verify=False) # verify参数设置为False可避免SSLError,但会返回一个警告
print(r.status_code)
'''
Warning (from warnings module):
File "C:\Users\CC\AppData\Local\Programs\Python\Python36\lib\site-packages\urllib3\connectionpool.py", line 858
InsecureRequestWarning)
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
'''
代理设置
- 可通proxies参数过为任意请求方法配置单个请求
- 若代理需使用HTTP Basic Auth,可用 http://user:password@host语法
- 为某个特定的连接方式或主机设置代理,使用scheme://hostname作为key,从而针对指定的连接方式或主机进行匹配
import requests
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
'''
代理使用HTTP Basic Auth
proxies = {
'http': 'http://user:pass@10.10.1.10:3128/',
}
针对指定的连接方式或主机设置代理
proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'}
'''
requests.get("http://example.org", proxies=proxies)
超时设置
- 为了防止服务器不能及时响应,可设置一个超时时间,超过该时间未响应即报错
- requests通过timeout参数进行超时设置,默认为None(永久等待)
- timeout值将会用作connect和read二者的timeout,如需分别制定则传入一个元组
import requests
r = requests.get('https://github.com', timeout=5)
q = requests.get('https://github.com', timeout=(3.05, 25)) # 分别制定connect和read二者的timeout
身份验证
- requests提供HTTPBasicAuth类进行身份验证
- 身份验证时可直接传入一个包含username和passport的元组,它会默认使用HTTPBasicAuth类进行身份验证
- 验证成功返回200状态码,验证失败则返回401状态码
import requests
url = '……'
r = requests.get(url,auth=('username','password'))
print(r.status_code) #200或401