urllib2和urllib3是并存关系还是that代替关系副词

使用Python的urllib和urllib2模块制作爬虫的实例教程
作者:XiaoluD
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了使用Python的urllib和urllib2模块制作爬虫的实例教程,展现了这两个常用爬虫制作模块的基本用法,极度推荐!需要的朋友可以参考下
学习python完基础,有些迷茫.眼睛一闭,一种空白的窒息源源不断而来.还是缺少练习,遂拿爬虫来练练手.学习完斯巴达python爬虫课程后,将心得整理如下,供后续翻看.整篇笔记主要分以下几个部分:
1.做一个简单的爬虫程序
2.小试牛刀--抓取百度贴吧图片
1.做一个简单的爬虫程序
首先环境描述
Device: Mba 2012 Yosemite 10.10.1
Python: python 2.7.9
编辑器: Sublime Text 3
这个没有什么好说的,直接上代码吧!
@ urllib为python自带的一个网络库
@ urlopen为urllib的一个方法,用于打开一个连接并抓取网页,
然后通过read()方法把值赋给read()
import urllib
url = ""#多嘴两句,为什么要选lifevc呢,主要是最近它很惹我.
html = urllib.urlopen(url)
content = html.read()
html.close()
#可以通过print打印出网页内容
print content
很简单,基本上没有可说的,这个也就是python的魅力,几行代码就完成.
当然我们仅仅抓取网页,没有实在的价值.接下来我们就开始做一点有意义的事情.
2.小试牛刀
抓取百度贴吧图片
其实也很简单,因为要抓取图片,还需要先分析一下网页源代码
(这里以知道基本html知识,浏览器以chrome为例)
如图,这里简要说下步骤,请参考.
打开网页,右键点击,选择"inspect Element"(最下面这一项)
点击下面弹起来的框框最左边那个问号,问号会变成蓝色
移动鼠标去点击我们想要抓取的图片(一个萌妹子)
如图,我们就可以图片在源码中的位置了
下面将源码相关拷贝出来
&img class="BDE_Image" src="/forum/w%3D580/
sign=3d5aacaab21cb2ee177e9e6e/17a6d439baece2e342ac65c.
jpg" height="840" width="560" style="cursor: url(/tb/
static-pb/img/cur_zin.cur),"&
经分析和对比(这里略掉),基本上可以看到要抓取的图片几个特征:
在img标签下
在名为BDE_Image的类下面
图片格式为jpg
正则表达式后续我会更新,请关注
依照上述判断,直接上代码
@本程序用来下载百度贴吧图片
@re 为正则说明库
import urllib
# 获取网页html信息
url = "/p/"
html = urllib.urlopen(url)
content = html.read()
html.close()
# 通过正则匹配图片特征,并获取图片链接
img_tag = re.compile(r'class="BDE_Image" src="(.+?\.jpg)"')
img_links = re.findall(img_tag, content)
# 下载图片 img_counter为图片计数器(文件名)
img_counter = 0
for img_link in img_links:
img_name = '%s.jpg' % img_counter
urllib.urlretrieve(img_link, "//Users//Sean//Downloads//tieba//%s" %img_name)
img_counter += 1
如图,我们就抓取你懂的图片
如上两节,我们就很轻松的就可以网页或者图片.
补充一点小技巧,如果遇到不是很明白的库或者方法,可以通过以下方法进行初步了解.
dir(urllib)&&&&&&&&&&&&&&&&&&&& #查看当前库有哪些方法
help(urllib.urlretrieve)&&&&&&& #查看跟当前方法相关的作用或者参数,官方比较权威
或者https://docs.python.org/2/library/index.html进项相关搜索.
当然百度也可以,但是效率太低.建议使用 http://xie.lu 进行相关搜索(你懂了,绝对满意).
这里我们讲解如何抓取网页和下载图片,在下面我们会讲解如何抓取有限制抓取的网站.
上面我们讲解如何抓取网页和下载图片,在下一节里面我们会讲解如何抓取有限制抓取的网站
首先,我们依然用我们上一节课的方法去抓取一个大家都用来举例的网站&dn.net&,本文主要分以下几个部分:
1.抓取受限网页
2.对代码进行一些优化
1.抓取受限网页
首先使用我们上一节学到的知识测试一下:
@本程序用来抓取blog.csdn.net网页
import urllib
url = "http://blog.csdn.net/FansUnion"
html = urllib.urlopen(url)
#getcode()方法为返回Http状态码
print html.getcode()
html.close()
此处我们的输出为403,代表拒绝访问;同理200表示请求成功完成;404表示网址未找到.
可见csdn已做了相关屏蔽,通过第一节的方法是无法获取网页,在这里我们需要启动一个新的库:urllib2
但是我们也看到浏览器可以发那个文,是不是我们模拟浏览器操作,就可以获取网页信息.
老办法,我们先来看看浏览器是如何提交请求给csdn服务器的.首先简述一下方法:
打开网页,右键点击,选择"inspect Element"(最下面这一项)
点击下面弹起来的框框的Network选项卡
刷新网页,就可以看到Network选项卡抓取了很多信息
找到其中一个信息展开,就能看到请求包的Header
以下就是整理后的Header信息
Request Method:GET
Host:blog.csdn.net
Referer:http://blog.csdn.net/?ref=toolbar_logo
User-Agent:Mozilla/5.0 (M Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0. Safari/537.36
然后根据提取的Header信息,利用urllib2的Request方法模拟浏览器向服务器提交请求,代码如下:
# coding=utf-8
@本程序用来抓取受限网页(blog.csdn.net)
@User-Agent:客户端浏览器版本
@Host:服务器地址
@Referer:跳转地址
@GET:请求方法为GET
import urllib2
url = "http://blog.csdn.net/FansUnion"
#定制自定义Header,模拟浏览器向服务器提交请求
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36')
req.add_header('Host', 'blog.csdn.net')
req.add_header('Referer', 'http://blog.csdn.net')
req.add_header('GET', url)
#下载网页html并打印
html = urllib2.urlopen(req)
content = html.read()
print content
html.close()
呵呵,你限制我,我就跳过你的限制.据说只要浏览器能够访问的,就能够通过爬虫抓取.
2.对代码进行一些优化
简化提交Header方法
发现每次写那么多req.add_header对自己来说是一种折磨,有没有什么方法可以只要复制过来就使用.答案是肯定的.
help(urllib2.Request)
#output(因篇幅关系,只取__init__方法)
__init__(self, url, data=None, headers={}, origin_req_host=None, unverifiable=False)
通过观察,我们发现headers={},就是说可以以字典的方式提交header信息.那就动手试试咯!!
#只取自定义Header部分代码
csdn_headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
"Host": "blog.csdn.net",
'Referer': 'http://blog.csdn.net',
"GET": url
req = urllib2.Request(url,headers=csdn_headers)
发现是不是很简单,在这里感谢斯巴达的无私赐教.
提供动态头部信息
如果按照上述方法进行抓取,很多时候会因为提交信息过于单一,被服务器认为是机器爬虫进行拒绝.
那我们是不是有一些更为智能的方法提交一些动态的数据,答案肯定也是肯定的.而且很简单,直接上代码!
@本程序是用来动态提交Header信息
@random 动态库,详情请参考&https://docs.python.org/2/library/random.html&
# coding=utf-8
import urllib2
import random
my_headers = [
'Mozilla/4.0 ( MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.)',
'Mozilla/4.0 ( MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; InfoPath.1',
'Mozilla/4.0 ( GoogleToolbar 5.0.; Windows 6.0; MSIE 8.0.)',
'Mozilla/5.0 ( MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',
'Mozilla/5.0 ( MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; Sleipnir/2.9.8)',
#因篇幅关系,此处省略N条
random_header = random.choice(headers)
# 可以通过print random_header查看提交的header信息
req = urllib2.Request(url)
req.add_header("User-Agent", random_header)
req.add_header('Host', 'blog.csdn.net')
req.add_header('Referer', 'http://blog.csdn.net')
req.add_header('GET', url)
content = urllib2.urlopen(req).read()
print content
其实很简单,这样我们就完成了对代码的一些优化.
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具用户名:dexinliu
文章数:26
访问量:37296
注册日期:
阅读量:1297
阅读量:3317
阅读量:455519
阅读量:1140123
51CTO推荐博文
通过python 的 urllib2 模块,可以轻易的去模拟用户访问网页的行为。这里将自己的学习过程简单的记录下来。一、urlopen函数&&& urlopen(url, data=None) -- Basic usage is the same as original&&& urllib.& pass the url and optionally data to post to an HTTP URL, and&&& get a file-like object back.& One difference is that you can also pass&&& a Request instance instead of URL.& Raises a URLError (subclass of&&& IOError); for HTTP errors, raises an HTTPError, which can also be&&& treated as a valid response.它的基本用法同urllib 库中的用法是一样的。urllib 中的urlopen 的注释如下:&&& urlopen(url, data=None, proxies=None)&&&&&&& Create a file-like object for the specified URL to read from.但不同于urllib 的是,urllib2 中的urlopen函数的第一个参数url 可以是一个Request 实例。1、基本用法Example:#等同urllib&中的urlopen&函数的用法
In&[12]:&response&=&urllib2.urlopen('')
In&[13]:&response.read()
#&urllib2&中的使用request&实例的用法
In&[14]:&request&=&urllib2.Request('')
In&[15]:&response&=&urllib2.urlopen(request)
In&[16]:&response.read()我在这里还是非常喜欢第二种使用方式。毕竟一个http 的请求首先要有request,然后才能存在response。这样在编程的思路上就比较明了了。代码阅读起来也很清晰。2、模拟POST请求以上所模拟的请求,全部都是GET方式的请求,那如果需要模拟POST方式的请求呢? 查看Request的帮助help(urllib2.Request) 中发现,它的__init__ 构造函数是这样声明的__init__(self, url, data=None, headers={}, origin_req_host=None, unverifiable=False)从声明上来看POST 的数据可以放到data 中,且我们还可以通过headers 设置http的请求头参数Example:import&urllib
import&urllib2
values&=&{}
values['username']&=&"God"
values['password']&=&"XXXX"
data&=&urllib.urlencode(values)&&#&使用了urllib库中的urlencode方法
url&=&"http://xxxx.xxxxx/login"
request&=&urllib2.Request(url,data)
response&=&urllib2.urlopen(request)
print&response.read()大家可以针对具体的场景去更换自己的url、username 和 password3、设置HTTP请求头再通过headers参数去尝试一下修改http 请求头的一些信息。在上一个例子中进行稍微的修改import&urllib
import&urllib2
values&=&{}
values['username']&=&"God"
values['password']&=&"XXXX"
data&=&urllib.urlencode(values)&
url&=&"http://xxxx.xxxxx/login"
headers&=&{'User-Agent':'ozilla/5.0&(X11;&U&Linux&x86_64;&rv:37.0)&Gecko/&Firefox/37.0','Content-Type':'text/&charset=utf-8','Referer':'/'}
request&=&urllib2.Request(url,data,headers)
response&=&urllib2.urlopen(request)
print&response.read()可以通过浏览器提供的F12功能去找到更多的头信息。4、设置请求超时好多时候各种原因,有可能导致你的请求各种等待。考验耐心的时候到了,不过这时可用通过设置urlopen 中的超时去干掉那些我们无法容忍的长时间没法响应的请求。urlopen(url, data=None, timeout=&object object&)使用timeout 的时候要注意的一点是,如果你没有data数据,那么这时你一定要显示的传递参数。Example:import&urllib2
urllib2.urlopen('',data,10)
urllib2.urlopen('',timeout=10)二、opener(OpenerDirector)&&& The OpenerDirector manages a collection of Handler objects that do&&& all the actual work.& Each Handler implements a particular protocol or&&& option.& The OpenerDirector is a composite object that invokes the&&& Handlers needed to open the requested URL.& For example, the&&& HTTPHandler performs HTTP GET and POST requests and deals with&&& non-error returns.& The HTTPRedirectHandler automatically deals with&&& HTTP 301, 302, 303 and 307 redirect errors, and the HTTPDigestAuthHandler&&& deals with digest authentication干嘛用的? 管理了一系列的handler 对象。我这这么理解的,其实我们在使用urlopen 的时候就已经存在了一个默认的handler 。只是对我们时透明的。我们可以使用这个handler做GET/POST 请求,但是如果我们想做一些其他的事情呢? 如我们想设置代理去做一些事情等所有非GET/POST能处理好的。那么我们就需要更换handler了 。这时就要使用opener ,这就时opener 所能干的。1、设置代理import&urllib2
proxy_handler&=&urllib2.ProxyHandler({"http"&:&'http://11.11.11.11:8080'})
opener&=&urllib2.build_opener(proxy_handler)
urllib2.install_opener(opener)
response&=&urllib2.urlopen('http://xxx.xxx.xxxx')
response.read()2、打开http 和 https 的 Debug log 功能import&urllib2
httpHandler&=&urllib2.HTTPHandler(debuglevel=1)
httpsHandler&=&urllib2.HTTPSHandler(debuglevel=1)
opener&=&urllib2.build_opener(httpHandler,&httpsHandler)
urllib2.install_opener(opener)
response&=&urllib2.urlopen('')3、结合cookielib 处理 cookie 信息首先要简单的了解一下cookielib 这个模块,功能还是很强大的。最好仔细研究一下这里我们只研究 opener 相关,暂时略过cookielib 模块import&urllib2
import&cookielib
cookie&=&cookielib.CookieJar()
cookieHandler=urllib2.HTTPCookieProcessor(cookie)
opener&=&urllib2.build_opener(cookieHandler)
urllib2.install_opener(opener)
response&=&urllib2.urlopen('')
for&item&in&cookie:
&&&&print&'CookieName&=&'+item.name
&&&&print&'CookieValue&=&'+item.value三、异常处理URLError 和 HTTPErrorHTTPError 是 URLError 的一个子类&&&&&&& URLError&&&&&&&&&&& HTTPError(URLError, urllib.addinfourl)import&urllib2
req&=&urllib2.Request('/mmmaa')
&&&&urllib2.urlopen(req)
except&urllib2.HTTPError,&e:
&&&&if&hasattr(e,"code"):
&&&&&&&&print&e.code
except&urllib2.URLError,&e:
&&&&if&hasattr(e,"reason"):
&&&&&&&&print&e.reason
&&&&print&"OK"本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)用户名:ssp4599815
文章数:23
访问量:67596
注册日期:
阅读量:1297
阅读量:3317
阅读量:455519
阅读量:1140123
51CTO推荐博文
& 下面继续学习python的web模块 --- &urllib2,一个源于urllib又高于urllib的模块。1 &urllib2 简介&&&&urllib2是python自带的一个访问网页及本地文件的库。&&&&与urllib相比,显著区别之处在于:&&&&1)&urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,用urllib时不可以伪装User Agent字符串等。&&&&2) urllib提供urlencode方法用来encode发送的data,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。2 &urllib2 常用方法 &2.1 &urllib2.urlopen&&&&urlopen()是最简单的请求方式,它打开url并返回类文件对象,并且使用该对象可以读取返回的内容&&&&urllib2.urlopen(url[,&data][,&timeout])&
&&&&url:&可以是包含url的字符串,也可以是urllib2.request类的实例。
&&&&data:&是经过编码的post数据(一般使用urllib.urlencode()来编码)。
&&&&没有data参数时为GET请求,设置data参数时为POST请求
&&&&timeout:&是可选的超时期(以秒为单位),设置请求阻塞的超时时间,如果没有设置的话,会使用全局默认timeout参数,该参数只对HTTP、HTTPS、FTP生效假设urlopen()返回的文件对象u,它支持下面的这些常用的方法:u.read([nbytes])&以字节字符串形式读取nbytes个数据u.readline()&以字节字符串形式读取单行文本u.readlines()&读取所有输入行然后返回一个列表u.close()&关闭链接u.getcode()&返回整数形式的HTTP响应代码,比如成功返回200,未找到文件时返回404u.geturl()&返回所返回的数据的实际url,但是会考虑发生的重定向问题u.info()&返回映射对象,该对象带有与url关联的信息,对HTTP来说,返回的服务器响应包含HTTP包头。对于FTP来说,返回的报头包含'content-length'。对于本地文件,返回的报头包含‘content-length’和'content-type'字段。注意:&&&&类文件对象u以二进制模式操作。如果需要以文本形式处理响应数据,则需要使用codecs模块或类似方式解码数据。附代码:&&&&import&urllib2
&&&&res=urllib2.urlopen('')
&&&res.read()
。。。。。。(一堆源代码)
&&&res.readline()
'&!DOCTYPE&html&PUBLIC&"-//W3C//DTDXHTML&1.0&Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&\r\n'
&&&res.readlines()
。。。(list形式的一堆源码)
&httplib.HTTPMessage&instance&at0x1a02638&
&&&res.getcode()
&&&res.geturl()
#最后关闭连接
&&&&res.close()& 2.2 &urllib2.request&&&&&新建Request实例&&&&Request&(url&[data,headers[,origin_req_host&,[unverifiable]]]])
&&&&对于比较简单的请求,urlopen()的参数url就是一个代表url的,但如果需要执行更复杂的操作,如修改HTTP报头,可以创建Request实例并将其作为url参数
&&&&url:&为url字符串,
&&&&data:&是伴随url提交的数据(比如要post的数据)。不过要注意,提供data参数时,它会将HTTP请求从'GET'改为‘POST’。
&&&&headers:&是一个字典,包含了可表示HTTP报头的键值映射(即要提交的header中包含的内容)。
&&&&origin_req_host:&通常是发出请求的主机的名称,如果请求的是无法验证的url(通常是指不是用户直接输入的url,比如加载图像的页面中镶入的url),则后一个参数unverifiable设为TRUE&&&&假设Request实例r,其比较重要的方法有下面几个:r.add_data(data)&向请求添加数据。如果请求是HTTP请求,则方法改为‘POST’。data是向指定url提交的数据,要注意该方法不会将data追教导之前已经设置的任何数据上,而是使用现在的data替换之前的。r.add_header(key, val)&向请求添加header信息,key是报头名,val是报头值,两个参数都是字符串。r.addunredirectedheader(key,val)&作用基本同上,但不会添加到重定向请求中。r.set_proxy(host, type)&准备请求到服务器。使用host替换原来的主机,使用type替换原来的请求类型。附代码:& & 1& 向网页提交数据:&&&&import&urllib
&&&&import&urllib2
&&&&url=''
&&&&info={'name':"51cto",'location':'51cto'}
#info需要被编码为urllib2能理解的格式,这里用到的是urllib
&&&&data=urllib.urlencode(info)
'name=51cto&location=51cto'
&&&&request=urllib2.Request(url,data)
&&&&response=urllib2.urlopen(request)
&&&&the_page=response.read()&& &2 &修改网页头信息:&&&&有时会碰到,程序也对,但是服务器拒绝你的访问。这是为什么呢?问题出在请求中的头信息(header)。&有的服务端有洁癖,不喜欢程序来触摸它。这个时候你需要将你的程序伪装成浏览器来发出请求。请求的方式就包含在header中。&&&&在使用&REST&接口时,Server&会检查Content-Type字段,用来确定&HTTP Body&中的内容该怎样解析。&&&&import&urllib
&&&&import&urllib2
&&&&url=''
#&将user_agent写入头信息
&&&&user_agent='Mozilla/4.0&(&MSIE&5.5;&WindowsNT)'
&&&values={'name':'51cto','location':"51cto",'language':'Python'}&
&&&&headers={'User-Agent':user_agent}
&&&&data=urllib.urlencode(values)
&&&&req=urllib2.Request(url,data,headers)
&&&&response=urllib2.urlopen(req)
&&&&the_page=response.read()& 2.3 &异常处理&&&&不能处理一个respons时,urlopen抛出一个urlerrorurllib2.URLError:&&
urllib2.HTTPError:&&&&HTTPerror是HTTP URL在特别的情况下被抛出的URLError的一个子类。&&&&urlerror:&&&&通常,urlerror被抛出是因为没有&连接(没有至特定服务器的连接)或者特定的服务器不存在。在这种情况下,含有reason属性的异常将被抛出,以一种包含错误&和文本错误信息的tuple形式。#!/usr/bin/env&python
#&-*-&coding:&utf-8&-*-
import&urllib2
#多写了一个&m&(comm)
req&=&urllib2.Request('m')
&&&&urllib2.urlopen(req)
except&urllib2.URLError,e:
&&&&print&e
&&&&print&e.reason结果:&urlopen&error&[Errno&11004]&getaddrinfo&failed&
[Errno&11004]&getaddrinfo&failed&&&&以上是 urllib2的简单用法,如果要深入:& & urllib和urllib2之间的区别: 本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)python urllib2
- ITeye博客
当处理HTTP链接的时候,链接如果有中文的话,那么发起HTTP链接的时候,一定要先把URL编码,否则就会出现问题。而在python中,用 urllib2.quote(URL)进入编码和urllib2.unquote(URL)解码的时候,有一点需要注意,就是URL字符串不能是 unicode编码,此时必须把URL编码转换成适当的编码,如utf-8或gb2312等而python处理编码转换的机制如下:原来编码》内部编码》目的编码 python的内部编码是使用unicode来处理的 gb=”中国”#此处为原本gb2312编码 uni=unicode(gb,’gb2312′)#把gb2312编码转换成unicode的内部编码 utf=uni.encode(’utf-8′)#把unicode编码转换成utf-8目的编码在处理wxpython文本框的时候要注意,默认的编码是unicode编码,利用urllib.quote编码时候,可以通过如下方面转换后,再进行 URL编码 URL=wxpython文本框原本的unicode编码 URL=URL.encode(’utf-8′)#把unicode编码转换成utf-8编码 URL=urllib2.quote(URL)#进入URL编码,以便HTTP链接
对我来说,Python里面哪个模块用的最多,恐怕urllib2这个不是第一也得算前三了。先看下下面最常用的代码
Python语言:
import urllib2
req = urllib2.Request("")
res = urllib2.urlopen( req )
html = res.read()
res.close()
这里可以通过urllib2进行抓取页面 。也可以直接使用urllib2.urlopen( ),通过Reques对象打开的好处是,我们可以很方便的为Reques 添加HTTP 请求的头部信息。
Python语言:
import urllib2
req = urllib2.Request("")
req.add_header( "Cookie" , "aaa=bbbb" ) # 这里通过add_header方法很容易添加的请求头
req.add_header( "Referer", "/code/new/" )
res = urllib2.urlopen( req )
html = res.read()
res.close()
headers 初始化为{} ,所有如果连续执行两次req.add_header( "Cookie" , "aaa=bbbb" ) , 则后面的值会把前面的覆盖掉
class Request:
&&& def __init__(self, url, data=None, headers={},
&&&&&&&&&&&&&&&& origin_req_host=None, unverifiable=False):
当执行 res = urllib2.urlopen( req ) 时
_opener = None
def urlopen(url, data=None):
&&& global _opener
&&& if _opener is None:
&&&&&&& _opener = build_opener()
&&& return _opener.open(url, data)
_opener = build_opener() 这里_opener 是一个全局变量。第一次使用时,通过build_opener() 得到一个值,以后再次使用就是保存到这个全局变量中值。
def build_opener(*handlers):
&&& """Create an opener object from a list of handlers.
&&& The opener will use several default handlers, including support
&&& for HTTP and FTP.
&&& If any of the handlers passed as arguments are subclasses of the
&&& default handlers, the default handlers will not be used.
&&& """
&&& import types
&&& def isclass(obj):
&&&&&&& return isinstance(obj, types.ClassType) or hasattr(obj, "__bases__")
&&& opener = OpenerDirector()
&&& default_classes = [ProxyHandler, UnknownHandler, HTTPHandler,
&&&&&&&&&&&&&&&&&&&&&& HTTPDefaultErrorHandler, HTTPRedirectHandler,
&&&&&&&&&&&&&&&&&&&&&& FTPHandler, FileHandler, HTTPErrorProcessor]
&&& if hasattr(httplib, 'HTTPS'):
&&&&&&& default_classes.append(HTTPSHandler)
&&& skip = []
&&& for klass in default_classes:
&&&&&&& for check in handlers:
&&&&&&&&&&& if isclass(check):
&&&&&&&&&&&&&&& if issubclass(check, klass):
&&&&&&&&&&&&&&&&&&& skip.append(klass)
&&&&&&&&&&& elif isinstance(check, klass):
&&&&&&&&&&&&&&& skip.append(klass)
&&& for klass in skip:
&&&&&&& default_classes.remove(klass)
&&& for klass in default_classes:
&&&&&&& opener.add_handler(klass())
&&& for h in handlers:
&&&&&&& if isclass(h):
&&&&&&&&&&& h = h()
&&&&&&& opener.add_handler(h)
&&& return opener
这里就可以看到 默认的处理程序有 ProxyHandler, 代理服务器处理 UnknownHandler, HTTPHandler, http协议的处理 HTTPDefaultErrorHandler, HTTPRedirectHandler, http的重定向处理 FTPHandler, FTP处理 FileHandler, 文件处理 HTTPErrorProcessor
我们也可以添加自己处理程序
cookie = cookielib.CookieJar()
urllib2.HTTPCookieProcessor(cookie) 这个就是对cookie的处理程序
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
添加后就可以对每次收到响应中的Set-Cookie 记录到cookie 对象中,下次发送请求的时候就可以把这些Cookies附加到请求中
urllib2.install_opener(opener) 用我们生成的opener& 替换掉urllib2中的全局变量
比如第一次请求:
connect: (, 80)
send: 'GET /webhp?source=g_cn HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: \r\nConnection: close\r\nUser-Agent: Python-urllib/2.5\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Cache-Control: private, max-age=0
header: Date: Sun, 21 Dec :39 GMT
header: Expires: -1
header: Content-Type: text/ charset=GB2312
header: Set-Cookie: PREF=ID=5d750b6ffc3d7d04:NW=1:TM=:LM=:S=XKoaKmsjYO_-CsHE; expires=Tue, 21-Dec-:39 GMT; path=/; domain=.
header: Server: gws
header: Transfer-Encoding: chunked
header: Connection: Close
第二次请求中就会附加
Cookie: PREF=ID=5d750b6ffc3d7d04:NW=1:TM=:LM=:S=XKoaKmsjYO_-CsHE等Cookie
connect: (, 80)
send: 'GET /webhp?source=g_cn HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: \r\nCookie: PREF=ID=5d750b6ffc3d7d04:NW=1:TM=:LM=:S=XKoaKmsjYO_-CsHE\r\nConnection: close\r\nUser-Agent: Python-urllib/2.5\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Cache-Control: private, max-age=0
header: Date: Sun, 21 Dec :41 GMT
header: Expires: -1
header: Content-Type: text/ charset=GB2312
header: Server: gws
header: Transfer-Encoding: chunked
header: Connection: Close
如果想要在urllib中启用调试,可以用
&&& import httplib
&&& httplib.HTTPConnection.debuglevel = 1&&&&&&&&&&&
&&& import urllib
但是在urllib2中无效,urllib2中没有发现很好的启用方法因为,
class AbstractHTTPHandler(BaseHandler):
&&& def __init__(self, debuglevel=0):
&&&&&&& self._debuglevel = debuglevel
会默认把调试级别改成0
我是这样用实现的,
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
urllib2.install_opener(opener)
opener.handle_open["http"][0].set_http_debuglevel(1)
不知道其他有没有更好的方面
浏览 31983
浏览: 65403 次
来自: 北京
2. 生成签署申请 openssl req -new -key ...}

我要回帖

更多关于 urllib2 python3 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信