切换风格

Wizard Sky California Sunset glow Black Cloud Beige Dragon Lavender NewYear City Snow Flowers London
收藏本站XSS平台字符串转换jsfuck
对urllib模块的学习[复制链接]
发表于 2013-4-7 22:56:08 | 显示全部楼层 |!read_mode!

urllib.urlopen()函数

原型:urllib.urlopen(url[, data[, proxies]])

参数解释:url表示地址,data表示数据(postget的数据),proxies表示代理

函数作用:创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据

该函数返回一个对象,其提供如下方法和属性:

read() , readline() , readlines() ,fileno() , close() 这些方法的使用方式与文件对象完全一样;

info()返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息;

getcode()返回Http状态码。如果是http请求,200表示请求成功完成;404表示网址未找到;

geturl()返回请求的url

urllib.urlretrieve()函数:

原型:urllib.urlretrieve(url[, filename[, reporthook[, data]]])

参数解释:url表示地址,filename表示保存到本地的文件名,reporthook表示一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函 数来显示当前的下载进度,data表示post到服务器的数据

函数作用:urlretrieve方法直接将远程数据下载到本地

该对象的方法和属性:

filename表示保存到本地的路径,header表示服务器的响应头

例子;

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import urllib

 

def cbk(a, b, c):

    '''回调函数

    @a: 已经下载的数据块

    @b: 数据块的大小

    @c: 远程文件的大小

    '''

    per = 100.0 * a * b / c

    if per > 100:

        per = 100

    print '%.2f%%' % per

 

url = 'http://www.90sec.org'

local = 'C:\\90sec.html'

urllib.urlretrieve(url, local, cbk)

对于编码问题;

urllib.quote(string[, safe]):对字符串进行编码。参数safe指定了不需要编码的字符;

urllib.unquote(string) :对字符串进行解码;

urllib.quote_plus(string [ , safe ] )

urllib.quote类似,但这个方法用'+'来替换' ',而quote'%20'来代替' '

urllib.unquote_plus(string ) :对字符串进行解码;

urllib.urlencode(query[, doseq]):将dict或者包含两个元素的元组列表转换成url参数。

例如 字典{'name': 'dark-bull', 'age': 200}将被转换为"name=dark-bull&age=200"

urllib.pathname2url(path):将本地路径转换成url路径;
urllib.url2pathname(path)
:将url路径转换成本地路径;

下面的例子可以很好的解释:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import urllib

url='www+90sec -org'

urlec=urllib.quote(url)

print urlec

print urllib.unquote(urlec)

urlqu=urllib.quote_plus(url)

print urlqu

print urllib.unquote_plus(urlqu)

data={'name':'myh0st','age':20}

dataec=urllib.urlencode(data)

print dataec

path='D://a/b/c/d/1.php'

pathec=urllib.pathname2url(path)

print pathec

print urllib.url2pathname(pathec)

以上的内容是urllib的大概解释了,我们好像见过urllib2,那么urllib2是什么呢?

答案是:urllib urllib2都是接受URL请求的相关模块,但是提供了不同的功能。urllib2可以接受一个Request类的实例来设置URL请求的headersurllib仅可以接受URL。也就是说使用urllib不可以伪装你的User Agent字符串等。然而:urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。

那么urllib2又有什么样的功能和如何使用呢?

简介:urllib2支持获取不同格式的URL

urllib2.urlopen()函数

函数原型:urllib2.urlopen(url[[,data],headers])

说明,与urllib.urlopen()函数类似,不同的是其函数的参数可以是一个Request的对象,并且有一个参数不同就是,一个是headers一个是proxies

比如:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import urllib2

import urllib

url='http://www.90sec.org/index.php'

