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功能进行详细介绍。

<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"><v:formulas></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path></v:stroke></v:shapetype><v:shape id="图片_x0020_1" o:spid="_x0000_i1052" type="#_x0000_t75" style="width:414.75pt;height:61.5pt;visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png" o:title=""></v:imagedata></v:shape>

这是一个简单的请求例子:首先使用PoolManager()生成请求,由该实例对象处理与线程池的链接及线程安全的所有细节;使用request()创建请求,其中包含请求方式及url,request()方法返回一个HTTPResponse对象;当然,request()支持添加参数,用法如下:

<v:shape id="图片_x0020_4" o:spid="_x0000_i1051" type="#_x0000_t75" style="width:327pt;height:63pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image002.png" o:title=""></v:imagedata></v:shape>

直接添加参数字典即可。除了fields=参数外,还有headers={}构造请求头。

对于GET/HEAD/DELETE请求可以直接定义字典传给request()即可;

对于POST/PUT则需要对参数进行编码,然后连接至url后面,例如:

<v:shape id="图片_x0020_5" o:spid="_x0000_i1050" type="#_x0000_t75" style="width:336.75pt;height:75.75pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image003.png" o:title=""></v:imagedata></v:shape>

这里引入了一个参数转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数据,例如:

<v:shape id="图片_x0020_6" o:spid="_x0000_i1049" type="#_x0000_t75" style="width:372pt;height:120.75pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image004.png" o:title=""></v:imagedata></v:shape>

使用nultipart/form-data编码方式上传文件可以使用和传入form-data一样的方法,并将文件定义为一个元组,例如: <v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style="width:24pt;height:24pt"> <v:shape id="图片_x0020_7" o:spid="_x0000_i1048" type="#_x0000_t75" style="width:372.75pt;
height:116.25pt;visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image005.png" o:title=""></v:imagedata></v:shape></v:shape>

如果发送原始二进制数据比如图片视频等,只要定义body数据即可,同时需要对header的Content-Type参数进行设置,例如:

<v:shape id="图片_x0020_8" o:spid="_x0000_i1047" type="#_x0000_t75" style="width:318pt;height:102.75pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image006.png" o:title=""></v:imagedata></v:shape>

超时设定timeout

<v:shape id="图片_x0020_9" o:spid="_x0000_i1046" type="#_x0000_t75" style="width:477.75pt;height:237.75pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image007.png" o:title=""></v:imagedata></v:shape>

请求重试

原理与handles rediect一样,通过设置retries参数进行控制,urllib3默认三次请求重试,进行三次方向改变,

给retries参数定义一个整型来改变请求重试的次数:

<v:shape id="图片_x0020_10" o:spid="_x0000_i1045" type="#_x0000_t75" style="width:402.75pt;height:15.75pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image008.png" o:title=""></v:imagedata></v:shape>

关闭请求重试(retrying request)及重定向(redirect)只要将retries定义为False即可:

<v:shape id="图片_x0020_11" o:spid="_x0000_i1044" type="#_x0000_t75" style="width:414.75pt;height:20.25pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image009.png" o:title=""></v:imagedata></v:shape>

关闭重定向(redirect)但保持重试(retrying request),将redirect参数定义为False即可:

<v:shape id="图片_x0020_12" o:spid="_x0000_i1043" type="#_x0000_t75" style="width:342.75pt;height:64.5pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image010.png" o:title=""></v:imagedata></v:shape>

4****、要进行更精细的控制,可以使用retry实例,通过该实例可以对请求的重试进行更精细的控制。例如,进行3次请求重试,但是只进行2次重定向:

<v:shape id="图片_x0020_13" o:spid="_x0000_i1042" type="#_x0000_t75" style="width:336.75pt;height:63pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image011.png" o:title=""></v:imagedata></v:shape>

如果想让所有请求都遵循一个retry策略,可以在PoolManager中定义retry参数:

<v:shape id="图片_x0020_14" o:spid="_x0000_i1041" type="#_x0000_t75" style="width:407.25pt;height:111.75pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image012.png" o:title=""></v:imagedata></v:shape>

二、requests

requests****库可以通过pip install直接安装,在功能与易用性方面,requests

是非常出色的。以下通过举例说明用法,参考自官方文档。

【get请求】****:

<v:shape id="图片_x0020_15" o:spid="_x0000_i1040" type="#_x0000_t75" style="width:337.5pt;height:29.25pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image013.png" o:title=""></v:imagedata></v:shape>

如果需要传参,则直接在定义字典,已字典方式进行传参即可:

<v:shape id="图片_x0020_18" o:spid="_x0000_i1039" type="#_x0000_t75" style="width:414.75pt;height:44.25pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image014.png" o:title=""></v:imagedata></v:shape>

请求完成可以通过r.url获得已经组合形成的URL,当然当参数中含有列表时,同样可以进行传参:

<v:shape id="图片_x0020_19" o:spid="_x0000_i1038" type="#_x0000_t75" style="width:415.5pt;height:78pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image015.png" o:title=""></v:imagedata></v:shape>

以下是一个添加cookie的过程:

