urllib2.urlopen(url[, data][, timeout])

请求url,获得请求数据,url参数可以是个String,也可以是个Request参数

没有data参数时为GET请求,设置data参数时为POST请求,另外data格式必须为application/x-www-form-urlencoded,urllib.urlencode()能够设置请求参数的编码,data是字典,需要经urllib.urlencode()编码

timeout设置请求阻塞的超时时间,如果没有设置的话,会使用全局默认timeout参数;该参数只对HTTP、HTTPS、FTP生效

This function returns a file-like object with three additional methods:

  • geturl() — return the URL of the resource retrieved, commonly used to determine if a redirect was followed
  • info() — return the meta-information of the page, such as headers, in the form of an mimetools.Message instance (see Quick Reference to HTTP Headers)
  • getcode() — return the HTTP status code of the response
 class OpenerDirector

管理一系列的Handler,这些handler都有自己的功能实现和协议,后面会提到大量的Handler功能

 urllib2.build_opener([handler, ...])

返回OpenerDirector实例,实现了BaseHandler都可以生成Handler实例。Python已经内建许多的Handler,你可以替换或者添加新的Handler。

内建Handler如下:

ProxyHandler:处理代理操作

UnknownHandler:Raise URLError异常

HTTPHandler:处理HTTP的GET和POST操作

HTTPDefaultErrorHandler:处理HTTP Error的通用处理,所有的响应都会抛出HTTPError异常

HTTPRedirectHandler:处理HTTP重定向操作,如301、302、303等和HEAD请求的307都会执行重定向操作

FTPHandler:处理FTP操作

FileHandler:处理文件

HTTPErrorProcessor:处理非200异常

除去上面这些Handler,urllib2还有一些其它的Handler可供选择,这些Handler都能根据名称知晓其功能,不细作解释,包括但不仅限于:

HTTPCookieProcessor:处理cookie
HTTPBasicAuthHandler:处理Auth
ProxyBasicAuthHandler:处理Proxy和Auth
HTTPDigestAuthHandler:处理DigestAuth
ProxyDigestAuthHandler:处理ProxyDigest
HTTPSHandler:处理HTTPS请求
CacheFTPHandler:比FTPHandler多点功能。

urllib2对于opener的使用:
     urllib2.install_opener(opener)  

定义全局的OpenerDirector,如果执行这个方法,会把自己定义的Handler用在后续的URL处理上。

 class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

url和data的内容和前面的一致,添加了headers的信息,header的内容可以参考http://isilic.iteye.com/blog/1801072

origin_req_host应该是请求的服务器Host地址,unverifiable参数表明请求是否可验证

基本用法:

1)

     import urllib2
f = urllib2.urlopen('http://www.python.org/')
print f.read(100)

2)

     import urllib2
req = urllib2.Request(url='https://localhost/cgi-bin/test.cgi',data='Committed Data')
f = urllib2.urlopen(req)
print f.read()

3)

     import urllib
import urllib2
url = 'http://www.server.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'name' : 'Michael','language' : 'Python' }
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
req = urllib2.Request(url, data, headers)
f = urllib2.urlopen(req)
print f.read()

Proxy的使用相当广泛,对于单个应用来说,爬虫是很容易被封禁,如果使用Proxy模式,就能降低被封的风险,所以有需求的同学需要仔细看下Python urllib2对于Proxy的使用:

 import urllib2
proxy_handler = urllib2.ProxyHandler({'http': '127.0.0.1:80'}) //使用本机80端口的代理访问谷歌的内容
opener = urllib2.build_opener(proxy_handler)
urllib2.install_opener(opener)
f = urllib2.urlopen('http://www.google.com')
print f.read()

注意这个Proxy会将proxy_handler作为全局的ProxyHandler,这个未必是我们需要的,如果我们需要使用不同的Proxy,这个设置就有问题,需要修改为以下Proxy使用方式:

     import urllib2
proxy_handler = urllib2.ProxyHandler({'http': '127.0.0.1:80'})
opener = urllib2.build_opener(proxy_handler)
f = opener.open(url)
print f.read()

使用多个代理:

 import urllib2
proxyList=('211.167.112.14:80',
'210.32.34.115:8080',
'115.47.8.39:80',
'211.151.181.41:80',
'219.239.26.23:80'
)
for proxy in proxyList:
proxies={"":proxy}
proxy_handler=urllib2.ProxyHandler(proxies)
opener=urllib2.build_opener(proxy_handler)
f=opener.open("http://www.cc98.org")
print f.read()

对于cookie的处理也是有Handler自动处理的:因为 HTTP 协议是一个无状态(Stateless)的协议,服务器如何知道当前请求连接的用户是否已经登陆了呢?有两种方式: 1.在URI 中显式地使用 Session ID; 
2.利用 Cookie,大概过程是登陆一个网站后会在本地保留一个 Cookie,当继续浏览这个网站的时候,浏览器会把 Cookie 连同地址请求一起发送过去。

    import urllib2
import cookielib
cookies = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies))
response = opener.open('http://www.google.com')
for cookie in cookies:
if cookie.name == 'cookie_spec':
print cookie.value

处理cookie时一般是cookielib和HTTPCookieProcessor一起使用,HTTPCookieProcessor为handler。

