Python 3.x 中如何使用urllib.request模块发送HTTP请求

使用urllib.request模块发送HTTP请求

Python的urllib.request模块提供了一种发送HTTP请求的方式,让我们可以通过Python代码发送HTTP请求,获取返回的数据,实现自动化操作。下面我们就来详细地了解一下Python 3.x中如何使用urllib.request模块发送HTTP请求。

1. 导入模块

在使用urllib.request模块发送HTTP请求之前,我们需要先导入该模块,具体代码如下:

import urllib.request

2. 发送GET请求

发送GET请求是最常见的一种HTTP请求方式,我们可以通过urllib.request模块中的urlopen函数实现。urlopen函数的使用方法很简单,只需要传一个url参数即可。例如,我们要请求http://www.baidu.com这个网页的内容,代码如下:

response = urllib.request.urlopen('http://www.baidu.com')

print(response.read())

以上代码中,我们使用urlopen函数请求了百度首页的内容,并将响应体(即网页内容)打印到控制台。

注意:在Python 3.x中,urlopen函数返回的是一个HTTPResponse对象,而不再是一个类文件对象。因此我们需要通过response.read()方法来获取响应体,而不能像Python 2.x中那样直接使用response.read()获取响应内容。

3. 发送POST请求

和GET请求不同的是,POST请求需要在请求体中传递参数。我们可以通过构造Request对象来实现POST请求。具体过程如下:

1. 构造POST请求参数

我们可以通过urllib.parse模块中的urlencode函数将字典类型的POST请求参数转化为字符串形式。例如,我们要向httpbin.org这个网站发送一个POST请求,请求参数为{'name': '张三', 'age': 18},代码如下:

import urllib.parse

values = {'name': '张三', 'age': 18}

data = urllib.parse.urlencode(values)

data = data.encode('utf-8') # 将数据编码为utf-8类型

2. 构造Request对象

由于POST请求需要在请求体中传递参数,我们需要将请求参数放入Request对象中。其中,构造Request对象时,需要传递url、data和headers参数。其中,headers参数是可选的,用于设置请求头信息。

例如,我们要向httpbin.org这个网站发送一个POST请求,请求参数为{'name': '张三', 'age': 18},代码如下:

import urllib.request

import urllib.parse

url = 'http://httpbin.org/post'

values = {'name': '张三', 'age': 18}

data = urllib.parse.urlencode(values)

data = data.encode('utf-8') # 将数据编码为utf-8类型

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

req = urllib.request.Request(url, data, headers)

response = urllib.request.urlopen(req)

print(response.read())

以上代码中,我们构造了一个POST请求,包括url、data和headers参数。其中,data参数将请求参数转化成字符串的形式,并编码为utf-8类型;headers参数用于设置请求头信息,这里我们设置了一个User-Agent请求头。最后,我们通过urlopen函数发送POST请求,并打印响应体。

4. 高级用法

除了上面介绍的发送GET和POST请求之外,urllib.request模块还提供了一些高级用法,例如设置代理、Cookie处理、SSL验证等。这部分内容比较复杂,我只简单介绍一下:

4.1 设置代理

如果我们需要通过代理发送HTTP请求,可以通过ProxyHandler和urllib.request.build_opener函数来实现。例如,我们要使用http://127.0.0.1:8080这个代理服务器发送请求,代码如下:

import urllib.request

proxy_handler = urllib.request.ProxyHandler({'http': 'http://127.0.0.1:8080'})

opener = urllib.request.build_opener(proxy_handler)

response = opener.open('http://www.baidu.com')

print(response.read())

4.2 Cookie处理

如果我们需要处理HTTP请求中的Cookie信息,可以通过HTTPCookieProcessor和urllib.request.build_opener函数来实现。例如,我们要抓取知乎首页时需要登录,请求时需要设置Cookie信息,代码如下:

import http.cookiejar

import urllib.request

# 创建Cookie处理器

cookie_jar = http.cookiejar.CookieJar()

handler = urllib.request.HTTPCookieProcessor(cookie_jar)

# 创建Opener

opener = urllib.request.build_opener(handler)

# 发送请求

response = opener.open('http://www.zhihu.com')

print(cookie_jar) # 查看Cookie信息

4.3 SSL验证

如果我们请求的网站是通过SSL加密的,可以通过构造一个SSLContext对象来实现。SSLContext对象中包含了所有SSL相关的配置信息,例如加密算法、认证方式等。例如,我们要向https://www.baidu.com发送请求,代码如下:

import ssl

import urllib.request

# 创建SSL上下文对象

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)

# 请求网站

response = urllib.request.urlopen('https://www.baidu.com', context=context)

print(response.read())

总结

本文详细介绍了如何使用urllib.request模块发送HTTP请求,包括发送GET请求、POST请求、设置代理、Cookie处理以及SSL验证等高级用法。希望本文能够帮助到大家,更多详细内容可以参考Python官方文档。

后端开发标签