1. Python基础教程
  2. 在SublimeEditor中配置Python环境
  3. Python代码中添加注释
  4. Python中的变量的使用
  5. Python中的数据类型
  6. Python中的关键字
  7. Python字符串操作
  8. Python中的list操作
  9. Python中的Tuple操作
  10. Pythonmax()和min()–在列表或数组中查找最大值和最小值
  11. Python找到最大的N个(前N个)或最小的N个项目
  12. Python读写CSV文件
  13. Python中使用httplib2–HTTPGET和POST示例
  14. Python将tuple开箱为变量或参数
  15. Python开箱Tuple–太多值无法解压
  16. Pythonmultidict示例–将单个键映射到字典中的多个值
  17. PythonOrderedDict–有序字典
  18. Python字典交集–比较两个字典
  19. Python优先级队列示例

学习使用Python httplib2模块。的超文本传输协议(HTTP)是用于分布式,协作,超媒体信息系统的应用协议。HTTP是万维网数据通信的基础。

Python httplib2模块提供了用于通过HTTP访问Web资源的方法。它支持许多功能,例如HTTP和HTTPS,身份验证,缓存,重定向和压缩。

  1. $ service nginx status
  2. * nginx is running

我们在本地主机上运行nginx Web服务器。我们的一些示例将连接到本地运行的nginx服务器上的PHP脚本。

目录

检查httplib2库版本

使用httplib2读取网页

发送HTTP HEAD请求

发送HTTP GET请求

发送HTTP POST请求

发送用户代理信息

将用户名/密码添加到请求

检查httplib2库版本

第一个程序打印库的版本,其版权和文档字符串。

  1. #!/usr/bin/python3
  2. import httplib2
  3. print(httplib2.__version__)
  4. print(httplib2.__copyright__)
  5. print(httplib2.__doc__)

在httplib2.__version__给出的版本httplib2库中,httplib2.__copyright__给出了其版权,以及httplib2.__doc__它的文档字符串。

  1. $ ./version.py
  2. 0.8
  3. Copyright 2006, Joe Gregorio
  4. httplib2
  5. A caching http interface that supports ETags and gzip
  6. to conserve bandwidth.
  7. Requires Python 3.0 or later
  8. Changelog:
  9. 2009-05-28, Pilgrim: ported to Python 3
  10. 2007-08-18, Rick: Modified so it's able to use a socks proxy if needed.

这是示例的示例输出。

使用httplib2读取网页

在下面的示例中,我们展示了如何从名为www.something.com的网站获取HTML内容。

  1. #!/usr/bin/python3
  2. import httplib2
  3. http = httplib2.Http()
  4. content = http.request("[http://www.something.com](http://www.something.com)")[1]
  5. print(content.decode())

使用创建一个HTTP客户端httplib2.HTTP()。使用该request()方法创建一个新的HTTP请求。默认情况下,它是一个GET请求。返回值是响应和内容的元组。

  1. $ ./get_content.py
  2. <html><head><title>Something.</title></head>
  3. <body>Something.</body>
  4. </html>

这是示例的输出。

剥离HTML标签

以下程序获取一个小型网页,并剥离其HTML标签。

  1. #!/usr/bin/python3
  2. import httplib2
  3. import re
  4. http = httplib2.Http()
  5. content = http.request("[http://www.something.com](http://www.something.com)")[1]
  6. stripped = re.sub('<[^<]+?>', '', content.decode())
  7. print(stripped)

一个简单的正则表达式用于剥离HTML标记。请注意,我们正在剥离数据,我们没有对其进行清理。(这是两件事。)

  1. $ ./strip_tags.py
  2. Something.
  3. Something.

该脚本将打印网页的标题和内容。

检查响应状态

响应对象包含status提供响应状态代码的属性。

  1. #!/usr/bin/python3
  2. import httplib2
  3. http = httplib2.Http()
  4. resp = http.request("[http://www.something.com](http://www.something.com)")[0]
  5. print(resp.status)
  6. resp = http.request("[http://www.something.com/news/](http://www.something.com/news/)")[0]
  7. print(resp.status)

我们使用request()方法执行两个HTTP请求,并检查返回的状态。

  1. $ ./get_status.py
  2. 200
  3. 404

200是成功HTTP请求的标准响应,而404则表明找不到所请求的资源。

发送HTTP HEAD请求

HTTP HEAD方法检索文档标题。标头由字段组成,包括日期,服务器,内容类型或上次修改时间。

  1. #!/usr/bin/python3
  2. import httplib2
  3. http = httplib2.Http()
  4. resp = http.request("[http://www.something.com](http://www.something.com)", "HEAD")[0]
  5. print("Server: " + resp['server'])
  6. print("Last modified: " + resp['last-modified'])
  7. print("Content type: " + resp['content-type'])
  8. print("Content length: " + resp['content-length'])

