python网络编程拾遗

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 (或者别的什么东西)做一些额外处理,下面演示了一个简单的做法:

你可能感兴趣的:(python网络编程拾遗)