datas={'name':'myh0st','age'20'}

headers ={‘cookie’: ’111111111111111′, ‘Accept-Encoding’: ‘gzip,deflate’}

data =urllib.urlencode(datas)

#data需要编码成标准形式。然后做为data参数传到Request对象
request = urllib2.Request(url,data,headers)

retval = urllib2.urlopen(request)  # 请求将被发出去

urllib2.Request函数

原型:urllib2.Request(url[[,data],timeout])

说明:HTTP是基于请求和应答机制的--客户端提出请求,服务端提供应答。urllib2用一个Request对象来映射你提出的HTTP请求,在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,通过调用urlopen并传入Request对象,将返回一个相关请求response对象,这个应答对象如同一个文件对象,所以你可以在Response中调用.read()

使用方法:上面的例子已经写出。

下面介绍一下使用openerhandler

使用方法:

opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)

用例子来看一下他的用法

比如用urllib2设置代理:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import urllib2

proxy_support = urllib2.ProxyHandler({"http":"http://62.201.207.14:8080/"})    #第一个是http协议,第二个是代理的地址

opener = urllib2.build_opener(proxy_support)

urllib2.install_opener(opener)

result=urllib2.urlopen('http://www.90sec.org')

print result.info()

urllib2加上基本认证

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import urllib2

 

auth_handler = urllib2.HTTPBasicAuthHandler() 

auth_handler.add_password(realm='PDQ Application',       #认证信息

                          uri='http://www.tzxunda.com/manager/index.asp',  #认证地址

                          user='admin',  #用户名    

                          passwd='admin888')  #密码

opener = urllib2.build_opener(auth_handler) 

urllib2.install_opener(opener) 

print urllib2.urlopen('http://www.tzxunda.com/manager/index.asp').read()


发表于 2013-4-7 22:56:44 | 显示全部楼层
用urllib2加上sesson,这个功能是httplib所没有的!httplib对于http的操作是很强大的哦!
#!/usr/bin/env python

# -*- coding: utf-8 -*-

import urllib, urllib2, cookielib

cid = 351

cookiejar = cookielib.CookieJar()#用到了cookielib模块,有兴趣的自己去看下,总结一下然后发出来,也就省的我去总结了,如果没有的话那就等几天我去总结

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))

login_url = r'http://acm.hdu.edu.cn/userloginex.php?action=login&cid=%s¬ice=0' % cid

token = urllib.urlencode({'username': 'team183', 'userpass': '687017'})#设置token信息

opener.open(login_url, token)#将token加到opener对象中

for ck in cookiejar: print ck #打印cookie的值

rank_url = r'http://acm.hdu.edu.cn/contests/contest_ranklist.php?cid=%s&withid=0' % cid

res = opener.open(rank_url)

#print res, res.geturl(), res.info(), res.read()



基本经常使用的功能已经介绍个差不多了!可能有遗漏,希望大家可以提出来并总结出来,大家一起学习!



下面看看这个模块涉及到的异常处理吧!

URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。这种情况下,异常同样会带有"reason"属性,它是一个tuple,包含了一个错误号和一个错误信息。
#!/usr/bin/env python

# -*- coding: utf-8 -*-

import urllib

import urllib2

req = urllib2.Request('http://www.90sec.org')

try:

urllib2.urlopen(req)

except urllib2.URLError, e:

print e.reason


HTTPError在urlopen函数打开一个网页是会出现

默认的处理器会为你处理一部分这种应答(例如:假如response是一个"重定向",需要客户端从别的地址获取文档,urllib2将为你处理)。其他不能处理的,urlopen会产生一个HTTPError。典型的错误包含"404"(页面无法找到),"403"(请求禁止),和"401"(带验证请求)。
#!/usr/bin/env python

# -*- coding: utf-8 -*-

import urllib

import urllib2



req = urllib2.Request('http://www.90sec.org/fish.html')

try:

urllib2.urlopen(req)

except urllib2.URLError,e:

print e.code

#print e.read()


异常的解释就这么多了,剩下的就看大家的自由发挥了!
发表于 2013-4-8 19:07:41 | 显示全部楼层
开始的变量定义得有点随便。。。还要参考注释,,有种蛋疼菊紧的感觉
发表于 2013-6-15 19:15:09 | 显示全部楼层
有点乱啊,还是得在实际需求中学习才行。

代码区

GMT+8, 2019-11-12 09:54

Powered by Discuz! X2

© 2001-2018 Comsenz Inc.

回顶部