该示例打印服务器,上次修改时间,内容类型和www.something.com网页的内容长度。

  1. $ ./do_head.py
  2. Server: Apache/2.4.12 (FreeBSD) OpenSSL/1.0.1l-freebsd mod_fastcgi/mod_fastcgi-SNAP-0910052141
  3. Last modified: Mon, 25 Oct 1999 15:36:02 GMT
  4. Content type: text/html
  5. Content length: 72

这是程序的输出。从输出中,我们可以看到该网页是由FreeBSD托管的Apache Web服务器交付的。该文档的最后修改时间为1999年。网页是HTML文档,其长度为72个字节。

发送HTTP GET请求

HTTP GET方法请求指定资源的表示形式。对于此示例,我们还将使用greet.php脚本:

  1. <?php
  2. echo "Hello " . htmlspecialchars($_GET['name']);
  3. ?>

在/usr/share/nginx/html/目录内,我们有此greet.php文件。该脚本返回name变量的值,该值是从客户端检索的。

该htmlspecialchars()函数将特殊字符转换为HTML实体;例如&到&amp.。

  1. #!/usr/bin/python3
  2. import httplib2
  3. http = httplib2.Http()
  4. content = http.request("[http://localhost/greet.php?name=Peter](http://localhost/greet.php?name=Peter)",
  5. method="GET")[1]
  6. print(content.decode())

该脚本将带有值的变量发送到服务器上的PHP脚本。该变量直接在URL中指定。

  1. $ ./mget.py
  2. Hello Peter
  3. 这是示例的输出。
  4. $ tail -1 /var/log/nginx/access.log
  5. 127.0.0.1 - - [21/Aug/2016:17:32:31 +0200] "GET /greet.php?name=Peter HTTP/1.1" 200 42 "-"
  6. "Python-httplib2/0.8 (gzip)"

我们检查了nginx访问日志。

发送HTTP POST请求

POST请求方法请求Web服务器接受并存储请求消息正文中包含的数据。上载文件或提交完整的Web表单时经常使用它。

  1. <?php
  2. echo "Hello " . htmlspecialchars($_POST['name']);
  3. ?>

在本地Web服务器上,我们有此target.php文件。它只是将过帐的值打印回客户。

  1. #!/usr/bin/python3
  2. import httplib2
  3. import urllib
  4. http = httplib2.Http()
  5. body = {'name': 'Peter'}
  6. content = http.request("[http://localhost/target.php](http://localhost/target.php)",
  7. method="POST",
  8. headers={'Content-type': 'application/x-www-form-urlencoded'},
  9. body=urllib.parse.urlencode(body) )[1]
  10. print(content.decode())

脚本发送name带有Peter值的键的请求。数据使用urllib.parse.urlencode()方法进行编码,并在请求的正文中发送。

  1. $ ./mpost.py
  2. Hello Peter

这是mpost.py脚本的输出。

  1. $ tail -1 /var/log/nginx/access.log
  2. 127.0.0.1 - - [23/Aug/2016:12:21:07 +0200] "POST /target.php HTTP/1.1"
  3. 200 37 "-" "Python-httplib2/0.8 (gzip)"

使用POST方法时,不会在请求URL中发送该值。

发送用户代理信息

在本节中,我们指定用户代理的名称。

  1. <?php
  2. echo $_SERVER['HTTP_USER_AGENT'];
  3. ?>

在nginx文档根目录下,我们有agent.php文件。它返回用户代理的名称。

  1. #!/usr/bin/python3
  2. import httplib2
  3. http = httplib2.Http()
  4. content = http.request("[http://localhost/agent.php](http://localhost/agent.php)", method="GET",
  5. headers={'user-agent': 'Python script'})[1]
  6. print(content.decode())

该脚本向脚本创建一个简单的GET请求agent.php。在headers字典中,我们指定用户代理。PHP脚本将读取此内容,并将其返回给客户端。

  1. $ ./user_agent.py
  2. Python script

服务器使用我们随请求发送的代理名称进行了响应。

向请求添加用户名/密码

客户端的add_credentials()方法设置用于领域的名称和密码。安全领域是一种用于保护Web应用程序资源的机制。

  1. $ sudo apt-get install apache2-utils
  2. $ sudo htpasswd -c /etc/nginx/.htpasswd user7
  3. New password:
  4. Re-type new password:
  5. Adding password for user user7

我们使用该htpasswd工具创建用于基本HTTP身份验证的用户名和密码。

  1. location /secure {
  2. auth_basic "Restricted Area";
  3. auth_basic_user_file /etc/nginx/.htpasswd;
  4. }

在nginx /etc/nginx/sites-available/default配置文件中,我们创建一个安全页面。领域的名称为“禁区”。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>Secure page</title>
  5. </head>
  6. <body>
  7. <p>
  8. This is a secure page.
  9. </p>
  10. </body>
  11. </html>

在/usr/share/nginx/html/secure目录中,我们有上面的HTML文件。

  1. #!/usr/bin/python3
  2. import httplib2
  3. user = 'user7'
  4. passwd = '7user'
  5. http = httplib2.Http()
  6. http.add_credentials(user, passwd)
  7. content = http.request("[http://localhost/secure/](http://localhost/secure/)")[1]
  8. print(content.decode())

