使用Python访问网页主要有三种方式: urllib, urllib2, httplib
urllib比较简单,功能相对也比较弱,httplib简单强大,但好像不支持session
1. 最简单的页面访问
res=urllib2.urlopen(url)

print res.read()

2. 加上要get或post的数据
data={"name":"hank", "passwd":"hjz"}

urllib2.urlopen(url, urllib.urlencode(data))

3. 加上http头
header={"User-Agent": "Mozilla-Firefox5.0"}
urllib2.urlopen(url, urllib.urlencode(data), header)

使用opener和handler
opener = urllib2.build_opener(handler)

urllib2.install_opener(opener)

4. 加上session

cj = cookielib.CookieJar() #在内存中加载cookie

cookie = cookielib.LWPCookieJar() #在硬盘中存储cookie

cjhandler=urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cjhandler)

urllib2.install_opener(opener)

5. 加上Basic认证
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
top_level_url = "http://www.163.com/"
password_mgr.add_password(None, top_level_url, username, password)
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(handler)

urllib2.install_opener(opener)

6. 使用代理
proxy_support = urllib2.ProxyHandler({"http":"http://1.2.3.4:3128/"})
opener = urllib2.build_opener(proxy_support)

urllib2.install_opener(opener)

7. 设置超时

socket.setdefaulttimeout(5)

1 Proxy 的设置

urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy。如果想在程序中明确控制 Proxy,而不受环境变量的影响,可以使用下面的方式

1 importurllib2 
2 enable_proxy = True
3 proxy_handler = urllib2.ProxyHandler({"http"'http://some-proxy.com:8080'})
4 null_proxy_handler =urllib2.ProxyHandler({}) 
5 if enable_proxy:
6     opener =urllib2.build_opener(proxy_handler)
7 else:
8     opener = urllib2.build_opener(null_proxy_handler)  urllib2.install_opener(opener)
 

这里要注意的一个细节,使用 urllib2.install_opener() 会设置 urllib2 的全局 opener。这样后面的使用会很方便,但不能做更细粒度的控制,比如想在程序中使用两个不同的 Proxy 设置等。比较好的做法是不使用 install_opener 去更改全局的设置,而只是直接调用 opener 的 open 方法代替全局的 urlopen 方法。

2 Timeout 设置

在老版本中,urllib2 的 API 并没有暴露 Timeout 的设置,要设置 Timeout 值,只能更改 Socket 的全局 Timeout 值。

