python 爬虫入门(5) url异常处理 ; cookie使用 ;cookielib

一:url 异常

我们在此之前已经了解到url异常一共包含两个异常:

exception  urllib2. URLError :包含 reason(姑且叫做reason方法吧)【reason用来显示错误理由】

 

           AND


exception  urllib2. HTTPError :包含 code 和 reason 【code显示HTTP状态码(RFC 2616 中定义),reason显示错误 理由】  
我把RFC的连接已经放这了,你读完基本就没问题了偷笑
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:服务出错   由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。


抛出异常是一名程序员应有的好习惯,不过你实在分不清,你就全抛,总比不抛或者乱抛好 大笑 大笑;那么我们可以知道父类异常一定要在子类异常中使用,而URLError显然是

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在爬虫中的使用


我在讲这之前特地去转了一遍open的文章,反正先请大家注意其中的第一句话,urlopen()不足以让我们去使用cookie,我们必须

使用opener,虽然urlopen是默认的opener,但是必须要使用opener,自己定义。

至于如何生成 具有cookie的opener,我在第二讲中的函数build_opener()中也已经提到一些,我这里再简单讲一下;

build_opener([handles])能返回一个opener对象,参数是handle,handle有很多类型,具体看我的第二讲,其中有一个类型是

class urllib2.HTTPCookieProcessor([cookiejar]) ,我们把这个HTTPcookieProcessor作为参数传到build_opener()之中,就可以

生成一个opener对象。至于class urllib2.HTTPCookieProcessor([cookiejar]) 如何生成一个handle的实例,他需要传入一个

cookiejar的参数,具体cookiejar的介绍我会放在后面马上会讲;例子:

import urllib2
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 详解 

总体上cookielib分有下面四个必要重要的类,然后Filecookiejar下面又有格式化的两个子类。

cookielib.CookieJar(policy=None)方法

此类存储HTTP cookie的秒。从HTTP请求中提取cookie,并在HTTP响应中返回它们,子类也负责从文件或数据库中存储和检索Cookie
CookieJar. add_cookie_header ( request )


CookieJar. extract_cookies ( responserequest )


CookieJar. make_cookies ( responserequest )


CookieJar. set_cookie_if_ok ( cookierequest )


CookieJar. set_cookie ( cookie )


CookieJar. clear ( [ domain [path [name ] ] ] )


CookieJar. clear_session_cookies ( )

FileCookieJar(filenamedelayload=Nonepolicy=None)方法

一个可以加载cookie的cookie,也可以将cookie保存到磁盘上的文件
FileCookieJar. save ( filename=Noneignore_discard=Falseignore_expires=False )


FileCookieJar. load ( filename=Noneignore_discard=Falseignore_expires=False )
FileCookieJar. revert ( filename=Noneignore_discard=Falseignore_expires=False )


FileCookieJar. filename


FileCookieJar. delayload

cookielib.Cookie

用于设置cookie的属性之类的
Cookie. version

整数或None。Netscape Cookie有version0. RFC 2965和RFC 2109的Cookie的versioncookie属性为1.但是,请注意, cookielib可能会将RFC 2109 cookies降级为Netscape Cookie,在这种情况下version为0。

Cookie. name

Cookie名称(一个字符串)。

Cookie. value

Cookie值(一个字符串)或None

Cookie. port

字符串表示端口或一组端口(例如'80'或'80,8080'),或 None

Cookie. path

Cookie路径(一个字符串,例如'/acme/rocket_launchers')。

Cookie. secure

True 如果cookie只能通过安全连接返回。

Cookie. expires

整数到期日,以秒为单位,或None。另见 is_expired()方法。

Cookie. discard

True 如果这是一个会话cookie。

Cookie. comment

从服务器的字符串注释解释这个cookie的功能,或者 None

Cookie. comment_url

链接到来自服务器的注释的URL解释该cookie的功能,或None

Cookie. port_specified

True如果服务器(在Set-Cookie / Set-Cookie2头文件中)明确指定了端口或端口 

Cookie. domain_specified

True 如果域由服务器明确指定。

Cookie. is_expired now = None 

True如果cookie已经过了服务器请求的时间应该过期。如果现在给出(从时间开始的秒数),返回cookie是否在指定的时间过期。

cookielib.CookiePolicy

该类负责决定是否应该从服务器接受/返回每个cookie

class cookielib.DefaultCookiePolicy(blocked_domains=Noneallowed_domains=Nonenetscape=Truerfc2965=Falserfc2109_as_netscape=Nonehide_cookie2=Falsestrict_domain=Falsestrict_rfc2965_unverifiable=Truestrict_ns_unverifiable=Falsestrict_ns_domain=DefaultCookiePolicy.DomainLiberalstrict_ns_set_initial_dollar=Falsestrict_ns_set_path=False)

 FileCookieJar subclasses (子类)

cookielib.MozillaCookieJar(filenamedelayload=Nonepolicy=None)

可以 以Mozilla 文件格式(Lynx和Netscape浏览器也使用)格式加载并将cookie保存到磁盘

cookielib.LWPCookieJar(filenamedelayload=Nonepolicy=None)

可以以与libwww-perl库的文件格式兼容的格式加载并将cookie保存到磁盘

第一个例子显示了最常见的用法cookielib

import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

此示例说明如何使用Netscape,Mozilla或Lynx Cookie打开URL

import os, cookielib, urllib2
cj = cookielib.MozillaCookieJar()
cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

下一个例子说明了如何使用DefaultCookiePolicy

import urllib2
from cookielib import CookieJar, DefaultCookiePolicy
policy = DefaultCookiePolicy(
    rfc2965=True, strict_ns_domain=DefaultCookiePolicy.DomainStrict,
    blocked_domains=["ads.net", ".ads.net"])
cj = CookieJar(policy)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

下面这段代码大家可以试试效果
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)


PS:我们还没有到实战的阶段,请大家稍安勿躁,先把基础打牢了,不要以为跟着视频把效果做出来了就是学会了,要把这些类,函数,方法,方法的参数都记住了,这才是最终要的,前面我把 python内置方法,Re模块,urllib模块,urllib2模块,cookielib模块的基本上所有函数都讲了一遍,如果你全部看一遍还是收获。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值