wonderkun's|blog

share with you!

04/20
14:59
代码控

python urllib 简单的使用说明

我只能说我太懒了……
其实人有时候做不好一些东西,是没有必要为自己找太多理由的,只有一个“懒”字便可以概括全部
经常喜欢说自己太忙,没有时间,但是你可以知道?  时间无处不在,只是自己没有抓住罢了……
以前没有意识到写代码是学习计算机技术最好的方式,现在
好了,开始正题:

urllib2是python的一个非常方便的访问网页的库,下面简介一下他们的用法。

0x_1.最简单的去访问一个页面:

import urllib2
res=urllib2.urlopen("http://www.baidu.com");
print res.read()

这样就会返回百度的首页的源码

res除了read()外,还有很多别的方法和属性,res.code获取状态码,res.headers获取响应头

也可以将你请求的地址转化为一个Request对象,代码如下

import urllib2
req=urllib2.Request("http://www.baidu.com")
res=urllib2.urlopen(req)
print res.read()

上面两个代码得到的结果是一样的.其实Resquest对象不仅可以是http请求,还可以是其他的类型的请求,比如说ftp,file等

import urllib2
req=urllib2.Request("ftp://www.baidu.com")
res=urllib2.urlopen(req)
print res.read()

0x_2.自定义设置请求头

import urllib2
header={"User-Agent": "Mozilla-Firefox5.0"}  #header是一个字典
req=urllib2.Request("http://www.baidu.com",header)
res=urllib2.urlopen(req)
print res.read()

header是一个字典,可以按照自己的需要设置这个字典
0x_3.设置get和post参数
先说一下Post方式:

import urllib   #这里新引入了一个库,是用来urlencode用的
import urllib2
header={"User-Agent": "Mozilla-Firefox5.0"}
req=urllib2.Request("http://www.baidu.com")
data={"name":"wonderkun","password":"123456"}
res=urllib2.urlopen(req,data=urllib.urlencode(data));
print res.read()

Get方式的不用说了,太简单了,直接把data编码之后放到url后面就好了
0x_4.捕捉urllib2中的异常:
当urlopen()不能处理响应时会引起URLError异常。HTTPError异常是URLError的一个子类,只有在访问HTTP类型的URL时才会引起.

import urllib
import urllib2
header={"User-Agent": "Mozilla-Firefox5.0"}
req=urllib2.Request("http://www.baidu.c1om")
data={"name":"wonderkun","password":"123456"}
try:
  res=urllib2.urlopen(req,urllib.urlencode(data));
except urllib2.URLError,e:
  print e.reason
else:
  print res.headers

用try和except结构来捕捉urllib2中的异常,对代码进行优化

每一个从服务器返回的HTTP响应都有一个状态码。其中,有的状态码表示服务器不能完成相应的请求,默认的处理程序可以为我们处理一些这样的状态码(如返回的响应是重定向,urllib2会自动为我们从重定向后的页面中获取信息)。有些状态码,urllib2模块不能帮我们处理,那么urlopen函数就会引起HTTPError异常,其中典型的有404/401。
HTTPError异常的实例有整数类型的code属性,表示服务器返回的错误状态码。HTTPError实例不仅有code属性,还有read、geturl、info等方法。

import urllib
import urllib2
header={"User-Agent": "Mozilla-Firefox5.0"}
req=urllib2.Request("http://www.baidu.c1om")
data={"name":"wonderkun","password":"123456"}
try:
  res=urllib2.urlopen(req,urllib.urlencode(data));
except urllib2.HTTPError,e:
  print e.code
else:
  print res.headers

这样就可以捕捉到因服务器,而非连接引起的错误
下面介绍一种可以综合得到URLError和HTTPError的错误的代码

import urllib2
url="http://www.baidu.com" #需要访问的URL
try:
 response=urllib2.urlopen(url)
except urllib2.HTTPError,e: #HTTPError必须排在URLError的前面
 print "The server couldn't fulfill the request"
 print "Error code:",e.code
 print "Return content:",e.read()
except urllib2.URLError,e:
 print "Failed to reach the server"
 print "The reason:",e.reason