cookielib模块定义了自动处理HTTP cookies的类,用来访问那些需要cookie数据的网站,cookielib模块包括 CookieJar,FileCookieJar,CookiePolicy,DefaultCookiePolicy,Cookie及 FileCookieJar的子类MozillaCookieJar和LWPCookieJar,CookieJar对象可以管理HTTP cookies,将cookie添加到http请求中,并能从http响应中得到cookie,FileCookieJar对象主要是从文件中读取 cookie或创建cookie,其中,MozillaCookieJar是为了创建与Mozilla浏览器cookies.txt兼容的 FileCookieJar实例,LWPCookieJar是为了创建与libwww-perl的Set-Cookie3文件格式兼容的 FileCookieJar实例,用LWPCookieJar保存的cookie文件易于人类阅读。默认的是FileCookieJar没有save函 数,而MozillaCookieJar或LWPCookieJar都已经实现了。 所以可以用MozillaCookieJar或LWPCookieJar,去自动实现cookie的save。

使用Basic HTTP Authentication:

     import urllib2
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='PDQ Application',
uri='https://mahler:8092/site-updates.py',
user='klem',
passwd='kadidd!ehopper')
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
f = urllib2.urlopen('http://www.server.com/login.html')
print f.read()

参考:

http://isilic.iteye.com/blog/1806403

http://www.devba.com/index.php/archives/4605.html

【python】urllib2的更多相关文章

  1. 【Python②】python之首秀

       第一个python程序 再次说明:后面所有代码均为Python 3.3.2版本(运行环境:Windows7)编写. 安装配置好python后,我们先来写第一个python程序.打开IDLE (P ...

  2. 【python】多进程锁multiprocess.Lock

    [python]多进程锁multiprocess.Lock 2013-09-13 13:48 11613人阅读 评论(2) 收藏 举报  分类: Python(38)  同步的方法基本与多线程相同. ...

  3. 【python】SQLAlchemy

    来源:廖雪峰 对比:[python]在python中调用mysql 注意连接数据库方式和数据操作方式! 今天发现了个处理数据库的好东西:SQLAlchemy 一般python处理mysql之类的数据库 ...

  4. 【python】getopt使用

    来源:http://blog.chinaunix.net/uid-21566578-id-438233.html 注意对比:[python]argparse模块 作者:limodou版权所有limod ...

  5. 【Python】如何安装easy_install?

    [Python]如何安装easy_install? http://jingyan.baidu.com/article/b907e627e78fe146e7891c25.html easy_instal ...

  6. 【Python】 零碎知识积累 II

    [Python] 零碎知识积累 II ■ 函数的参数默认值在函数定义时确定并保存在内存中,调用函数时不会在内存中新开辟一块空间然后用参数默认值重新赋值,而是单纯地引用这个参数原来的地址.这就带来了一个 ...

  7. 【Python】-NO.97.Note.2.Python -【Python 基本数据类型】

    1.0.0 Summary Tittle:[Python]-NO.97.Note.2.Python -[Python 基本数据类型] Style:Python Series:Python Since: ...

  8. 【Python】-NO.99.Note.4.Python -【Python3 条件语句 循环语句】

    1.0.0 Summary Tittle:[Python]-NO.99.Note.4.Python -[Python3 条件语句 循环语句] Style:Python Series:Python Si ...

  9. 【Python】-NO.98.Note.3.Python -【Python3 解释器、运算符】

    1.0.0 Summary Tittle:[Python]-NO.98.Note.3.Python -[Python3 解释器] Style:Python Series:Python Since:20 ...

随机推荐

  1. 油猴 tamperMonkey 在百度首页 添加自己的自定义链接

    发现 GM_addStyle 函数不能用了,从写加载css函数. 剩下找个定位 添加内容 就很简单了. // ==UserScript== // @name helloWorld // @namesp ...

  2. Microsoft Windows Server 部署

    Microsoft Windows Server 部署 多重引导 计算机可以被设置多重引导,即在一台计算机上安装多个操作系统..在安装多重引导的操作系统时,还要注意版本的类型,一般应先安装版本低的,再 ...

  3. 关于Java多线程(JAVA多线程实现的四种方式)

    Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorService.Cal ...

  4. Python List extend()方法

    Python List extend()方法  Python 列表 描述 extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表). 语法 extend()方法语法 ...

  5. 出现了错误。详细消息: 3 uncommitted changes would be overwritten by merge

    merge manual中有一条警告: 出现了错误.详细消息: 3 uncommitted changes would be overwritten by merge 有未提交修改情况下,不要执行me ...

  6. TWaver可视化编辑器的前世今生(二)3D编辑器

    接着昨天的继续说哈. 作为一款高效.轻量.自带编辑功能小组件,TWaver Java在电信网管界一炮而红,在各大运营商的OSS,BSS,NMS系统中随处可见. 采用了TWaver图形组件的上海世博会监 ...

  7. Swift中Singleton的实现

    一.意图 保证一个类公有一个实例,并提供一个访问它的全局访问点. 二.使用场景 1.使用场景 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时 当这个唯一实例应该是通过子类化可扩展的,并且 ...

  8. get、post、put、delete

    form表单有两种提交方式,get和post,get没有请求体, 但是有查询字符串参数拼接在url后面,post有请求体,表单内容对用户不可见. 1.form表单以get请求提交, 2.from表单以 ...

  9. bzoj4951 [Wf2017]Money for Nothing

    题目描述 题解: 答案显然是$max((q-p)*(e-d))$ 依然先贪心. 对于工厂,我们倾向于$pi<pj,di<dj$的; 对于买家,我们倾向于$qi>qj,ei>ej ...

  10. angularJS transclude

    参考来源:彻底弄懂AngularJS中的transclusion 对以上文章进行摘录.总结和测试记录 在使用指令的时候,如果想要使用指令中的子元素,那么你就要用transclusion. 指令的DDO ...