为什么80%的码农都做不了架构师?>>>   

浅谈Python http库 httplib2

  • http.client 是实现了rfc 2616, http 协议的底层库
  • urllib.request 建立在http.client之上一个抽象层。 它为访问http 和 ftp 服务器提供了一个标准的api,可以自动跟随http 重定向, 并且处理了一些常见形式的http 认证

httplib2,一个第三方的开源库,它比http.client更完整的实现了http协议,同时比urllib.request提供了更好的抽象。

一个httplib2.Http 类的实例

#coding=utf8import httplib2#获取HTTP对象h =httplib2.Http()#发出同步请求,并获取内容resp, content = h.request("http://www.weirdbird.net/")
print resp
print content

一旦你有了Http对象, 获取数据非常简单,以你要的数据的地址作为参数调用request()方法就可以了。这会对该url执行一个http GET请求

request() 方法返回两个值。第一个是一个httplib2.Response对象,其中包含了服务器返回的所有http头。比如, status为200 表示请求成功。

content 变量包含了http服务器返回的实际数据。数据以bytes对象返回,不是字符串。 如果你需要一个字符串,你需要确定字符编码并自己进行转换

httplib2 缓存处理

#coding=utf8
import httplib2
#获取HTTP对象
h =httplib2.Http('.cache')
#发出同步请求,并获取内容
resp, content = h.request("http://www.weirdbird.net/sitemap.xml")
print resp
# print contentprint("......"*3)
httplib2.debuglevel = 1
h1 = httplib2.Http('.cache')
resp,content = h1.request('http://www.weirdbird.net/sitemap.xml')print(resp)
print('debug',resp.fromcache)

此时debug 是true ,说明 是从 本地的.cache 进行读取,没经过原网站,若我不读缓存怎么办? head 上加:

resp,content = h1.request('http://www.weirdbird.net/sitemap.xml',headers={'cache-control':'no-cache' })

httplib2 允许你添加任意的http头部到发出的请求里。为了跳过所有缓存(不仅仅是你本地的磁盘缓存,也包括任何处于你和远程服务器之间的缓存代理服务器), 在headers字典里面加入no-cache头就可以了。

httplib2怎么处理Last-Modified和ETag头

故名思议, 这个是当服务器的资源改变了,若本地的缓存还有,进行更新的

http 为这种目的定义了Last-Modified和Etag头。 这些头被称为验证器(validators)。如果本地缓存已经不是新鲜的,客户端可以在下一个请求的时候发送验证器来检查数据实际上有没有改变。如果数据没有改变,服务器返回304状态码,但不返回数据。 所以虽然还会在网络上有一个来回,但是你最终可以少下载一点字节。

这可能会让人有些困惑。这里实际上有两个 状态码 — 304 (服务器这次返回的, 导致httplib2查看它的缓存), 和 200 (服务器上次返回的, 并和页面数据一起保存在httplib2的缓存里)。response.status返回缓存里的那个

http2lib 处理压缩

每一次httplib2 发送请求,它包含了Accept-Encoding头来告诉服务器它能够处理deflate 或者 gzip压缩。

当request()方法返回的时候,httplib2就已经解压缩了响应的体(body)并将其放在 content变量里。如果你想知道响应是否压缩过, 你可以检查response['-content-encoding']; 否则,不用担心了.

httplib2 处理重定向

302临时重定向

调用request()方法返回的response是最终url的响应 ttplib2 会将最终的 url以 content-location加入到 response字典中。这不是服务器返回的头,而是httplib2 特点的特征

response.previous属性持有前一个响应对象的引用,httplib2跟随那个响应获得了当前的响应对象。

response 和 response.previous 都是 httplib2.Response 对象。

这意味着你可以通过response.previous.previous 来反向跟踪重定向链到更前的请求。(场景: 一个url 重定向到第二个url,它又重定向到第三个url。这可能发生!) 在这例子里,我们已经到达了重定向链的开头,所有这个属性是None.

我们再次请求同一个url 发现变回了第一次 那样的返回

301 永久重定向

一旦 httplib2跟随了一个永久重定向, 所有后续的对这个url的请求会被透明的重写到目标url 而不会接触网络来访问原始的url。 记住, 调试还开着, 但没有任何网络活动的输出。

HTTP POST

POST 请求同GET 请求不同,因为是要提交到服务器的, 这个api方法必须的参数是status, 并且它应该是url编码过的。 这是一种很简单的序列化格式,将一组键值对(比如字典)转化为一个字符串。

POST 构造数据发送

from urllib.parse import urlencodeimport httplib2httplib2.debuglevel = 1h = httplib2.Http('.cache')data = {'status': 'Test update from Python 3'}h.add_credentials('diveintomark', 'MY_SECRET_PASSWORD', 'identi.ca')resp, content = h.request('https://identi.ca/api/statuses/update.xml','POST',urlencode(data),headers={'Content-Type': 'application/x-www-form-urlencoded'})

add_credentials()方法的第三个参数是该证书有效的域名。你应该总是指定这个参数! 如果你省略了这个参数,并且之后重用这个httplib2.Http对象访问另一个需要认证的站点,可能会导致httplib2将一个站点的用户名密码泄漏给其他站点。

