一:url 异常
我们在此之前已经了解到url异常一共包含两个异常:
-
exception
-
-
AND
-
urllib2.
URLError :包含 reason(姑且叫做reason方法吧)【reason用来显示错误理由】
-
exception
urllib2.
HTTPError :包含 code 和 reason 【code显示HTTP状态码(RFC 2616 中定义),reason显示错误
理由】
我把RFC的连接已经放这了,你读完基本就没问题了
![偷笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/titter.gif)
code:
100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。
101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。
102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
200:请求成功 处理方式:获得响应的内容,进行处理
201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到
202:请求被接受,但处理尚未完成 处理方式:阻塞等待
204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃
300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃
301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL
302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL
304:请求的资源未更新 处理方式:丢弃
400:非法请求 处理方式:丢弃
401:未授权 处理方式:丢弃
403:禁止 处理方式:丢弃
404:没有找到 处理方式:丢弃
500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。
501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
![大笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
![大笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
HTTPError的父类,那么你干脆就先抛HTTPError再抛URLError不就得了,省事省力,不过正确的方法的确应该分析好再抛异常。
二、什么是cookie
cookie是什么?
一个cookie就是存储在用户主机浏览器中的一小段文本文件。Cookies是纯文本形式,它们不包含任何可执行代码。
一个Web页面或服务器告之浏览器来将这些信息存储并且基于一系列规则在之后的每个请求中都将该信息返回至服务器。Web服务器之后可以利用这些信息来标识用户。
通过HTTP的Set-Cookie消息头,Web服务器可以指定存储一个cookie。= = cookie储存在HTTP的set-cookie头中
Set-Cookie消息的格式如下面的字符串(中括号中的部分都是可选的)Set-Cookie:value [ ;expires=date][ ;domain=domain][ ;path=path][ ;secure]
value部分,通常是一个name=value格式的字符串。事实上有很多浏览器用自己的格式,有细微的不同。
当一个cookie存在,并且可选条件允许的话,该cookie的值会在接下来的每个请求中被发送至服务器。
Cookie限制条件(Cookie restrictions)
在cookies上存在了诸多限制条件,来阻止cookie滥用并保护浏览器和服务器免受一些负面影响。有两种cookies的限制条件:cookies的属性和cookies的总大小。
原始的规范中限定每个域名下不超过20个cookies,早期的浏览器都遵循该规范,并且在IE7中有个更近一步的提升。
在微软的一次更新中,他们在IE7中增加cookies的限制到50个,与此同时Opera限定cookies个数为30.Safari和Chrome对与每个域名下的cookies个数没有限制。
发向服务器的所有cookies的最大数量(空间)仍旧维持原始规范中所指出的:4KB。
所有超出该限制的cookies都会被截掉并且不会发送至服务器。
有效期选项(The expires option)
指定了cookie过期的时间,过期后可能会被浏览器删掉。格式为Wdy,DD-Mon--YYYY HH:MM:SS GMT,例如:
Set-Cookie:name=Nicholas;expires=Sat, 02 May 2009 23:38:25 GMT
在没有expires选项时,cookie的寿命仅限于单一的会话中。浏览器的关闭意味这一次会话的结束,所以会话cookie只存在于浏览器保持打开的状态之下。
domain选项(The domain option)
指示cookie将要发送到哪个域或那些域中。默认情况下,domain会被设置为创建该cookie的页面所在的域名。domain选项被用来扩展cookie值所要发送域的数量。例如:
Set-Cookie:name=Nicholas;domain=www.baidu.com
很多时候大网站存在二级域名,例如fanyi.baidu.com。cookies可能只发给对应的二级域名。
Path选项(The path option)
在请求相匹配的路径的时候,才会发送cookie例如:
Set-Cookie:name=Nicholas;path=/blog
在这个例子中,path选项值会与/blog,/blogrool等等相匹配;任何以/blog开头的选项都是合法的。
secure选项(The secure option)
该选项只是一个标记并且没有其它的值。只有当请求是通过SSL和HTTPS创建时,才会发送。这种cookie的内容意指具有很高的价值并且可能潜在的被破解以纯文本形式传输。例如
Set-Cookie:name=Nicholas;secure
现实中,机密且敏感的信息绝不应该在cookies中存储或传输,因为cookies的整个机制都是原本不安全的。
默认情况下,在HTTPS链接上传输的cookies都会被自动添加上secure选项。
三:cookie在爬虫中的使用
import cookielib
#声明一个CookieJar对象实例来保存cookie
cookie = cookielib.CookieJar()
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler=urllib2.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib2.build_opener(handler)
#此处的open方法同urllib2的urlopen方法,也可以传入request
response = opener.open('http://www.baidu.com')
for item in cookie:
print 'Name = '+item.name
print 'Value = '+item.value
四:cookielib 详解
CookieJar.
add_cookie_header
(
request
)
CookieJar.
extract_cookies
(
response,
request
)
CookieJar.
make_cookies
(
response,
request
)
CookieJar.
set_cookie_if_ok
(
cookie,
request
)
CookieJar.
set_cookie
(
cookie
)
CookieJar.
clear
(
[
domain
[,
path
[,
name
]
]
]
)
CookieJar.
clear_session_cookies
(
)
FileCookieJar.
save
(
filename=None,
ignore_discard=False,
ignore_expires=False
)
FileCookieJar.
load
(
filename=None,
ignore_discard=False,
ignore_expires=False
)
FileCookieJar.
revert
(
filename=None,
ignore_discard=False,
ignore_expires=False
)
FileCookieJar.
filename
-
整数或
None
。Netscape Cookie有version
0. RFC 2965和RFC 2109的Cookie的version
cookie属性为1.但是,请注意,cookielib
可能会将RFC 2109 cookies降级为Netscape Cookie,在这种情况下version
为0。 -
Cookie名称(一个字符串)。
-
Cookie值(一个字符串)或
None
。 -
字符串表示端口或一组端口(例如'80'或'80,8080'),或
None
。 -
Cookie路径(一个字符串,例如
'/acme/rocket_launchers'
)。 -
True
如果cookie只能通过安全连接返回。 -
整数到期日,以秒为单位,或
None
。另见is_expired()
方法。 -
True
如果这是一个会话cookie。 -
从服务器的字符串注释解释这个cookie的功能,或者
None
。 -
链接到来自服务器的注释的URL解释该cookie的功能,或
None
。 -
True
如果服务器(在Set-Cookie / Set-Cookie2头文件中)明确指定了端口或端口 集。 -
True
如果域由服务器明确指定。 -
True
如果cookie已经过了服务器请求的时间应该过期。如果现在给出(从时间开始的秒数),返回cookie是否在指定的时间过期。
FileCookieJar.
delayload
Cookie.
version
Cookie.
name
Cookie.
value
Cookie.
port
Cookie.
path
Cookie.
secure
Cookie.
expires
Cookie.
discard
Cookie.
comment
Cookie.
comment_url
Cookie.
port_specified
Cookie.
domain_specified
Cookie.
is_expired
(
[
now = None
]
)
FileCookieJar subclasses (子类)
第一个例子显示了最常见的用法cookielib
:
此示例说明如何使用Netscape,Mozilla或Lynx Cookie打开URL
下一个例子说明了如何使用DefaultCookiePolicy
。
下面这段代码大家可以试试效果
import urllib2 import cookielib filename='E://1002.txt'
#生成cookie cookie=cookielib.MozillaCookieJar(filename)
#生成handle handle=urllib2.HTTPCookieProcessor(cookie)
#生成opener opener=urllib2.build_opener(handle) response=opener.open('http://www.baidu.com') cookie.save(filename)