Python 3.x 中如何使用urllib模块进行URL操作

1. urllib模块介绍

Python 3.x中包含了多个HTTP库,其中最常见的HTTP请求库为urllib。urllib可以帮助我们处理各种URL,例如从Web服务器下载文件,从Web页面获取数据,提交数据等。urllib是Python内置的标准库,无需安装即可使用。

2. urllib模块的组成

urllib模块包含以下子模块:

urllib.request: 处理URL请求,包括打开和读取URL。

urllib.error: 包含urllib.request引发的异常。

urllib.parse: 处理URL地址解析和拼接。

urllib.robotparser: 创建robots.txt文件的解析器。

3. urllib.request的使用

urllib.request模块是进行URL请求的主要模块。下面我们来看一下如何使用urllib.request模块发送一个GET请求,并获取响应内容。

3.1 发送GET请求

使用urllib.request.urlopen()方法可以发送GET请求,该方法的参数是一个URL字符串,返回值是一个HTTPResponse对象。

import urllib.request

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

html = response.read()

print(html)

上述代码中,先调用了urlopen()方法,传入要请求的URL,返回响应对象response。读取响应内容可以使用response.read()方法,它会将整个响应的内容返回,包括HTML代码,图片等。

3.2 响应对象的属性与方法

响应对象HTTPResponse除了read()方法以外,还包含以下属性与方法:

read(): 读取响应体的数据。

readinto(): 将响应体内的数据读入到指定的bytes变量中。

getheader(name): 获取指定头名称的值。

getheaders(): 获取响应头的名称与值。

info(): 获取响应头信息类对象(mime-type, content-length, expires等)。

geturl(): 获取请求的URL。

3.3 请求对象的属性与方法

我们可以通过request对象设置请求的头信息、请求方式、请求参数等。下面我们来看一下request对象的一些常用属性和方法:

method: GET、POST等请求方法。

headers: 请求头信息。

data: 请求的数据。

url: 请求的URL。

3.4 发送POST请求

使用urllib.request.urlopen()方法发送POST请求,需要传入额外参数data,该参数是一个字典类型,存储表单数据键值对。下面我们来看一下发送POST请求的代码。

import urllib.request

# 表单数据

data = {'username': 'admin', 'password': 'admin123'}

# 转换为URL编码格式

data = urllib.parse.urlencode(data).encode('utf-8')

# 请求

request = urllib.request.Request('http://www.example.com/login', data=data)

response = urllib.request.urlopen(request)

html = response.read()

print(html)

上述代码中,将表单数据以字典类型data保存,调用urlencode()方法将其转换为URL编码格式,并设置为UTF-8编码。然后,将数据和请求URL传递给Request对象,并使用urlopen()方法发送POST请求。

3.5 设置请求头

在请求中,请求头(header)是一个包含所有HTTP请求信息(如请求方式、请求地址、请求头信息等)的字符串。下面我们来看一下如何设置请求头。

import urllib.request

# 请求头

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'}

# 请求

request = urllib.request.Request('http://www.example.com/', headers=headers)

response = urllib.request.urlopen(request)

html = response.read()

print(html)

上述代码中,headers字典保存了请求头信息。将其传递给Request对象的headers参数,通过urlopen()方法发送请求即可。

4. urllib.parse的使用

在实际应用中,我们还需要对URL进行拼接和解析。urllib.parse模块则帮助我们快速地实现这些操作。

4.1 URL编码

URL通常只接受ASCII字符集。因此,如果URL中含有非ASCII字符集的字符,需要进行URL编码。Python提供了urllib.parse.quote()和urllib.parse.quote_plus()方法来实现URL编码。其中,quote()方法不会对slash进行编码,而quote_plus()在编码时会使用“+”代替空格。下面我们来看一下quote()方法的使用。

import urllib.parse

url = 'http://www.example.com/search?q=python编程基础'

encoded_url = urllib.parse.quote(url, safe='/:?=&')

print(encoded_url)

上述代码中,使用quote()方法进行URL编码,将url字符串传递给safe参数进行编码。

4.2 URL解码

有时候我们需要对URL进行解码。urllib.parse.unquote()方法可以实现URL解码。下面我们来看一下unquote()方法的使用。

import urllib.parse

encoded_url = 'http%3A//www.example.com/search%3Fq%3Dpython%25E7%25BC%2596%25E7%25A8%258B%25E5%259F%25BA%25E7%25A1%2580'

decoded_url = urllib.parse.unquote(encoded_url)

print(decoded_url)

上述代码中,使用unquote()方法进行URL解码,将编码后的字符串传递给该方法,即可得到解码后的结果。

4.3 URL拼接

如果我们需要在代码中拼接URL,可以使用urllib.parse.urljoin()方法。下面我们来看一下urljoin()方法的使用。

import urllib.parse

base_url = 'http://www.example.com/home/'

new_url = urllib.parse.urljoin(base_url, 'index.html')

print(new_url)

上述代码中,使用urljoin()方法将当前的相对路径:index.html与基础URL(http://www.example.com/home/)合并成一个完整的URL:http://www.example.com/home/index.html。

5. urllib.error的使用

urllib.error模块包含了在请求过程中可能会出现的错误。使用try、except可以捕获这些异常,帮助我们进行错误处理。下面我们来看一下常见的异常。

5.1 HTTPError

HTTPError是HTTP状态码错误的错误类。状态码为4xx或者5xx时,会引发此异常,如404、500等。下面我们来看一下HTTPError异常的使用。

import urllib.request

import urllib.error

url = 'http://www.example.com/404'

try:

response = urllib.request.urlopen(url)

except urllib.error.HTTPError as e:

print(e.code, e.reason, e.headers, sep='\n')

上述代码中,我们试图打开一个404错误的页面,该请求将会抛出HTTPError异常。通过捕获HTTPError异常,我们可以得到HTTP状态码、响应信息等。

5.2 URLError

URLError是请求失败的错误类。当我们无法访问到请求的地址时,会引发此异常。下面我们来看一下URLError异常的使用。

import urllib.request

import urllib.error

url = 'http://www.404.com'

try:

response = urllib.request.urlopen(url)

except urllib.error.URLError as e:

print(e.reason)

上述代码中,我们试图访问一个不存在的地址,该请求将会抛出URLError异常。通过捕获URLError异常,我们可以得到异常原因。

6. 总结

本文介绍了Python 3.x中urllib模块的使用。我们学习了如何使用urllib.request模块发送GET、POST请求,如何设置请求头,如何处理响应对象,如何进行URL编码和解码,以及如何拼接URL地址。此外,我们也了解到了常见的异常类HTTPError和URLError,并进行了错误处理。希望这篇文章能够帮助大家更好的理解和使用Python的urllib模块。

后端开发标签