python中的requests库
qingheluo2020-03-30清河洛335
python中内置的urllib模块用于访问网络资源,但是它用起来比较麻烦,而且缺少很多实用的高级功能。更好的方案是使用requests,它是一个Python第三方库,处理URL资源特别方便。使用pip install requests安装requests模块一、发送请求发送get请求: requests.get(url,params=None,**kwargs)
params是一个字典,表示要传递的数据(get方法可以直接在url中传递数据但是数据需要进行urlencode编码,使用该属性值不需要编码)发送post请求: requests.post(url,data...
python中内置的urllib模块用于访问网络资源,但是它用起来比较麻烦,而且缺少很多实用的高级功能。
更好的方案是使用requests,它是一个Python第三方库,处理URL资源特别方便。
使用pip install requests安装requests模块
一、发送请求
发送get请求:requests.get(url,params=None,**kwargs) params是一个字典,表示要传递的数据(get方法可以直接在url中传递数据但是数据需要进行urlencode编码,使用该属性值不需要编码)发送post请求:
requests.post(url,data=None,json=None,**kwargs,files=open_file) data为一个dict或tuple,表示要发送的数据 也可以流式上传:requests.post(url,data=open(filename,'rb')) json表示要发送的json数据,该参数值为一个dict格式,内部自动序列化为json数据 files参数用于上传文件 upload_files = {'file': open(filename,'rb')} upload_files = {'file': ('file.jpg', open('file.jpg', 'rb'), 'image/jpeg', {'Expires': '0'})} #显式地设置文件名,文件类型和请求头 upload_files = {'file': ('demo.txt', '第一行内容 第二行内容 ')} #发送作为文件来接收的字符串 requests.post(url, files=upload_files) #open()方法读取文件时,注意务必使用'rb'读取把post()方法替换为put(),delete(),head() 以及 options() 等,就可以以对应的方式请求资源
发送请求的方法中常用的公用关键字参数
proxies=None:使用代理请求,值为一个dict数据,如{'https':'123.123.123.123:456'} stream=False:是否获取来自服务器的原始套接字响应(默认False) 为False(默认值)时,会立即开始传输文件内容并放到内存中,如果文件过大可能导致内存不足。 如果为True,仅仅会先返回一个响应头信息,响应体内容不会立即开始传输,当使用iter_content或iter_lines遍历内容或访问内容属性时才开始下载 iter_content:一块一块的遍历要下载的内容 iter_lines:一行一行的遍历要下载的内容(官方说明:这种方法不安全) headers=None:为请求添加HTTP头部,值为一个dict数据 cookies:使用指定的cookie信息,值为一个dict数据 verify=True:表示是否验证SSL证书(默认True),如果访问网站的SSL证书不被信任的话该参数设置为False可以跳过验证 verify='/path/certfile':也可以指定一个证书文件来指定验证的SSL证书 allow_redirects=True:是否自动处理重定向(默认True,自动处理并跳转) timeout=0.001:设定请求的超时时间,单位是秒
二、请求返回的Response对象的属性和方法
content:响应内容,返回Bytes数据cookies:如果一个响应中包含了cookie,那么该属性获取返回的cookie值 返回一个RequestsCookieJar对象,直接使用r.cookies['key']即可获取指定的cookie值 该对象有一个get_dict()方法可把该对象转换为dict类型。 encoding:返回或设置字符编码 headers:页面返回内容的头部信息(dict格式,大小写不敏感) request.headers:查看发送到服务器的请求头(dict格式,大小写不敏感) history:用于追踪重定向,返回一个list,里面包含所有重定向的信息和状态码 json():如果返回发是json格式,使用此方法把json数据转换为对象 status_code:返回状态吗(int) text:响应内容,返回Unicode字符串格式数据,requests会根据自己识别的字符编码(encoding属性的值)解码Bytes数据,所以有时候属性获取错误会返回乱码 url:查看访问的完整的url地址</pre><h2>三、下载文件</h2><pre> iter_content(chunk_size=1, decode_unicode=False) 一块一块的遍历要下载的内容 chunk_size:每一块的大小,单位字节 decode_unicode:是否使用最佳的基于响应的可用编码 iter_lines(chunk_size=512, decode_unicode=False, delimiter=None) 一行一行的遍历要下载的内容(官方说明:这种方法不安全)
import requests
data = requests.get("https://www.domain.com/filename.pdf",stream=True)
file_size=int(data.headers['content-length'])/8/1024
print('将要下载的文件大小为:'+str(file_size)+'kb')
with open(r"D:/down.pdf", "wb") as f:for chunk in data.iter_content(chunk_size=1024): if chunk: f.write(chunk)</pre><strong>进度条的实现</strong>
在Python3中,print()方法的默认结束符(end=’ ’),当调用完之后,光标自动切换到下一行,此时就不能更新原有输出。 将结束符改为" ",输出完成之后,光标会回到行首,并不换行。此时再次调用print()方法,就会更新这一行输出了。 也可以使用退格符"d",光标回退一格,可以使用多个,按需求回退。 在结束这一行输出时,将结束符改回“ ”或者不指定使用默认四、使用session对象
urllib库可以使用opener使用发送多个请求并且使用opener中保存的共享信息(如cookie信息),我们使用requests库的Session对象实现相同的功能(注意:这里的Session不是web开发中的session,这里只是一个会话对象)data={'user':'username','pwd':'password'} session=requests.Session() session.post('https://www.domain.com/login',data=data) #使用session对象登录网页,session对象会保存对话中的共享信息 session.get('https://www.domain.com/') #再使用该对象访问其他页面,返回一个Response对象 session.verify = '/path/to/certfile' #可以设置一些公用的属性用来改变后续使用该session对象访问的属性 #上例中设置一个SSL证书文件,后使用该session访问都会使用该SSL证书验证五、常见的身份认证
HTTP Basic Auth身份认证from requests.auth import HTTPBasicAuth requests.get('https://www.domain.com', auth=HTTPBasicAuth('username', 'password')) HTTP Basic Auth 特别常用,Requests就提供了一种简写的使用方式: requests.get('https://www.domain.com', auth=('username', 'password'))摘要式身份认证from requests.auth import HTTPDigestAuth requests.get('https://www.domain.com', auth=HTTPDigestAuth('user', 'pass'))