首页 > python学习 > python中的requests库
2020
03-30

python中的requests库

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', '第一行内容\n第二行内容\n')}
        #发送作为文件来接收的字符串
        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地址

三、下载文件

    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.qingheluo.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)

进度条的实现

    在Python3中,print()方法的默认结束符(end=’\n’),当调用完之后,光标自动切换到下一行,此时就不能更新原有输出。
    将结束符改为"\r",输出完成之后,光标会回到行首,并不换行。此时再次调用print()方法,就会更新这一行输出了。
    也可以使用退格符"\d",光标回退一格,可以使用多个,按需求回退。
    在结束这一行输出时,将结束符改回“\n”或者不指定使用默认

四、使用session对象

urllib库可以使用opener使用发送多个请求并且使用opener中保存的共享信息(如cookie信息),我们使用requests库的Session对象实现相同的功能(注意:这里的Session不是web开发中的session,这里只是一个会话对象)

    data={'user':'username','pwd':'password'}
    session=requests.Session()
    session.post('https://www.qingheluo.com/login',data=data)
    #使用session对象登录网页,session对象会保存对话中的共享信息
    session.get('https://www.qingheluo.com/')
    #再使用该对象访问其他页面,返回一个Response对象
    session.verify = '/path/to/certfile'
    #可以设置一些公用的属性用来改变后续使用该session对象访问的属性
    #上例中设置一个SSL证书文件,后使用该session访问都会使用该SSL证书验证

五、常见的身份认证

HTTP Basic Auth身份认证

from requests.auth import HTTPBasicAuth
requests.get('https://www.qingheluo.com', auth=HTTPBasicAuth('username', 'password'))
HTTP Basic Auth 特别常用,Requests就提供了一种简写的使用方式:
requests.get('https://www.qingheluo.com', auth=('username', 'password'))

摘要式身份认证

from requests.auth import HTTPDigestAuth
requests.get('https://www.qingheluo.com', auth=HTTPDigestAuth('user', 'pass'))
最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。