else:
 #something you should do
 pass #其他异常的处理

0x_5.设置超时
有时候我们在爬取网络数据时,会因为对方网速缓慢、服务器超时等原因, 导致 urllib2.urlopen() 之后的 read()操作(下载内容)卡死,要解决这个问题方法如下:
为urlopen()方法加上timeout参数 :

import urllib
import urllib2 
header={"User-Agent": "Mozilla-Firefox5.0"} 
req=urllib2.Request("http://www.baidu.com")
data={"name":"wonderkun","password":"123456"}
try:
 res=urllib2.urlopen(req,data=urllib.urlencode(data),timeout=3);
except urllib2.URLError,e:
 print e.reason
else:
 print res.headers

0x_6.使用代理
有时候需要清楚的知道自己写的这个程序发了什么数据,除了wireshark抓包工具外,代理也是一个特别棒的方法
下面是我设置用burp做代理的代理,和burp抓到的包

import urllib
import urllib2
proxy_support = urllib2.ProxyHandler({"http":"http://127.0.0.1:8080"})
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)

header={"User-Agent": "Mozilla-Firefox5.0"}
req=urllib2.Request("http://www.baidu.com")
data={"name":"wonderkun","password":"123456"}
try:
 res=urllib2.urlopen(req,data=urllib.urlencode(data),timeout=3);
except urllib2.URLError,e:
 print e.reason
else:
 print res.headers

我用burp抓到的包,如下
搜狗截图15年09月03日1350_1
0x_7.高级姿势;(必看,要不然这篇文章就白写了)
基本的urlopen()函数不支持验证、cookie或其他的HTTP高级功能。要支持这些功能,必须使用build_opener()函数来创建自己的自定义Opener对象

建自己的自定义Opener对象,通常用下面的这种方式:
分为三步:

1.opener=urllib2.OpenerDirector()
2.urllib2.build_opener(handler)
3.install_opener(opener)

简单的三步,你就可以使用自定义的Openner对象了 常用的handler有下面这些:

urllib2.HTTPHandler() 通过HTTP打开URL
urllib2.CacheFTPHandler() 具有持久FTP连接的FTP处理程序
urllib2.FileHandler() 打开本地文件
urllib2.FTPHandler() 通过FTP打开URL
urllib2.HTTPBasicAuthHandler() 通过HTTP验证处理
urllib2.HTTPCookieProcessor() 处理HTTP cookie
urllib2.HTTPDefaultErrorHandler() 通过引发HTTPError异常处理HTTP错误
urllib2.HTTPDigestAuthHandler() HTTP摘要验证处理
urllib2.HTTPRedirectHandler() 处理HTTP重定向
urllib2.HTTPSHandler() 通过安全HTTP重定向
urllib2.ProxyHandler() 通过代理重定向请求
urllib2.ProxyBasicAuthHandler 基本的代理验证
urllib2.ProxyDigestAuthHandler 摘要代理验证
urllib2.UnknownHandler 处理所有未知URL的处理程序

下面写一个可以自动cookie存储的代码,代码如下

import urllib
import urllib2
import cookielib
cookie=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
urllib2.install_opener(opener)

header={"User-Agent": "Mozilla-Firefox5.0"}
req=urllib2.Request("http://www.baidu.com")
data={"name":"wonderkun","password":"123456"}
try:
 res=urllib2.urlopen(req,data=urllib.urlencode(data),timeout=3);
except urllib2.URLError,e:
 print e.reason
else:
 for i in cookie:
 print i

再写一个例子,http的basic认证:

import urllib
import urllib2
import cookielib
# 创建密码管理器
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
# 添加用户名和密码.
# 如果知道realm,用它代替None.
url = "http://www.baidu.com/"
password_mgr.add_password(None, url, username, password)
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
#创建opener
opener = urllib2.build_opener(handler)
# 安装opener,以后urllib2.urlopen都会用它。
urllib2.install_opener(opener)
urllib2.urlopen("http://www.baidu.com")

ok,基本介绍完了,还有什么需要补充的,以后再来更新