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模块。