博客
关于我
python urllib2详解及实例
阅读量:800 次
发布时间: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 | xlsxwriter,一个实用的 Python 库!
查看>>
python | xlwings,一个非常实用的 Excel 相关的 Python 库!
查看>>
python | xmltodict,一个非常厉害的 关于XML数据 Python 库!
查看>>
python | xonsh,一个超酷的 Python 库!
查看>>
python | yagmail,一个实用的 Python 库!
查看>>
python | 一文掌握Python的上下文管理器和with语句
查看>>
python | 一文看懂Python闭包机制与变量作用域规则
查看>>
python读取含中文的json
查看>>
python | 如何用Python锁避免并发错误?
查看>>
python | 提升代码迭代速度的Python重载方法
查看>>
python | 深入理解Python并发编程中的GIL限制与解决方案
查看>>
Python | 爬虫实战——亚马逊搜索页监控(附详细源码)
查看>>
python | 高效使用Python工具自动生成模块文档的秘诀
查看>>
python 一个list去除另一个list中的值
查看>>
python 三大框架的 介绍。
查看>>
Python 下载的 11 种姿势,一种比一种高级!
查看>>
python读取一个文件夹下所有图片_初学Python-找出文件夹下的所有图片
查看>>
Python 中 3 个不可思议的返回功能
查看>>
python 中 dict 的另一种用法
查看>>
Python 中 PIL 读取图片出现异常旋转的解决方法
查看>>