记住, httplib2返回的数据总是字节串(bytes), 不是字符串。为了将其转化为字符串,你需要用合适的字符编码进行解码 比如:

print(content.decode('utf-8'))

xml操作

from xml.etree import ElementTree as etree
tree = etree.fromstring(content)
status_id = tree.findtext('id')
url = 'https://identi.ca/api/statuses/destroy/{0}.xml'.format(status_id)
resp, deleted_content = h.request(url, 'DELETE')

httplib2源码

一些httplib2 的demo

转载于:https://my.oschina.net/swrite/blog/180468

浅谈Python http库 httplib2相关推荐

  1. python functools partial_浅谈python标准库--functools.partial

    一.简单介绍: functools模块用于高阶函数:作用于或返回其他函数的函数.一般而言,任何可调用对象都可以作为本模块用途的函数来处理. functools.partial返回的是一个可调用的par ...

  2. python做小波分析_浅谈Python小波分析库Pywavelets的一点使用心得

    本文介绍了Python小波分析库Pywavelets,分享给大家,具体如下: # -*- coding: utf-8 -*- import numpy as np import math import ...

  3. 浅谈 Python 程序和 C 程序的整合

    浅谈 Python 程序和 C 程序的整合 Python 是一种用于快速开发软件的编程语言,它的语法比较简单,易于掌握,但存在执行速度慢的问题,并且在处理某些问题时存在不足,如对计算机硬件系统的访问, ...

  4. python 共享内存变量_浅谈python多进程共享变量Value的使用tips

    前言: 在使用tornado的多进程时,需要多个进程共享一个状态变量,于是考虑使用multiprocessing.Value(对于该变量的具体细节请查阅相关资料).在根据网上资料使用Value时,由于 ...

  5. python文件路径拼接多出斜杠_浅谈python中拼接路径os.path.join斜杠的问题

    浅谈python中拼接路径os.path.join斜杠的问题 调试程序的过程中,发现通过os.path.join拼接的路径出现了反斜杠 directory1='/opt/apps/upgradePac ...

  6. python打开文件夹中的tiff_浅谈python下tiff图像的读取和保存方法

    对比测试 scipy.misc和 PIL.Image和 libtiff.TIFF三个库 输入: 1. (读取矩阵) 读入uint8.uint16.float32的lena.tif 2. (生成矩阵) ...

  7. python 模拟浏览器selenium_浅谈python爬虫使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

  8. python 调用 .netcore api_浅谈Python调用XBee的API来进行通讯

    浅谈Python调用XBee的API来进行通讯 用python编程来控制串口(COM口),来让一对XBee进行通讯.不需要借助终端来发送和接收数据,增大了XBee使用的灵活性.这才是使用XBee模块的 ...

  9. python脚本开头怎么写_浅谈Python脚本开头及导包注释自动添加方法

    浅谈Python脚本开头及导包注释自动添加方法 1.开头:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定 #!/usr/bin/python 是用来 ...

最新文章

  1. Python和JavaScript之间的JSON日期时间
  2. JVM解惑:消失的异常堆栈,log中打印异常堆栈为空
  3. Linux下部署多个Tomcat
  4. 周鸿祎重申360不依靠弹窗广告盈利 增值服务是主要模式
  5. Mac新手用户需要了解的14个Spotlight搜索技巧
  6. asp.net.mvc 中form表单提交控制器的2种方法和控制器接收页面提交数据的4种方法...
  7. 机器学习十大算法的核心思想、工作原理、适用 情况及优缺点
  8. 更新CocoaPods1.1.0碰到的问题及知识点
  9. python物业管理系统_住宅小区物业管理系统分析与设计
  10. 程序员的mysql经典pdf_程序员的SQL金典 杨中科著 中文 PDF版
  11. mysql请假表_[源码和文档分享]基于JSP和MYSQL数据库实现的请假管理系统
  12. 火车头采集html5游戏,火车采集器7.6-火车头数据采集平台1.6教程
  13. 怎样申请MAC地址?
  14. 欢迎各位小伙伴来领取免费的安卓教程
  15. 牛客网-腾讯编程校招真题 编码 Java
  16. Excel如何快速批量生成指定性别的随机姓名
  17. ESP32学习笔记(45)——DAC接口使用
  18. 最新全球学术排名出炉:23所中国大学跻身世界前100名!
  19. Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
  20. 本人制作的视频汇总(原创视频)

热门文章

  1. 深度学习:pytorch学习
  2. c++ :静态函数的应用
  3. 【杂谈】从学生到讲师,我如何20天里在有三AI赚3万
  4. 【信息抽取】如何使用BERT进行关系抽取
  5. 【每周NLP论文推荐】 知识图谱重要论文介绍
  6. 【AI白身境】一文览尽计算机视觉研究方向
  7. 中国鱼胶原蛋白行业应用前景与十四五投资建议报告2022年
  8. 忘记农民就是忘本-农业大健康·万祥军:不要说自己是教授
  9. Java常用正则表达式
  10. Spark-1.6.0之Application运行信息记录器JobProgressListener