urllib模块提供的上层接口,使我们可以像读取本地文件一样读取www和ftp上的数据。下面这篇文章主要给大家介绍了关于python如何利用urllib和urllib2访问http的GET/POST的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
### Python利用urllib和urllib2访问HTTP的GET/POST详解
#### 前言
在Python编程中,网络请求是非常常见的操作之一。通过使用Python内置的`urllib`和`urllib2`库(后者仅限于Python 2.x版本),我们可以轻松地发送HTTP GET和POST请求,并获取服务器响应的数据。这两个库提供了丰富的功能,使得开发人员能够更加方便地与Web服务进行交互。
#### urllib模块简介
`urllib`模块是Python标准库的一部分,它提供了用于构建和解析URL的工具以及发送HTTP请求的基本功能。`urllib`模块由三个子模块组成:`urllib.request`、`urllib.parse`和`urllib.error`。这些子模块分别负责不同的任务:
- `urllib.request`:用于发送请求和接收响应;
- `urllib.parse`:用于解析URL;
- `urllib.error`:定义了一些异常类型,如HTTPError和URLError。
#### urllib2模块简介
对于Python 2.x版本的用户来说,`urllib2`提供了一个更高级别的接口来处理HTTP请求。`urllib2`的主要特点包括:
- 支持多种类型的请求(GET、POST等);
- 支持HTTP认证;
- 支持重定向;
- 提供错误处理机制。
#### GET请求示例
首先来看一个简单的GET请求示例。在这个例子中,我们将向服务器发送一个包含查询字符串的GET请求,并打印出服务器返回的数据。
```python
import urllib.request
import urllib.parse
url_base = "http://127.0.0.1/cgi/test"
query = {'test': 'yes', 'name': 'colin'}
query_string = urllib.parse.urlencode(query)
url = url_base + "?" + query_string
try:
response = urllib.request.urlopen(urllib.request.Request(url))
print("GET", url)
print("web output:")
print(response.read().decode('utf-8'))
except Exception as err:
print(err)
```
在上面的例子中,我们首先定义了基础URL和要传递的查询参数。使用`urllib.parse.urlencode`将字典格式的查询参数转换为URL编码的字符串。然后,将这个字符串附加到URL的末尾。接下来,使用`urllib.request.urlopen`发送请求并读取服务器的响应。
#### POST请求示例
接着看一个POST请求的例子。与GET不同,POST请求通常用于提交数据到服务器。在这个例子中,我们将向服务器发送JSON格式的数据,并打印出服务器的响应。
```python
import urllib.request
import urllib.parse
import json
url_base = "http://127.0.0.1/cgi/test"
try:
data = {'k1': 123, 'k2': '456', 'k3': 'test'}
json_data = json.dumps(data).encode('utf-8')
request = urllib.request.Request(url_base, data=json_data, method='POST')
request.add_header('Content-Type', 'application/json')
print("POST", url_base)
print("POST input:")
print(json_data.decode('utf-8'))
response = urllib.request.urlopen(request)
print("web output:")
print(response.read().decode('utf-8'))
except Exception as err:
print(err)
```
在POST请求的例子中,我们首先创建了一个包含要发送数据的字典。然后,使用`json.dumps`将字典转换为JSON格式的字符串,并将其编码为UTF-8。创建一个`urllib.request.Request`对象时,我们指定了请求的方法为POST,并且设置了请求头`Content-Type`为`application/json`,以告知服务器发送的数据格式。使用`urllib.request.urlopen`发送请求并读取服务器的响应。
#### 总结
通过上述示例,我们可以看到如何使用`urllib`和`urllib2`模块发送GET和POST请求。这两种请求方式在实际项目中非常常见,掌握它们可以帮助开发者更好地与Web服务进行交互。需要注意的是,在Python 3.x中,`urllib2`的功能已被合并到`urllib.request`模块中,因此在编写新代码时推荐使用`urllib.request`。
在实际应用中,除了GET和POST之外,还有许多其他类型的HTTP请求(如PUT、DELETE等)。同时,为了提高代码的健壮性和可维护性,建议使用更高层次的库(如Requests)来处理HTTP请求,这些库提供了更加简洁易用的API,同时也具有更好的错误处理和安全性支持。