Python urllib详解
- 一、urllib是什么?
-
- [1. 应用场景](#1. 应用场景)
- [2. 核心功能](#2. 核心功能)
- [3. 历史和版本](#3. 历史和版本)
- [4. 使用限制和替代品](#4. 使用限制和替代品)
- 二、urllib库的组成
- 四、使用urllib进行网络请求
- 五、使用urllib解析和修改URL
一、urllib是什么?
urllib提供了一系列用于操作URL和处理网络资源的工具,使得HTTP请求变得非常简单,从而能够轻松访问和操作网页数据。
1. 应用场景
urllib库广泛应用于各种网络应用,包括但不限于:
- 网页内容抓取
- 数据下载和上传
- 自动化测试
- 网络爬虫
2. 核心功能
- 发送和接收数据:可以通过GET和POST请求发送和接收网络数据。
- 数据编码和解码:支持URL的编码和解码,确保网络请求的准确性。
- 异常处理:能够处理网络请求过程中可能出现的多种异常,如连接错误、数据接收错误等。
- Cookie处理:可以管理HTTP cookies,使得处理网站登录和状态保持更为便利。
3. 历史和版本
urllib库是Python较早提供的模块之一,它随Python一起发展。在Python 2.x版本中,urllib和urllib2为独立的模块,提供不同的功能。从Python 3.x开始,urllib被重新组织,合并了urllib和urllib2的功能,分为几个子模块(urllib.request, urllib.parse, 等等)。
4. 使用限制和替代品
虽然urllib非常强大,但它的接口相对底层,对于复杂的网络请求处理或者需要高级功能(如连接重用、会话管理、代理支持等),可能不够方便或高效。在这些情况下,许多开发者选择使用第三方库,如Requests,它提供了更简洁的API和更丰富的功能。
二、urllib库的组成
Python的urllib库由几个子模块组成,每个模块都承担着特定的功能,这些功能共同支持处理URL和网络通信的需求。
1. urllib.request
这个子模块是urllib库中最为核心的部分,用于打开和读取URLs。它支持多种网络协议,如HTTP、FTP,并允许发送网络请求、处理请求头、处理表单数据等。这个模块可以通过GET、POST方法等发送请求,并获取服务器响应。
主要功能:
- 打开URLs(主要是HTTP或HTTPS)
- 读取网络数据
- 发送数据和文件
- 处理Cookies
- 自定义请求头(如用户代理字段)
示例代码:
python
import urllib.request
# 打开一个网页并读取内容
with urllib.request.urlopen('http://example.com') as response:
html = response.read()
print(html)
2. urllib.error
urllib.error模块包含了一些特定的异常处理类,用来识别和处理由urllib.request引起的异常。
主要异常类:
URLError
:由urllib.request引起的错误的基类,如连接失败等。HTTPError
:特定的HTTP请求错误,如404页面未找到,500服务器内部错误等。这个类是URLError
的子类。
示例代码:
python
from urllib.request import urlopen
from urllib.error import URLError, HTTPError
try:
response = urlopen('http://thisurldoesnotexist.com')
except HTTPError as e:
print('HTTP Error:', e.code)
except URLError as e:
print('URL Error:', e.reason)
else:
print(response.read())
3. urllib.parse
这个子模块用于解析URLs,它可以拆分、解析和合成URL组件,使得管理和修改URL变得简单。
主要功能:
- 解析URL(分解成组件)
- 合成URL(从组件重新组合成完整URL)
- 编码和解码查询字符串
示例代码:
python
from urllib.parse import urlparse, urlunparse
url = 'http://www.example.com/default.html?ct=32&op=92'
parsed_url = urlparse(url)
print(parsed_url)
new_url = parsed_url._replace(path='/newpath')
print(urlunparse(new_url))
4. urllib.robotparser
这个子模块用于解析robots.txt文件。robots.txt是网站根目录下的一个文件,用来告知爬虫哪些页面可以抓取,哪些不可以。urllib.robotparser可以解析这个文件,帮助开发者的爬虫遵守网站的爬虫协议。
主要功能:
- 解析robots.txt
- 确定某个user-agent是否有权访问网页
示例代码:
python
from urllib.robotparser import RobotFileParser
rp = RobotFileParser()
rp.set_url('http://www.example.com/robots.txt')
rp.read()
can_fetch = rp.can_fetch('*', 'http://www.example.com/doc')
print('Can fetch:', can_fetch)
四、使用urllib进行网络请求
1. 发送简单的GET请求
在urllib中,可以使用urlopen
方法直接发送GET请求。
代码示例:
python
from urllib.request import urlopen
# 使用urlopen打开网页
response = urlopen('http://example.com/')
html = response.read() # 读取网页内容
response.close() # 关闭连接
print(html) # 打印网页内容
通过调用urlopen
函数直接打开了一个网页,并读取其HTML内容。这种方式适用于快速获取网页数据。
2. 发送POST请求
在urllib中,通过创建一个Request
对象并使用urlopen
方法发送它,可以实现POST请求。
代码示例:
python
from urllib.parse import urlencode
from urllib.request import Request, urlopen
# 准备数据并编码
data = urlencode({'key1': 'value1', 'key2': 'value2'}).encode()
# 创建Request对象,指定URL和数据
req = Request('http://example.com/', data=data) # POST请求
# 发送请求并接收响应
response = urlopen(req)
print(response.read()) # 打印响应内容
首先将数据编码成适合URL的格式,然后创建一个Request
对象,最后发送POST请求并输出响应。
3. 处理异常
在进行网络请求时,可能会遇到各种错误,如网络不可达、页面不存在等。
代码示例:
python
from urllib.request import urlopen
from urllib.error import URLError, HTTPError
try:
response = urlopen('http://example.com/')
except HTTPError as e:
print('HTTP错误:', e.code) # 打印HTTP错误代码
except URLError as e:
print('URL错误:', e.reason) # 打印URL错误原因
else:
html = response.read() # 读取响应内容
print(html) # 打印响应内容
finally:
response.close() # 确保资源被正确关闭
使用HTTPError
来捕获HTTP相关的错误,使用URLError
来处理URL解析和网络相关的错误。
五、使用urllib解析和修改URL
urllib.parse
模块提供了强大的工具来处理URLs,包括解析、合成、修改和编码URLs。
1. 解析URL组件
解析URL是指将一个完整的URL分解成它的各个组成部分,如协议、主机名、端口、路径等。
代码示例:
python
from urllib.parse import urlparse
# 解析URL
o = urlparse('http://example.com:80/path')
print(o)
输出示例:
ParseResult(scheme='http', netloc='example.com:80', path='/path', params='', query='', fragment='')
代码使用urlparse
函数解析了一个URL,并返回一个ParseResult
对象,它包含了URL的各个部分。这些部分可以通过属性访问,如o.scheme
, o.netloc
, o.path
等。
2. 修改URL参数
在某些情况下,需要根据需要修改URL的某些部分,如路径或查询参数等。
代码示例:
python
from urllib.parse import urlunparse, urlparse
# 解析原始URL
original = urlparse('http://example.com:80/path')
# 修改路径组件
new_url = original._replace(path='/newpath')
# 合成新的URL
print(urlunparse(new_url))
输出结果示例:
http://example.com:80/newpath
代码首先解析一个URL,使用_replace
方法修改了路径部分。最后使用urlunparse
函数重新合成修改后的URL。