httplib,urllib和urllib2

时间:2022-09-01 18:37:09

一、httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的http实现。

import httplib

conn = httplib.HTTPConnection("google.com")

conn.request('get', '/')
print conn.getresponse().read()

conn.close()

httplib.HTTPConnection ( host [ , port [ , strict [ , timeout ]]] )

HTTPConnection类的构造函数,表示一次与服务器之间的交互,即请求/响应。参数host表示服务器主机,如:http://www.csdn.net/;port为端口号,默认值为80;
参数strict的 默认值为false, 表示在无法解析服务器返回的状态行时( status line) (比较典型的状态行如:
HTTP/1.0 200 OK ),是否抛BadStatusLine 异常;可选参数timeout 表示超时时间。

HTTPConnection提供的方法:

HTTPConnection.request ( method , url [ , body [ , headers ]] )

调用request 方法会向服务器发送一次请求,method 表示请求的方法,常用有方法有get 和post ;url
表示请求的资源的url ;body 表示提交到服务器的数据,必须是字符串(如果method 是”post” ,则可以把body
理解为html 表单中的数据);headers 表示请求的http 头。


HTTPConnection.getresponse ()

获取Http 响应。返回的对象是HTTPResponse 的实例,关于HTTPResponse 在下面 会讲解。


HTTPConnection.connect ()

连接到Http 服务器。


HTTPConnection.close ()

关闭与服务器的连接。


HTTPConnection.set_debuglevel ( level )

设置高度的级别。参数level 的默认值为0 ,表示不输出任何调试信息。


httplib.HTTPResponse

HTTPResponse表示服务器对客户端请求的响应。往往通过调用HTTPConnection.getresponse()来创建,它有如下方法和属性:


HTTPResponse.read([amt])

获取响应的消息体。如果请求的是一个普通的网页,那么该方法返回的是页面的html。可选参数amt表示从响应流中读取指定字节的数据。


HTTPResponse.getheader(name[, default])

获取响应头。Name表示头域(header
field)名,可选参数default在头域名不存在的情况下作为默认值返回。


HTTPResponse.getheaders()

以列表的形式返回所有的头信息。


HTTPResponse.msg

获取所有的响应头信息。


HTTPResponse.version

获取服务器所使用的http协议版本。11表示http/1.1;10表示http/1.0。


HTTPResponse.status

获取响应的状态码。如:200表示请求成功。


HTTPResponse.reason

返回服务器处理请求的结果说明。一般为”OK”


下面通过一个例子来熟悉HTTPResponse中的方法:

import httplib

conn = httplib.HTTPConnection("www.g.com", 80, False)

conn.request('get', '/', headers = {"Host": "www.google.com",

"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5",

"Accept": "text/plain"})

res = conn.getresponse()
print 'version:', res.version
print 'reason:', res.reason
print 'status:', res.status
print 'msg:', res.msg
print 'headers:', res.getheaders()
#html

#print '\n' + '-' * 50 + '\n'

#print res.read()
conn.close() 

Httplib模块中还定义了许多常量,如:

Httplib. HTTP_PORT 的值为80,表示默认的端口号为80;

Httplib.OK 的值为200,表示请求成功返回;

Httplib. NOT_FOUND 的值为404,表示请求的资源不存在;

可以通过httplib.responses 查询相关变量的含义,如:

Print httplib.responses[httplib.NOT_FOUND] #not found

更多关于httplib的信息,请参考Python手册httplib 模块。

urllib
和urllib2实现的功能大同小异,但urllib2要比urllib功能等各方面更高一个层次。目前的HTTP访问大部分都使用urllib2.

使用例子:

    1. #!/usr/bin/python
    2. # -*- coding:utf-8 -*-
    3. # httplib_test.py
    4. # author:wklken
    5. # 2012-03-17  wklken#yeah.net
    6. def use_httplib():
    7. import httplib
    8. conn = httplib.HTTPConnection("www.baidu.com")
    9. i_headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5",
    10. "Accept": "text/plain"}
    11. conn.request("GET", "/", headers = i_headers)
    12. r1 = conn.getresponse()
    13. print "version:", r1.version
    14. print "reason:", r1.reason
    15. print "status:", r1.status
    16. print "msg:", r1.msg
    17. print "headers:", r1.getheaders()
    18. data = r1.read()
    19. print len(data)
    20. conn.close()
    21. if __name__ == "__main__":
    22. use_httplib()