该脚本连接到安全网页;它提供访问该页面所需的用户名和密码。

  1. $ ./credentials.py
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <title>Secure page</title>
  6. </head>
  7. <body>
  8. <p>
  9. This is a secure page.
  10. </p>
  11. </body>
  12. </html>

使用正确的凭据,脚本将返回受保护的页面。

在本教程中,我们探索了Python httplib2模块。

(Python基础教程之十三)Python中使用httplib2 – HTTP GET和POST示例的更多相关文章

  1. (Python基础教程之八)Python中的list操作

    Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...

  2. 用python写网路爬虫 PDF高清完整版免费下载 Python基础教程免费电子书 python入门书籍免费下载

    <用python写网路爬虫PDF免费下载>PDF书籍下载 内容简介 作为一种便捷地收集网上信息并从中抽取出可用信息的方式,网络爬虫技术变得越来越有用.使用Python这样的简单编程语言,你 ...

  3. python基础教程001_安装python

    1.安装python Windows http://www.python.org下载python安装包 比如python-2.7.12.msi执行安装 安装完毕后,开始->搜索程序跟文件-> ...

  4. 【Python】Python基础教程系列目录

    Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. 在现在的工作及开发当中,Python的使用越来越广泛,为了方便大家的学习,Linux大学 特推出了 <Python基 ...

  5. Python 基础教程

    Python 基础教程 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像P ...

  6. Python基础教程系列目录,最全的Python入门系列教程!

    Python是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. 在现在的工作及开发当中,Python的使用越来越广泛,为了方便大家的学习,Linux大学 特推出了 <Python基 ...

  7. 改写《python基础教程》中的一个例子

    一.前言 初学python,看<python基础教程>,第20章实现了将文本转化成html的功能.由于本人之前有DIY一个markdown转html的算法,所以对这个例子有兴趣.可仔细一看 ...

  8. .Net程序员之Python基础教程学习----列表和元组 [First Day]

    一. 通用序列操作: 其实对于列表,元组 都属于序列化数据,可以通过下表来访问的.下面就来看看序列的基本操作吧. 1.1 索引: 序列中的所有元素的下标是从0开始递增的. 如果索引的长度的是N,那么所 ...

  9. python基础教程笔记—即时标记(详解)

    最近一直在学习python,语法部分差不多看完了,想写一写python基础教程后面的第一个项目.因为我在网上看到的别人的博客讲解都并不是特别详细,仅仅是贴一下代码,书上内容照搬一下,对于当时刚学习py ...

随机推荐

  1. mybatis源码学习:从SqlSessionFactory到代理对象的生成

    目录 一.根据XML配置文件构建SqlSessionFactory 二.通过SqlSessionFactory创建SqlSession 三.getMapper获取动态代理对象 一.根据XML配置文件构 ...

  2. SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回

    SpringBoot系列(十)统一异常处理与统一结果返回 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列 ...

  3. Win7+Linux双系统,完美解决删除Linux后出现的任何问题!

    首先,进入到Win7,安装MiniTool Partition Wizard Home Edition删除掉Linux分区, 点Yes 然后选中 这里选中这个,重写MBR,开机神马grub神马问题都没 ...

  4. LDA概率主题模型

    目录 LDA 主题模型 几个重要分布 模型 Unigram model Mixture of unigrams model PLSA模型 LDA 怎么确定LDA的topic个数? 如何用主题模型解决推 ...

  5. QMessage自动定时关闭

    QMessageBox *box = new QMessageBox(QMessageBox::Information,tr("test"),tr("testtest&q ...

  6. JAVA企业级应用TOMCAT实战(三)

    JVM优化涉及到两大方面我个人的理解 .如何分配JVM的内存空间 .我应该使用什么垃圾回收器 JVM产生的垃圾需要回收.回收有不同的回收器. JVM的调优需要了解各个垃圾回收机制的原理. 终极目标:降 ...

  7. php private学习笔记

    类的权限修饰符,放在属性/方法的前面.用来说明属性/方法的权限特点. 三种权限修饰符 private  私有的 public   公共 protected  保护的 privata 的属性.方法只能在 ...

  8. [每日短篇] 1C - Spring Data JPA (0)

    2019独角兽企业重金招聘Python工程师标准>>> 准备把 Spring Data JPA 完整看一遍,顺便把关键要点记录一下.在写这篇文章的今天,再不用 Spring Boot ...

  9. Nakamori Akina

    听过中森明菜的歌以后,一直想写点什么.恰好前段时间看过她的一个访谈https://b23.tv/av13810011,节目里已经39岁左右的她看着已经有些衰老,但是那份属于她的天真却保持的很好. 节目 ...

  10. XML--XML从入门到精通 Part 1 认识XML

    XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没有被预定义.您需要 ...