博客
关于我
python urllib2详解及实例
阅读量:799 次
发布时间:2023-03-06

本文共 3512 字,大约阅读时间需要 11 分钟。

Python urllib2 教程:深入理解 HTTP 请求

urllib2 是 Python 的一个用于获取 Uniform Resource Locators (URLs) 的组件,通过 urlopen 函数提供了一个简单的接口来获取 URLs。它支持不同的协议(如 HTTP、FTP 等),并且在处理复杂任务时提供了丰富的功能,如基本验证、Cookie、代理等。以下将详细介绍如何使用 urllib2 以实现更复杂的 HTTP 请求。


获取 URLs

简单使用

urllib2 的基本使用非常简单。以下是一个示例:

import urllib2response = urllib2.urlopen('http://python.org/')html = response.read()

除了 "http:",你还可以使用其他协议(如 "ftp:" 或 "file:")。然而,这篇文章将重点介绍 HTTP 的应用。


发送数据

POST 请求

有时你需要向服务器发送数据(通常用于与 CGI 脚本或 Web 应用程序通信)。HTTP 中,POST 请求是常用的提交数据方法。例如,以下代码将使用 POST 方法发送数据:

import urllibimport urllib2values = {}values['name'] = 'Michael Foord'values['location'] = 'pythontab'values['language'] = 'Python'data = urllib.urlencode(values)req = urllib2.Request('http://www.xxxx.com', data)response = urllib2.urlopen(req)the_page = response.read()

GET 请求

如果你不需要发送数据,urllib2 会默认使用 GET 请求。需要注意的是,尽管 HTTP 标准规定 GET 请求不会产生副作用,但这并不意味着所有 GET 请求都不会改变服务器状态。


处理 HTTP 错误

HTTPError 和 URLError

urlopen 处理请求时可能会抛出异常。以下是处理这些异常的示例:

import urllib2req = urllib2.Request('http://www.xxx.org/fish.html')try:    response = urllib2.urlopen(req)except HTTPError as e:    print('The server couldn\'t fulfill the request.')    print(f'Error code: {e.code}')    print(e.read())except URLError as e:    print('We failed to reach a server.')    print(f'Reason: {e.reason}')

错误码

HTTP 错误代码按范围分为不同的类别。默认的 urllib2 处理器会处理 3xx 重定向(例如 302 Found),而 4xx 和 5xx 错误则会抛出 HTTPError。常见的错误代码包括:

  • 400 Bad Request: 服务器未能理解请求。
  • 401 Unauthorized: 未能提供有效的认证信息。
  • 403 Forbidden: 服务器拒绝访问请求。
  • 404 Not Found: URL 不存在。
  • 500 Internal Server Error: 服务器在执行请求时遇到内部错误。

使用 OpenerDirector 和 Handler

创建自定义 Opener

urllib2 提供了 OpenerDirector 和多种 Handler,允许你创建自定义的 URL 打开器。以下是一个基本的示例,展示如何使用 HTTPBasicAuthHandler 进行基本验证:

from urllib2 import build_opener, HTTPBasicAuthHandler# 创建密码管理器password_mgr = HTTPPasswordMgrWithDefaultRealm()# 添加用户名和密码(假设 realm 为 None)top_level_url = 'http://example.com/foo/'username = 'your_username'password = 'your_password'password_mgr.add_password(None, top_level_url, username, password)# 创建 Basic Auth Handlerauth_handler = HTTPBasicAuthHandler(password_mgr)# 创建 OpenerDirectoropener = build_opener(auth_handler)# 安装 Openerurllib2.install_opener(opener)

安装 Opener

安装自定义 Opener 后,所有 urlopen 调用都将使用该 Opener。以下是如何通过 Opener 打开 URL 的示例:

# 打开带有 Basic Auth 的 URLurl = 'http://user:pass@example.com/path/'response = urllib2.urlopen(url)page = response.read()

代理与超时

代理设置

urllib2 支持通过 ProxyHandler 处理代理。以下是如何配置代理的示例:

from urllib2 import ProxyHandler, build_opener# 创建一个空的代理支持proxy_support = ProxyHandler()# 创建 Openeropener = build_opener(proxy_support)# 安装 Openerurllib2.install_opener(opener)

超时设置

Python 2.3+ 支持为 socket 设置超时。你可以通过以下方式设置全局超时:

import socketimport urllib2socket.setdefaulttimeout(10)  # 设置默认超时为 10 秒

基本验证

创建 Basic Auth Handler

为了实现基本验证,可以使用 HTTPBasicAuthHandler。以下是一个完整的示例:

from urllib2 import build_opener, HTTPBasicAuthHandler# 创建密码管理器password_mgr = HTTPPasswordMgrWithDefaultRealm()# 添加用户名和密码(假设 realm 为 None)top_level_url = 'http://example.com/foo/'username = 'your_username'password = 'your_password'password_mgr.add_password(None, top_level_url, username, password)# 创建 Basic Auth Handlerauth_handler = HTTPBasicAuthHandler(password_mgr)# 创建 OpenerDirectoropener = build_opener(auth_handler)# 安装 Openerurllib2.install_opener(opener)# 打开带有 Basic Auth 的 URLurl = 'http://user:pass@example.com/path/'response = urllib2.urlopen(url)page = response.read()

结论

urllib2 提供了强大的功能,适用于处理复杂的 HTTP 请求。你可以通过自定义 OpenerDirector 和 Handler 来实现各种功能,如基本验证、代理、超时设置等。通过合理配置和处理异常,你可以更高效地与服务器通信。如果需要更深入的功能扩展,可以参考 urllib2 的官方文档

转载地址:http://trafk.baihongyu.com/

你可能感兴趣的文章
python读取字符串指定位置字符_python要怎么截取指定位置的字符串呢?
查看>>
python | scikit-llm,一个神奇的 Python 库!
查看>>
python | sentry,一个超酷的 关于错误监控工具 Python 库!
查看>>
python | shiv,一个超酷的 打包工具 Python 库!
查看>>
python | six,一个神奇的 Python 库!
查看>>
Python读取图片的几种方法供net使用
查看>>
python | spacy,一个神奇的 Python 库!
查看>>
python | sqlmap,一个实用的 Python 库!
查看>>
python | sumy,一个超酷的 用于文本摘要的 Python 库!
查看>>
python | tiler,一个不可思议的 图像切片重组 Python 库!
查看>>
python | tinydb,一个非常厉害的 关于数据库的 Python 库!
查看>>
python | tox,一个超强的 自动化测试工具 Python 库!
查看>>
python | ttkbootstrap,一个神奇的 Python 库!
查看>>
python | unoconv,一个超厉害的 Python 库!
查看>>
python | urllib3,一个超强的 Python 库!
查看>>
python | webassets,一个超强的 Python 库!
查看>>
python | werkzeug,一个不可思议的 Python 库!
查看>>
python | xlsxwriter,一个实用的 Python 库!
查看>>
python | xlwings,一个非常实用的 Excel 相关的 Python 库!
查看>>
python | xmltodict,一个非常厉害的 关于XML数据 Python 库!
查看>>