二、使用urllib2,太强大

req = urllib2.Request('http://pythoneye.com')

response = urllib2.urlopen(req)

the_page = response.read()

FTP同样:

req = urllib2.Request('ftp://pythoneye.com')

urlopen返回的应答对象response有两个很有用的方法info()和geturl()

geturl — 这个返回获取的真实的URL,这个很有用,因为urlopen(或者opener对象使用的)或许

会有重定向。获取的URL或许跟请求URL不同。


Data数据

有时候你希望发送一些数据到URL


post方式:

values ={'body' : 'test short talk','via':'xxxx'}

data = urllib.urlencode(values)

req = urllib2.Request(url, data)

get方式:

data['name'] = 'Somebody Here'

data['location'] = 'Northampton'

data['language'] = 'Python'

url_values = urllib.urlencode(data)

url = 'http://pythoneye.com/example.cgi'

full_url = url + '?' + url_values

data = urllib2.open(full_url)

使用Basic HTTP Authentication:

import urllib2
# Create an OpenerDirector with support for Basic HTTP Authentication...
auth_handler = urllib2.HTTPBasicAuthHandler()

auth_handler.add_password(realm='PDQ Application',

uri='https://pythoneye.com/vecrty.py',

user='user',

passwd='pass')

opener = urllib2.build_opener(auth_handler)
# ...and install it globally so it can be used with urlopen.
urllib2.install_opener(opener)

urllib2.urlopen('http://www. pythoneye.com/app.html')

使用代理ProxyHandler:

proxy_handler = urllib2.ProxyHandler({'http': 'http://www.example.com:3128/'})

proxy_auth_handler = urllib2.HTTPBasicAuthHandler()

proxy_auth_handler.add_password('realm', 'host', 'username', 'password')

opener = build_opener(proxy_handler, proxy_auth_handler)
# This time, rather than install the OpenerDirector, we use it directly:
opener.open('http://www.example.com/login.html')

URLError–HTTPError:

from urllib2 import Request, urlopen, URLError, HTTPError

req = Request(someurl)
try:

response = urlopen(req)
except HTTPError, e:

print 'Error code: ', e.code
except URLError, e:

print 'Reason: ', e.reason
else:

.............

或者:

from urllib2 import Request, urlopen, URLError

req = Request(someurl)
try:

response = urlopen(req)
except URLError, e:

if hasattr(e, 'reason'):

print 'Reason: ', e.reason

elif hasattr(e, 'code'):

print 'Error code: ', e.code

else:

.............

通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生

异常同样会带有”reason”属性,它是一个tuple,包含了一个错误号和一个错误信息

req = urllib2.Request('http://pythoneye.com')
try:

urllib2.urlopen(req)
except URLError, e:

print e.reason

print e.code

print e.read()

最后需要注意的就是,当处理URLError和HTTPError的时候,应先处理HTTPError,后处理URLError

Openers和Handlers:

opener使用操作器(handlers)。所有的重活都交给这些handlers来做。每一个handler知道

怎么打开url以一种独特的url协议(http,ftp等等),或者怎么处理打开url的某些方面,如,HTTP重定向,或者HTTP

cookie。

默认opener有对普通情况的操作器 (handlers)- ProxyHandler, UnknownHandler,
HTTPHandler,

HTTPDefaultErrorHandler, HTTPRedirectHandler, FTPHandler,
FileHandler, HTTPErrorProcessor.

再看python API:Return an OpenerDirector instance, which chains the
handlers in the order given

这就更加证明了一点,那就是opener可以看成是一个容器,这个容器当中放的是控制器,默认的,容器当中有五个控制

器,程序员也可以加入自己的控制器,然后这些控制器去干活。

class HTTPHandler(AbstractHTTPHandler):

def http_open(self, req):

return self.do_open(httplib.HTTPConnection, req)

http_request = AbstractHTTPHandler.do_request_

HTTPHandler是Openers当中的默认控制器之一,看到这个代码,证实了urllib2是借助于httplib实现的,同时也证实了Openers和Handlers的关系。

