copy from http://hi.baidu.com/chjj910/blog/item/7db5c24fbc699d19b2de0540.html

python基于http协议编程:httplib,urllib和urllib2(转)
2010-11-11 20:47
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.
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的关系。

绿色通道:好文要顶关注我收藏该文与我联系
Morya
关注 - 2
粉丝 - 0
+加关注

0
0
(请您对文章做出评价)

« 博主前一篇:browser1.py
» 博主后一篇:【转帖】用python爬虫抓站的一些技巧总结

Feedback

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import socks
import httplib2
url2 = r'http://www.cnblogs.com/'
url = r'http://passport.cnblogs.com/login.aspx'
body = [
('tbUserName', 'xxx'),
('tbPassword', 'xxx'),
('txtReturnUrl', 'http://home.cnblogs.com/'),
]
headers = {'Content-type': 'application/x-www-form-urlencoded',
'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17'}
#proxy = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, 'http://xxx.xxx.com', 8080)
http = httplib2.Http(
# proxy_info = proxy
)
response, content = http.request(url, 'GET', headers=headers,
#connection_type='http',
)
# set cookie
headers = {'Cookie': response['set-cookie']}
response, content = http.request(
url, 'POST', headers=headers, body=urllib.urlencode(body)
)
print type(content)
try:
content = unicode(content)
self.view.setHtml(content)
except:
return
return

转载于:https://www.cnblogs.com/cheungjustin/archive/2012/01/05/2313509.html

【转】urllib urllib2 httplib相关推荐

  1. python中 urllib, urllib2, httplib, httplib2 几个库的区别

    为什么80%的码农都做不了架构师?>>>    若只使用python3.X, 下面可以不看了, 记住有个urllib的库就行了 python2.X 有这些库名可用: urllib, ...

  2. python http2_python中 urllib, urllib2, httplib, httplib2 几个库的区别

    若只使用python3.X, 下面可以不看了, 记住有个urllib的库就行了 python2.X 有这些库名可用: urllib, urllib2, urllib3, httplib, httpli ...

  3. python通过get方式,post方式发送http请求和接收http响应-urllib urllib2

    python通过get方式,post方式发送http请求和接收http响应-- import urllib模块,urllib2模块, httplib模块 http://blog.163.com/xyc ...

  4. python http2_python2使用urllib/urllib2实现Http请求

    在Http请求中,最为常见的两种请求为GET.POST请求,下面实现方式主要是以urllib/urilib2方式实现. urllib/urllib2是python中两个内置的模块,要实现Http功能, ...

  5. Python urllib, urllib2, urllib3 以及 requests 的区别 (附个人一些看法)

    urllib python 标准 http 库, 无论是 python 2 还是 python 3 都有. urllib2 urllib2 是 只存在于 python 2 的一个 http 标准库. ...

  6. python urllib urllib2 urllib3 用法 区别

    目录 简介 1.打开远程文件 2.获取远程文件 一.urllib 1. urllib.request 1. 发起GET请求 2. 发起POST请求 3. 添加Headers 4. Request对象 ...

  7. 爬虫入门二(urllib,urllib2)

    看了下网上的概念,比较模糊不知道作用.利用例子总结了一下. 1.爬虫 网站有各种数据,获得自己感兴趣的数据并保存的一种脚本. 2.通信基础 1.post和get:(1)get是从服务器上获取数据,po ...

  8. urllib urllib2 自己用

    2019独角兽企业重金招聘Python工程师标准>>> URllib2 和 URLLib 区别的场合     urllib2 can accept a Request object ...

  9. python3:urllib/urllib2

    标题python3对urllib和urllib2进行了重构 python3对urllib和urllib2进行了重构,拆分成了urllib.request,urllib.response, urllib ...

最新文章

  1. 五款常用协议分析处理工具推荐
  2. 深度学习博士发出灵魂拷问:我是在做算法还是在调参?
  3. 【Redis学习笔记】2018-07-11 Redis指令学习5
  4. 【bzoj4571SCOI2016美味】
  5. ASCII + Url + Base64
  6. 关于调试过程中单片机复位的几点心得与体会
  7. Silverlight中如何实现上下标的显示
  8. iterm2 ssh 乱码_【已解决】Mac中iTerm2通过SSH连接远程服务器
  9. mysql5.7.24 安装步骤_MySQL5.7.24解压版安装步骤
  10. 用Python标准库turtle画一头金牛,祝您新年牛气冲天!
  11. 价格优化与定价管理软件行业调研报告 - 市场现状分析与发展前景预测
  12. 设计模式 - (3)抽象工厂模式(创建型)
  13. opencv 梯度幅值_OpenCV学习:图像边缘检测
  14. stm32最小原理图的PCB图绘制(含AHT20温度传感器)
  15. SPSS基础教程—怎样对数据进行综合评价排名
  16. S3C2440裸机------内存控制器
  17. c语言编程樱花树,分形樱花树(画画)
  18. float 精度探究
  19. 用户吐槽不能给安卓手机发视频,库克:“给你妈妈买台 iPhone !”
  20. win32 007

热门文章

  1. 生产环境中on yarn模式是否采用yarn session
  2. yarn界面中的Minimum Allocation和Maximum Allocation与yarn-site.xml中参数的对应关系
  3. hbase数据导入到mysql(转载+自己验证整理,目前失败)
  4. matlab求借带参数的方程组
  5. 'django_tables2' is not a registered tag library. Must be one of:
  6. 使用cython加密python代码
  7. 理解spark闭包以及broadcast(转载)
  8. The requested URL was not found on the server
  9. Linux下实现脚本监测特定进程占用内存情况
  10. 18.12.04 有品面试小记