Python之爬取网页时到的问题——urllib2

本文通过摘取 http://blog.csdn.net/howeblue/article/details/47426265 博客上的内容整理而成,有兴趣的可以去看看原文。

urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功能。本文主要是描述urllib2。

urllib2是Python的一个获取URL的组件,它常用的方法及类如下:

1, urllib2.urlopen ( url [, data] [, timeout] )

它打开URL网址,url参数可以是一个字符串url或者是一个Request对象。可选的参数timeout,阻塞操作以秒为单位,如尝试连接(如果没有指定,将使用设置的全局默认timeout值)。实际上这仅适用于HTTP,HTTPS和FTP连接。

url = 'http://m.sohu.com/?v=3&_once_=000025_v2tov3&_smuid\=ICvXXapq5EfTpQTVq6Tpz'
req = urllib2.Request(url)
resp = urllib2.urlopen(req)
page = resp.read()

urlopen方法也可通过建立了一个Request对象来明确指明想要获取的url。调用urlopen函数对请求的url返回一个response对象。这个response类似于一个file对象,所以用.read()函数可以操作这个response对象。

2, class urllib2.Request( url [, data] [, headers] [, originreqhost] [, unverifiable] )

Request类是一个抽象的URL请求。

URL——是一个字符串,其中包含一个有效的URL。

data——是一个字符串,指定额外的数据发送到服务器,如果没有data需要发送可以为“None”。目前使用data的HTTP请求是唯一的。当请求含有data参数时,HTTP的请求为POST,而不是GET。

headers——是字典类型,头字典可以作为参数在request时直接传入,也可以把每个键和值作为参数调用 add_header() 方法来添加。作为辨别浏览器身份的 User-Agent header 是经常被用来恶搞和伪装的,因为一些HTTP服务只允许某些请求来自常见的浏览器而不是脚本,或是针对不同的浏览器返回不同的版本。标准的headers组成是(Content-Length, Content-Type and Host)。

3, urllib2.installopener(opener)和urllib2.buildopener([handler, …])

installopener和buildopener这两个方法通常都是在一起用,也有时候buildopener单独使用来得到OpenerDirector对象。

installopener实例化会得到OpenerDirector 对象用来赋予全局变量opener。如果想用这个opener来调用urlopen,那么就必须实例化得到OpenerDirector;这样就可以简单的调用OpenerDirector.open()来代替urlopen()。

build_opener实例化也会得到OpenerDirector对象,其中参数handlers可以被BaseHandler或他的子类实例化。子类中可以通过以下实例化:ProxyHandler (如果检测代理设置用)扫描代理会用到,很重要, UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler,HTTPRedirectHandler,FTPHandler,FileHandler,HTTPErrorProcessor。

import urllib2
req = urllib2.Request('http://www.python.org/')
opener=urllib2.build_opener()
urllib2.install_opener(opener)
f = opener.open(req)
如上使用 urllib2.install_opener()设置 urllib2 的全局 opener。这样后面的使用会很方便,但不能做更细粒度的控制,比如想在程序中使用两个不同的 Proxy 设置等。比较好的做法是不使用 install_opener 去更改全局的设置,而只是直接调用 opener的open 方法代替全局的 urlopen 方法。
先写到这,前两个方法还能看懂点,最后一个有点蒙,等以后再研究研究。