Requests库的使用
简介
Requests是一个优雅而简单的Python HTTP库,专为人类而构建。
Requests是有史以来下载次数最多的Python软件包之一,每天下载量超过400,000次。
之前的urllib做为Python的标准库,因为历史原因,使用的方式可以说是非常的麻烦而复杂的,而且官方文档也十分的简陋,常常需要去查看源码。与之相反的是,Requests的使用方式非常的简单、直观、人性化,让程序员的精力完全从库的使用中解放出来。
Requests的官方文档同样也非常的完善详尽,而且少见的有中文官方文档:http://cn.python-requests.org/zh_CN/latest/。
英文文档:http://docs.python-requests.org/en/master/api/
例子与特性
可以说Requests最大的特性就是其风格的简单直接优雅。无论是请求方法,还是响应结果的处理,还有cookies,url参数,post提交数据,都体现出了这种风格。
import requests
resp = requests.get('https://www.baidu.com')
print(resp.status_code) 状态码
print(resp.headers['']) headers里面的数据,按键取值
print(resp.encoding) 编码
print(resp.text) 内容
在这里插入图片描述
发起请求
请求方法
Requests的请求不再像urllib一样需要去构造各种Request、opener和handler,使用Requests构造的方法,并在其中传入需要的参数即可。
每一个请求方法都有一个对应的API,比如GET请求就可以使用get()方法:
import requests
resp = requests.get('https://www.baidu.com')
而POST请求就可以使用post()方法,并且将需要提交的数据传递给data参数即可:
import requests
resp = requests.post('http://httpbin.org/post',data={'key':'value'})
而其他的请求类型,都有各自对应的方法:
resp = requests.put('http://httpbin.org/put',data={'key':'value'})
resp = requests.delete('http://httpbin.org/delete')
resp = requests.head('http://httpbin.org/get')
resp = requests.options('http://httpbin.org/get')
传递URL参数
传递URL参数也不用再像urllib中那样需要去拼接URL,而是简单的,构造一个字典,并在请求时将其传递给params参数:
import requests
data={'key1':'value1','key2':'value2'}
resp = requests.get('http://httpbin.org/get',data=data)
此时,查看请求的URL,则可以看到URL已经构造正确了:
print(resp.url)
>>>http://httpbin.org/get?key2=value2&key1=value1
并且,有时候我们会遇到相同的url参数名,但有不同的值,而python的字典又不支持键的重名,那么我们可以把键的值用列表表示:
import requests
data={'key1':'value1','key2':['value2','value3']}
resp = requests.get('http://httpbin.org/get',data=data)
print(resp.url)
>>>http://httpbin.org/get?key2=value2&key1=value1&key2=value3
自定义Headers
如果想自定义请求的Headers,同样的将字典数据传递给headers参数。
url = 'https://api.github.com/some/endpoint'
headers = {'user-agent':'my-app/0.0.1'}
resp = requests.get(url,headers=headers)
自定义Cookies
Requests中自定义Cookies也不用再去构造CookieJar对象,直接将字典递给cookies参数。
url = 'http://httpbin.org/cookies'
cookies = {'cookies_are':'working'}
resp = requests.get(url,cookies=cookies)
resp.text
设置代理
当我们需要使用代理时,同样构造代理字典,传递给proxies参数。
import requests
proxies = {
'http': 'http://10.10.1.10:3128',
'http': 'http://10.10.1.10:1080',
}
requests.get('http://example.org',proxies=proxies)
重定向: 在网络请求中,我们常常会遇到状态码是3开头的重定向问题,在Requests中是默认开启允许重定向的,即遇到重定向时,会自动继续访问。
resp = requests.get('https://api.github.com',allow_redirects=False) #关闭重定向,查看重定向url
resp.status_code
禁止证书验证
有时候我们使用了抓包工具,这个时候由于抓包工具提供的证书并不是由受信任的数字证书颁发机构颁发的,所以证书的验证会失败,所以我们就需要关闭证书验证。
在请求的时候把verify参数设置为False就可以关闭证书验证了。
import requests
resp=requests.get('http://httpbin.org/post',verify=False)
但是关闭验证后,会有一个比较烦人的warning
import urllib3
urllib3.disable_warnings()
可以使用以下方法关闭警告:
from requests.packages.urllib3.exceptions import InsecureRequestWarning
#禁用安全警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
设置超时
设置访问超时,设置timeout参数即可。
requests.get('http://httpbin.org/post',timeout=0.01)
接收响应
响应内容
通过Requests发起请求获取到的,是一个requests.models.Response对象。通过这个对象我们可以很方便的获取响应的内容。
之前通过urllib获取的响应,读取的内容都是bytes的二进制格式,需要我们自己去将结果decode()一次转换成字符串数据。
而Requests通过text属性,就可以获得字符串格式的响应内容。
import requests
url = 'http://httpbin.org/cookies'
resp = requests.get(url)
resp.text
字符编码
Requests会自动的根据响应的报头来猜测网页的编码是什么,然后根据猜测的编码来解码网页内容,基本上大部分的网页都能够正确的被解码。而如果发现text解码不正确的时候,就需要我们自己手动的去指定解码的编码格式。
import requests
url = 'http://httpbin.org/cookies'
resp = requests.get(url)
resp.encoding='utf-8'
resp.text
二进制数据:
而如果你需要获得原始的二进制数据,那么使用content属性即可。
resp.content
json数据
如果我们访问之后获得的数据是JSON格式的,那么我们可以使用json()方法,直接获取转换成字典格式的数据。
import requests
url = 'http://httpbin.org/cookies'
resp = requests.get(url)
resp.json()
状态码:
通过status_code属性获取响应的状态码
url = 'http://httpbin.org/cookies'
resp = requests.get(url)
resp.status_code
响应报头
通过headers属性获取响应的报头
r.headers
>>>{
'Accept': 'text/javascript',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
....................
}
服务器返回的cookies:
通过cookies属性获取服务器返回的cookies
url = 'http://httpbin.org/cookies'
resp = requests.get(url)
resp.cookies['example_cookie_name']
url
还可以使用url属性查看访问的url。
import requests
data={'key1':'value1','key2':'value2'}
resp = requests.get('http://httpbin.org/get',data=data)
print(resp.url)
>>>http://httpbin.org/get?key2=value2&key1=value1
Session对象
在Requests中,实现了Session(会话)功能,当我们使用Session时,能够像浏览器一样,在没有关闭关闭浏览器时,能够保持住访问的状态。
这个功能常常被我们用于登陆之后的数据获取,使我们不用再一次又一次的传递cookies。
import requests
session = requests.Session()
session.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
resp = session.get('http://httpbin.org/cookies')
print(resp.text)
>>>{'cookies':{'sessioncookie':'123456789'}}
首先我们需要去生成一个Session对象,然后用这个Session对象来发起访问,发起访问的方法与正常的请求是一摸一样的。
同时,需要注意的是,如果是我们在get()方法中传入headers和cookies等数据,那么这些数据只在当前这一次请求中有效。如果你想要让一个headers在Session的整个生命周期内都有效的话,需要用以下的方式来进行设置:
#设置整个headers
session.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36'
}
#增加一条headers
session.headers.update({'x-text':'ture'})
作业
1.使用requests通过12306的图像验证码
(代码和结果截图)
网友评论