Python标准库中的urllib2模块是一个强大的HTTP客户端,它可以用来与Web服务器进行通信。本文将总结urllib2模块的使用细节,包括请求和响应的处理、异常处理、代理设置、Cookie管理以及认证。
请求和响应的处理
使用urllib2模块发送HTTP请求并接收响应很简单,只需要使用urllib2.urlopen()函数即可。该函数返回一个file-like对象,可以使用read()方法来读取响应内容。
例如,要向http://example.com发送一个GET请求并打印响应内容,可以这样写:
```
import urllib2
response = urllib2.urlopen('http://example.com')
print response.read()
```
如果需要发送POST请求,可以使用urllib2.Request类和urllib2.urlopen()函数。首先创建一个Request对象,将请求方法设置为POST,并将要发送的数据作为参数传递给该对象。然后使用urllib2.urlopen()函数发送请求。
例如,要向http://example.com发送一个POST请求并打印响应内容,可以这样写:
```
import urllib
import urllib2
url = 'http://example.com'
data = urllib.urlencode({'key': 'value'})
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
print response.read()
```
异常处理
在使用urllib2模块发送HTTP请求时,可能会遇到各种异常。为了有效地处理这些异常,应该使用try/except语句来捕获它们。
例如,如果urllib2.urlopen()函数无法连接服务器或无法获取响应,将会引发urllib2.URLError异常。可以使用try/except语句来捕获这个异常,并打印出错误信息。
```
import urllib2
try:
response = urllib2.urlopen('http://example.com')
except urllib2.URLError as e:
print e.reason
```
代理设置
如果需要通过代理服务器发送HTTP请求,可以使用urllib2模块的ProxyHandler类。该类接受一个字典类型的参数,其中包含代理服务器的地址和端口号。
例如,要通过代理服务器http://proxy.example.com:8080发送HTTP请求,可以这样写:
```
import urllib2
proxy_handler = urllib2.ProxyHandler({'http': 'http://proxy.example.com:8080'})
opener = urllib2.build_opener(proxy_handler)
response = opener.open('http://example.com')
print response.read()
```
Cookie管理
在与Web服务器通信时,通常需要使用Cookie来维护会话状态。urllib2模块提供了一个CookieJar类来管理Cookie。可以使用该类来保存和发送Cookie。
例如,要发送Cookie,可以创建一个CookieJar对象,并将其添加到urllib2模块的OpenerDirector对象中。然后使用OpenerDirector对象来发送HTTP请求。
```
import cookielib
import urllib2
cookie_jar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar))
response = opener.open('http://example.com')
print response.read()
```
认证
在使用urllib2模块发送HTTP请求时,可能需要进行认证。urllib2模块提供了一个HTTPBasicAuthHandler类来进行基本认证。
例如,要向http://example.com发送一个需要认证的请求,并使用用户名和密码进行认证,可以这样写:
```
import urllib2
username = 'username'
password = 'password'
url = 'http://example.com'
password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, url, username, password)
auth_handler = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_handler)
response = opener.open(url)
print response.read()
```