博客
关于我
python urllib2详解及实例
阅读量:796 次
发布时间: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/

你可能感兴趣的文章
Pytest中进行测试环境切换:pytest_addoption!
查看>>
pytest利用request fixture实现个性化测试需求详解
查看>>
pytest单元测试实战
查看>>
pytest单元测试框架
查看>>
Pytest参数详解 — 基于命令行模式
查看>>
pytorch cv2 plt transforms pause waitforbuttonpress一个完整的图片处理程序
查看>>
pytest学习和使用 - Pytest用例执行结果有哪几种状态?
查看>>
pytest实战技巧之参数化应用!
查看>>
Pytest实践:Python测试技术基础知识!
查看>>
Pytest数据驱动怎么玩?实战教程来了!
查看>>
Pytest框架 之【用例执行顺序】
查看>>
Pytest框架中的测试用例执行方式!
查看>>
pytest框架快速入门-pytest运行时参数说明,pytest详解,pytest.ini详解
查看>>
Pytest框架环境切换实战教程!赶快收藏
查看>>
Pytest测试实战|Conftest.py详解
查看>>
Pytest测试框架快速搭建
查看>>
pytest测试框架:最强大的自动化测试工具,让测试变得轻松有趣
查看>>
pytest简介及jenkins集成
查看>>
Pytest自动化框架运行全局配置文件pytest.ini
查看>>
pytest自动化测试-Git中的测试用例运行
查看>>