httplib,urllib和urllib2的更多相关文章

  1. python基于http协议编程:httplib,urllib和urllib2<转>

    httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的http实现. httplib.HTTPConnecti ...

  2. Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块

    Python第十三天   django 1.6   导入模板   定义数据模型   访问数据库   GET和POST方法    SimpleCMDB项目   urllib模块   urllib2模块 ...

  3. python的httplib、urllib和urllib2的区别及用

    慢慢的把它们总结一下,总结就是最好的学习方法 宗述 首先来看一下他们的区别 urllib和urllib2 urllib 和urllib2都是接受URL请求的相关模块,但是urllib2可以接受一个Re ...

  4. [转]Python中urllib与urllib2的区别与联系

    引用文章1:http://my.oschina.net/u/558071/blog/144792 引用文章2:http://zhuoqiang.me/python-urllib2-usage.html ...

  5. Python:urllib和urllib2的区别(转)

    原文链接:http://www.cnblogs.com/yuxc/ 作为一个Python菜鸟,之前一直懵懂于urllib和urllib2,以为2是1的升级版.今天看到老外写的一篇<Python: ...

  6. Python urllib和urllib2模块学习&lpar;一)

    (参考资料:现代魔法学院 http://www.nowamagic.net/academy/detail/1302803) Python标准库中有许多实用的工具类,但是在具体使用时,标准库文档上对使用 ...

  7. python urllib和urllib2 区别

    python有一个基础的库叫httplib.httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的http实现 ...

  8. 详解:Python2中的urllib、urllib2与Python3中的urllib以及第三方模块requests

    在python2中,urllib和urllib2都是接受URL请求的相关模块,但是提供了不同的功能.两个最显著的不同如下: 1.urllib2可以接受一个Request类的实例来设置URL请求的hea ...

  9. 关于urllib、urllib2爬虫伪装的总结

    站在网站管理的角度,如果在同一时间段,大家全部利用爬虫程序对自己的网站进行爬取操作,那么这网站服务器能不能承受这种负荷?肯定不能啊,如果严重超负荷则会时服务器宕机(死机)的,对于一些商业型的网站,宕机 ...

随机推荐

  1. net之工作流工程展示及代码分享&lpar;记录&rpar;

    http://www.cnblogs.com/thanks/p/4183235.html

  2. git的使用,通过git上传修改工程

    一:下载git,https://git-scm.com/downloads(若下载速度慢,可下载百度下的)接下来,默认配置,一直next 二:在github上注册账号,并新建一个项目test(英文有点 ...

  3. Count the Trees&lbrack;HDU1131&rsqb;

    Count the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  4. 让Fiddler能够检测到localhost的http数据

    用 vs.net开发调试网站程序时经常有这样的地址: http://localhost:2033/ 然而在开启 Fiddler 后会发现Fiddler 完全抓不到任何封包. 主要的原因是因为 Fidd ...

  5. HDU 1025 &lpar;LIS&plus;二分&rpar; Constructing Roads In JGShining&&num;39&semi;s Kingdom

    这是最大上升子序列的变形,可并没有LIS那么简单. 需要用到二分查找来优化. 看了别人的代码,给人一种虽不明但觉厉的赶脚 直接复制粘贴了,嘿嘿 原文链接: http://blog.csdn.net/i ...

  6. jQuery&period;data的是jQuery的数据缓存系统

    jQuery.Data源码 jQuery.data的是jQuery的数据缓存系统 jQuery.data的是jQuery的数据缓存系统.它的主要作用就是为普通对象或者DOM元素添加数据. 1 内部存储 ...

  7. MySQL优化GROUP BY-松散索引扫描与紧凑索引扫描

    满足GROUP BY子句的最一般的方法是扫描整个表并创建一个新的临时表,表中每个组的所有行应为连续的,然后使用该临时表来找到组并应用累积函数(如果有).在某些情况中,MySQL能够做得更好,即通过索引 ...

  8. LeetCode算法题-Prime Number of Set Bits in Binary Representation(Java实现)

    这是悦乐书的第311次更新,第332篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第180题(顺位题号是762).给定两个正整数L和R,在[L,R]范围内,计算每个整数的 ...

  9. Python基础知识当中容易混淆的几个知识点

    在Python的基础知识当中,对于类实现可迭代功能有了一种新的方式,而这种方式则有别于我们学.NET等其他高级语言. 在Python当中,目前常用的有两种方式来实现这种迭代器的返回:__iter__ ...

  10. 运行 svgatest 显示 mmap &sol;dev&sol;zero Permission denied 解决办法

    答案是我在这个网站上找到的: 执行 xset dpms force off 命令就可以解决掉这个问题. 再次运行 svgatest 程序,得到了预期的结果,perfect!