1 importurllib2
2 importsocket 
3  
4 socket.setdefaulttimeout(10# 10 秒钟后超时
5 urllib2.socket.setdefaulttimeout(10# 另一种方式

在新的 Python 2.6 版本中,超时可以通过 urllib2.urlopen() 的 timeout 参数直接设置。

1 importurllib2
2 response = urllib2.urlopen('http://www.google.com', timeout=10)
 

3 在 HTTP Request 中加入特定的 Header

要加入 Header,需要使用 Request 对象:

1 importurllib2
2   
3 request =urllib2.Request(uri)
4 request.add_header('User-Agent''fake-client')
5 response = urllib2.urlopen(request)

对有些 header 要特别留意,Server 端会针对这些 header 做检查

  • User-Agent 有些 Server 或 Proxy 会检查该值,用来判断是否是浏览器发起的 Request
  • Content-Type 在使用 REST 接口时,Server 会检查该值,用来确定 HTTP Body 中的内容该怎样解析。

    常见的取值有:

    • application/xml :在 XML RPC,如 RESTful/SOAP 调用时使用
    • application/json :在 JSON RPC 调用时使用
    • application/x-www-form-urlencoded :浏览器提交 Web 表单时使用

    • ……

    在使用 RPC 调用 Server 提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会导致 Server 拒绝服务。

4 Redirect

urllib2 默认情况下会针对 3xx HTTP 返回码自动进行 Redirect 动作,无需人工配置。要检测是否发生了 Redirect 动作,只要检查一下 Response 的 URL 和 Request 的 URL 是否一致就可以了。

1 importurllib2
2  
3 response =urllib2.urlopen('http://www.google.cn')
4 whether_redirected = response.geturl() == 'http://www.google.cn'
 

如果不想自动 Redirect,除了使用更低层次的 httplib 库之外,还可以使用自定义的 HTTPRedirectHandler 类。

01 importurllib2 
02  
03 class RedirectHandler(urllib2.HTTPRedirectHandler):
04     def http_error_301(self, req, fp, code, msg, headers):
05         pass    
06     def http_error_302(self, req, fp, code, msg, headers):
07         pass 
08  
09 opener =urllib2.build_opener(RedirectHandler)
10 opener.open('http://www.google.cn')
 

5 Cookie

urllib2 对 Cookie 的处理也是自动的。如果需要得到某个 Cookie 项的值,可以这么做:

1 importurllib2
2 importcookielib 
3  
4 cookie =cookielib.CookieJar()
5 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) response =opener.open('http://www.google.com')
6 for item in cookie:
7     if item.name == 'some_cookie_item_name':
8         print item.value

6 使用 HTTP 的 PUT 和 DELETE 方法

urllib2 只支持 HTTP 的 GET 和 POST 方法,如果要使用 HTTP PUT 和 DELETE,只能使用比较低层的 httplib 库。虽然如此,我们还是能通过下面的方式,使 urllib2 能够发出 HTTP PUT 或 DELETE 的包:

1 importurllib2 
2  
3 request =urllib2.Request(uri, data=data)
4 request.get_method = lambda'PUT'# or 'DELETE'
5 response = urllib2.urlopen(request)
 

这种做法虽然属于 Hack 的方式,但实际使用起来也没什么问题。

7 得到 HTTP 的返回码

对于 200 OK 来说,只要使用 urlopen 返回的 response 对象的 getcode() 方法就可以得到 HTTP 的返回码。但对其它返回码来说,urlopen 会抛出异常。这时候,就要检查异常对象的 code 属性了:

1 importurllib2
2 try:
3     response =urllib2.urlopen('http://restrict.web.com')
4 except urllib2.HTTPError, e:
5     print e.code
 

8 Debug Log

使用 urllib2 时,可以通过下面的方法把 Debug Log 打开,这样收发包的内容就会在屏幕上打印出来,方便我们调试,在一定程度上可以省去抓包的工作。

1 import urllib2
2    
3 httpHandler =urllib2.HTTPHandler(debuglevel=1)
4 httpsHandler =urllib2.HTTPSHandler(debuglevel=1)
5 opener =urllib2.build_opener(httpHandler, httpsHandler)  urllib2.install_opener(opener)
6 response = urllib2.urlopen('http://www.google.com')

Python中urllib2总结的更多相关文章

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

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

  2. python中urllib, urllib2,urllib3, httplib,httplib2, request的区别

    permike原文python中urllib, urllib2,urllib3, httplib,httplib2, request的区别 若只使用python3.X, 下面可以不看了, 记住有个ur ...

  3. python中的进程、线程(threading、multiprocessing、Queue、subprocess)

    Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...

  4. Python中HTTPS连接

    permike 原文 Python中HTTPS连接 今天写代码时碰到一个问题,花了几个小时的时间google, 首先需要安装openssl,更新到最新版本后,在浏览器里看是否可访问,如果是可以的,所以 ...

  5. python的urllib2库详细使用说明

    一直以来技术群里会有新入行的同学提问关于urllib和urllib2以及cookielib相关的问题.所以我打算在这里总结一下,避免大家反复回答同样的问题浪费资源. 这篇属于教程类的文字,如果你已经非 ...

  6. Python中Cookie的处理(二)cookielib库

    Python中cookielib库(python3中为http.cookiejar)为存储和管理cookie提供客户端支持. 该模块主要功能是提供可存储cookie的对象.使用此模块捕获cookie并 ...

  7. Python中http请求方法库汇总

    最近在使用python做接口测试,发现python中http请求方法有许多种,今天抽点时间把相关内容整理,分享给大家,具体内容如下所示: 一.python自带库----urllib2 python自带 ...

  8. [python]通过urllib2设置代理访问网址

    #!/usr/bin/env pythonimport urllib2 # change followings before useuser = 'foo'passwd = 'bar'proxyser ...

  9. 理解 Python 中的线程

    原地址:http://blog.jobbole.com/52060/ 本文由 伯乐在线 - acmerfight 翻译自 Akshar Raaj.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. 我 ...

随机推荐

  1. hdu 4522(图论,构图)

    湫湫系列故事——过年回家 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  2. (3)Django 配置

    一.settings django安装的应用程序 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.c ...

  3. SQLite的Pragma语句

    SQLite的Pragma语句   Pragma语句是SQLite提供的特有语句.该语句可以查询SQLite的非表数据,还可以修改SQLite的库.在iOS开发中,利用Pragma语句,可以实现很多非 ...

  4. POJ 1703 Find them, Catch them 并查集的应用

    题意:城市中有两个帮派,输入中有情报和询问.情报会告知哪两个人是对立帮派中的人.询问会问具体某两个人的关系. 思路:并查集的应用.首先,将每一个情报中的两人加入并查集,在询问时先判断一下两人是否在一个 ...

  5. vs2013 x64 编译汇编代码

    x64不再支持__asm, 只能单独放在一个.asm中. xxx.asm--------属性 应用    会出现 自定义生成工具.  下面黑体是我们修改的内容.

  6. FactoryMethod

    工厂方法模式 定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类 工厂方法的简单实现 (1)创建简单的产品接口 /** * 创建产品接口 * @autho ...

  7. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'

    原因:找不到mysql.sock文件 解决方法: 1 找到mysql.sock文件位置 echo "show variables" | mysql | grep "soc ...

  8. gitbook简单安装和使用

    1.gitbook是用来写书的,支持markdown等 2.在线写 gitbook最新版地址:https://www.gitbook.com/account/ 免费用户只能有一个public和一个pr ...

  9. CF - 420B - Online Meeting(思维)

    题意:n 个人參加线上会议.某经理记录了中间一段时间的 m 条上下线记录(1 ≤ n, m ≤ 105).+ 表示上线,- 表示下线. leader是指仅仅要有人在线,他都在线的人.求全部可能的lea ...

  10. require.js 使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...