<v:shape id="图片_x0020_25" o:spid="_x0000_i1037" type="#_x0000_t75" style="width:415.5pt;height:87pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image016.png" o:title=""></v:imagedata></v:shape>

上面的cookie添加使用了RequestsCookieJar()方法,它的行为与字典类似,但是界面更为完整,适合跨域路径使用。

【post请求】****,传参方式与get一致:

<v:shape id="图片_x0020_16" o:spid="_x0000_i1036" type="#_x0000_t75" style="width:414.75pt;height:28.5pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image017.png" o:title=""></v:imagedata></v:shape>

其他请求方式:

<v:shape id="图片_x0020_17" o:spid="_x0000_i1035" type="#_x0000_t75" style="width:415.5pt;height:64.5pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image018.png" o:title=""></v:imagedata></v:shape>

【返回数据处理】

当返回数据为文本时,通过r.text获得返回数据:

<v:shape id="图片_x0020_20" o:spid="_x0000_i1034" type="#_x0000_t75" style="width:414.75pt;height:51pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image019.png" o:title=""></v:imagedata></v:shape>

通常编码方式是在header中已经定义好的,可以通过r.encoding查看,当你需要改变编码方式时可以直接使用r.encoding=’utf-8’来改变返回数据的编码方式。

当返回数据为二进制数据时,需要使用r.content进行返回数据获得:

<v:shape id="图片_x0020_21" o:spid="_x0000_i1033" type="#_x0000_t75" style="width:415.5pt;height:40.5pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image020.png" o:title=""></v:imagedata></v:shape>

可以看到两种方式返回的数据一个为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

<v:shape id="图片_x0020_22" o:spid="_x0000_i1032" type="#_x0000_t75" style="width:415.5pt;height:105.75pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image021.png" o:title=""></v:imagedata></v:shape>

摘要式身份认证

<v:shape id="图片_x0020_23" o:spid="_x0000_i1031" type="#_x0000_t75" style="width:415.5pt;height:55.5pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image022.png" o:title=""></v:imagedata></v:shape>

Oauth1****认证

<v:shape id="图片_x0020_24" o:spid="_x0000_i1030" type="#_x0000_t75" style="width:415.5pt;height:135.75pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image023.png" o:title=""></v:imagedata></v:shape>

r.status_code == requests.codes.ok****(requests附带的内置状态码查询对象)

【会话对象】

会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling功能。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。

以下是一个跨请求保持cookie的例子:

<v:shape id="图片_x0020_26" o:spid="_x0000_i1029" type="#_x0000_t75" style="width:415.5pt;height:87.75pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image024.png" o:title=""></v:imagedata></v:shape>

先创建session,然后使用这个session进行请求,在这个session中会保存所传入的cookie。

会话还可以用作前后文管理器,这样就能确保 with 区块退出后会话能被关闭,即使发生了异常也一样:

<v:shape id="图片_x0020_27" o:spid="_x0000_i1028" type="#_x0000_t75" style="width:415.5pt;height:36.75pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image025.png" o:title=""></v:imagedata></v:shape>

【请求与响应对象】

任何时候进行了类似 requests.get() 的调用,你都在做两件主要的事情。其一,你在构建一个 Request对象, 该对象将被发送到某个服务器请求或查询一些资源。其二,一旦 requests 得到一个从服务器返回的响应就会产生一个 Response 对象。该响应对象包含服务器返回的所有信息,也包含你原来创建的 Request 对象。

如果想得到发送到服务器的请求的头部,我们可以简单地访问该请求,然后是该请求的头部:

<v:shape id="图片_x0020_28" o:spid="_x0000_i1027" type="#_x0000_t75" style="width:415.5pt;height:49.5pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image026.png" o:title=""></v:imagedata></v:shape>

【准备的请求(Prepared Request)】

当你从 API 或者会话调用中收到一个 Response对象时,request 属性其实是使用了 PreparedRequest。有时在发送请求之前,你需要对 body 或者 header (或者别的什么东西)做一些额外处理,下面演示了一个简单的做法:

<v:shape id="图片_x0020_29" o:spid="_x0000_i1026" type="#_x0000_t75" style="width:415.5pt;height:291.75pt;visibility:visible;
mso-wrap-style:square"><v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image027.png" o:title=""></v:imagedata></v:shape>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • CentOS 7.2安装手册 一、系统安装 1. 系统引导 (1)成功引导系统后,会出现下面的界面 <v:shap...
    全宇宙最帅De男人阅读 743评论 0 1
  • ORACLE安装 安装包: 1.VMware-workstation-full-11.1.0-2496824.ex...
    longfou阅读 388评论 0 0
  • 后期整理字体以及排版问题,修订不适合的翻译 “A wealth of information. Smart, ye...
    iamzzz阅读 732评论 0 0
  • Sass&Gulp 一、sass介绍 (一) SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计...
    锋享前端阅读 1,491评论 0 3
  • Prometheus TSDB是什么? (Time Series Database) 简单的理解为.一个优化后用来...
    ilkkzm阅读 19,226评论 0 4