Python urllib模块详解:GET与POST请求实战

凌晨两点半
凌晨两点半
发布时间:2026-10-14| 2人浏览过
原创

本文详细介绍Python内置库urllib的四个核心模块,重点演示如何使用urlopen函数发送HTTP GET和POST请求。通过具体代码示例,讲解如何构造请求数据、处理响应对象(HTTPResponse)及其属性方法,帮助开发者快速掌握服务端数据交互的基础技能。

urllib是Python 3标准库中内置的HTTP请求处理模块,无需额外安装。官方文档地址为:https://docs.python.org/3/library/urllib.html。根据官方文档说明,urllib库主要由四个子模块组成,具体结构如图所示。

这四个模块各自承担不同的功能:

  • request模块:提供基础的HTTP请求功能,用于向服务器发送请求并接收响应数据。其工作原理类似于在浏览器地址栏输入URL并按下回车键。
  • error模块:负责异常处理。当请求过程中出现错误时,可通过该模块捕获异常,并根据实际需求选择重试、忽略或执行其他补救措施。
  • parse模块:作为工具模块,提供了一系列处理URL的API,支持URL的拆分、解析和合并等操作。
  • robotparser模块:主要用于解析网站的robots.txt文件,从而判断哪些网页内容允许抓取,哪些内容被禁止抓取。

本文将重点讲解如何利用urllib库发送HTTP GET请求和HTTP POST请求,并获取服务器返回的相应数据。

1. 使用urlopen函数发送HTTP GET请求

urllib最基础的功能是向服务器发起HTTP请求并接收响应数据,这可以通过urlopen函数实现。例如,以下代码向百度发起HTTP GET请求,并输出服务器返回的响应结果。


import urllib.request 
response=urllib.request.urlopen('https://baidu.com') 
# 将服务端的响应数据用utf-8解码 
print(response.read().decode('utf-8')) 

运行效果如图所示。

从示例可以看出,使用urllib与服务器交互非常简便。除了导入语句外,核心业务代码仅2行即可完成与服务器的交互。这实际上完成了爬虫的第一步:从服务器获取HTML代码,随后可利用各类解析库对HTML进行分析,提取所需的URL、文本或图像等信息。需要注意的是,urlopen函数返回的是一个对象,read是该对象的一个方法。通过type方法可以查看该对象的类型,明确类型后即可了解该对象包含哪些API并进行调用。


import urllib.request 
response=urllib.request.urlopen('https://baidu.com') 
print(type(response)) 

该代码将输出如下结果:


<class 'http.client.HTTPResponse'> 

由此可知,urlopen函数返回的是HTTPResponse类型的对象,主要包含read、getheader、getheaders等方法,以及msg、version、status、debuglevel、closed等属性。以下案例演示了HTTPResponse对象中主要方法和属性的具体用法。


import urllib.request 
# 向京东商城发送HTTP GET请求,urlopen函数即可以使用http,也可以使用https 
response=urllib.request.urlopen('https://www.jd.com') 
# 输出urlopen函数返回值的数据类型 
print('response的类型:',type(response)) 
# 输出响应状态码、响应消息和HTTP版本 
print('status:',response.status,' msg:',response.msg,' version:', response.version) 
# 输出所有的响应头信息 
print('headers:',response.getheaders()) 
# 输出名为Content-Type的响应头信息 
print('headers.Content-Type',response.getheader('Content-Type')) 
# 输出京东商城首页所有的HTML代码(经过utf-8解码) 
print(response.read().decode('utf-8')) 

运行结果如图所示。

2. 使用urlopen函数发送HTTP POST请求

默认情况下,urlopen函数发送的是HTTP GET请求。若要发送HTTP POST请求,需使用data命名参数。该参数要求为bytes类型,因此需使用bytes类将字符串形式的数据转换为bytes类型。示例如下:

以下示例向http://httpbin.org/post发送HTTP POST请求,并输出返回结果。


import urllib.request 
# 将表单数据转换为bytes类型,用utf-8编码 
data=bytes(urllib.parse.urlencode({'name':'Bill','age':30}),encoding='utf-8') 
# 提交HTTP POST请求 
response=urllib.request.urlopen('http://httpbin.org/post',data=data) 
# 输出响应数据 
print(response.read().decode('utf-8')) 

代码首先提供字典形式的表单数据,接着使用urlencode方法将字典转换为字符串形式的表单,最后将该字符串按UTF-8编码转换为bytes类型。这就是传递给urlopen函数data参数的值。需注意,一旦指定了data参数,urlopen函数会自动向服务器提交HTTP POST请求,无需显式指定请求方法为POST。

本例将HTTP POST请求发送至http://httpbin.org/post,这是一个专门用于测试HTTP POST请求的网址。若请求成功,服务器会将收到的HTTP POST请求信息原样返回给客户端。运行结果如图所示。

以上即为Python使用urllib与服务器交互(发送和接收数据)的详细内容,更多关于Python使用urllib与服务器交互的资料请关注我们网站的其他相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。