python****网络编程常用库使用手册
一、urllib3
** Urllib3****是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库里所没有的重要特性:**
1、 线程安全
2、 连接池
3、 客户端SSL/TLS验证
4、 文件分部编码上传
5、 协助处理重复请求和HTTP重定位
6、 支持压缩编码
7、 支持HTTP和SOCKS代理
8、 100%测试覆盖率
下面将针对urllib3功能进行详细介绍。
这是一个简单的请求例子:首先使用PoolManager()生成请求,由该实例对象处理与线程池的链接及线程安全的所有细节;使用request()创建请求,其中包含请求方式及url,request()方法返回一个HTTPResponse对象;当然,request()支持添加参数,用法如下:
直接添加参数字典即可。除了fields=参数外,还有headers={}构造请求头。
对于GET/HEAD/DELETE请求可以直接定义字典传给request()即可;
对于POST/PUT则需要对参数进行编码,然后连接至url后面,例如:
这里引入了一个参数转querystring的方法urlencode
def url_encoding(data_): data_list = [] for k,v in data_.items(): str_ = str(k) + '=' + str(v)
data_list.append(str_)
strr = '&'.join(data_list) return strr
源码类似这样
通过定义body参数并定义headers的Content-Type参数来发送已经编译 的json数据,例如:
使用nultipart/form-data编码方式上传文件可以使用和传入form-data一样的方法,并将文件定义为一个元组,例如:
如果发送原始二进制数据比如图片视频等,只要定义body数据即可,同时需要对header的Content-Type参数进行设置,例如:
超时设定timeout
请求重试
原理与handles rediect一样,通过设置retries参数进行控制,urllib3默认三次请求重试,进行三次方向改变,
给retries参数定义一个整型来改变请求重试的次数:
关闭请求重试(retrying request)及重定向(redirect)只要将retries定义为False即可:
关闭重定向(redirect)但保持重试(retrying request),将redirect参数定义为False即可:
4****、要进行更精细的控制,可以使用retry实例,通过该实例可以对请求的重试进行更精细的控制。例如,进行3次请求重试,但是只进行2次重定向:
如果想让所有请求都遵循一个retry策略,可以在PoolManager中定义retry参数:
二、requests
requests****库可以通过pip install直接安装,在功能与易用性方面,requests
是非常出色的。以下通过举例说明用法,参考自官方文档。
【get请求】****:
如果需要传参,则直接在定义字典,已字典方式进行传参即可:
请求完成可以通过r.url获得已经组合形成的URL,当然当参数中含有列表时,同样可以进行传参:
以下是一个添加cookie的过程:
上面的cookie添加使用了RequestsCookieJar()方法,它的行为与字典类似,但是界面更为完整,适合跨域路径使用。
【post请求】****,传参方式与get一致:
其他请求方式:
【返回数据处理】
当返回数据为文本时,通过r.text获得返回数据:
通常编码方式是在header中已经定义好的,可以通过r.encoding查看,当你需要改变编码方式时可以直接使用r.encoding=’utf-8’来改变返回数据的编码方式。
当返回数据为二进制数据时,需要使用r.content进行返回数据获得:
可以看到两种方式返回的数据一个为unicode,一个为bytes,看起来很像其实不一样。
其他返回有:
r.status_code 返回状态码
r.raw 返回原始响应体一个response对象可以使用r.raw.read()读取
r.headers ****返回响应头(响应头字典键不区分大小写)
r.json()
r.raise_for_status() 失败请求跑出异常
r.cookies[‘example_cookie_name’] 取得cookie
【上传文件】
以下直接举例代码:
import requests
url = 'http://127.0.0.1:5000/upload'
files = {'file': open('/home/lyb/sjzl.mpg', 'rb')}
files = {'file': ('report.jpg', open('/home/lyb/sjzl.mpg', 'rb'))} #显式的设置文件名
r = requests.post(url, files=files)
print(r.text)
已二进制方式(rb)打开文件,直接在post方式里添加文件即可上传
【身份验证】
基本身份验证(HTTP Basic Auth)
摘要式身份认证
Oauth1****认证
r.status_code == requests.codes.ok****(requests附带的内置状态码查询对象)
【会话对象】
会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling功能。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。
以下是一个跨请求保持cookie的例子:
先创建session,然后使用这个session进行请求,在这个session中会保存所传入的cookie。
会话还可以用作前后文管理器,这样就能确保 with 区块退出后会话能被关闭,即使发生了异常也一样:
【请求与响应对象】
任何时候进行了类似 requests.get() 的调用,你都在做两件主要的事情。其一,你在构建一个 Request对象, 该对象将被发送到某个服务器请求或查询一些资源。其二,一旦 requests 得到一个从服务器返回的响应就会产生一个 Response 对象。该响应对象包含服务器返回的所有信息,也包含你原来创建的 Request 对象。
如果想得到发送到服务器的请求的头部,我们可以简单地访问该请求,然后是该请求的头部:
【准备的请求(Prepared Request)】
当你从 API 或者会话调用中收到一个 Response对象时,request 属性其实是使用了 PreparedRequest。有时在发送请求之前,你需要对 body 或者 header (或者别的什么东西)做一些额外处理,下面演示了一个简单的做法: