Python从0到50(二十三):urllib模块使用

目录

一、urllib 模块的安装与引入

二、urllib.request 基础

1. 发送 GET 请求

2. 发送 POST 请求

3. 设置自定义请求头

4. 使用代理发送请求

三、urllib.parse:解析与构造 URL

1. 将 URL 分解为组件

2. 构造 URL

3. 解码查询字符串

四、urllib.error: 捕获异常

五、urllib.robotparser: 解析 robots.txt

六、进阶技巧

1. 超时设置

2. 使用 HTTPS 安全连接

七、总结


urllib 是 Python 内置的用于处理 URL(Uniform Resource Locator)的模块,也是实现网络请求的基础库之一。该模块功能强大,但它的使用和管理相对于一些第三方库(如 requests)稍显繁复。本文将从基础到进阶,详细介绍 urllib 的使用方法,并给出丰富的代码示例和实际应用案例。

urllib 模块在 Python 3 中被拆分为多个子模块,主要包括:

urllib.request:用于发送 HTTP 请求、处理 URL。
urllib.parse:用于解析和构造 URL。
urllib.error:用于处理请求中的错误。
urllib.robotparser:用于解析网站 robots.txt 文件的规则。


一、urllib 模块的安装与引入

urllib 是 Python 的标准库,无需额外安装。不过,你必须确保自己的 Python 环境是 3.x 版本(Python 2.x 已经被官方废弃,其 urllib 使用与 3.x 有较大区别)。

Python

import urllib

在 Pyhton 3.x 中,可以引入模块子组件,例如:

Python

from urllib import request, parse, error, robotparser

二、urllib.request 基础

urllib.request 是核心模块,用于处理 HTTP 请求和响应。以下是最常见的操作:

1. 发送 GET 请求

GET 请求是最常见的 HTTP 请求,用于向服务器获取数据。

Python

from urllib import request

# 目标 URL
url = "https://jsonplaceholder.typicode.com/posts"

# 发送 GET 请求
response = request.urlopen(url)

# 读取响应内容(字节流)
data = response.read()

# 解码为字符串
text = data.decode('utf-8')

# 打印内容
print("响应内容:", text)

# 打印 HTTP 状态码
print("状态码:", response.status)

# 打印响应头
print("响应头:", response.getheaders())

输出:

Code

状态码: 200
响应头: [('Content-Type', 'application/json; charset=utf-8'), ('Server', 'cloudflare')]
响应内容: [JSON 数据]

2. 发送 POST 请求

POST 请求通常用于提交数据到服务器,例如提交表单数据。

Python

from urllib import request, parse

# 目标 URL
url = "https://jsonplaceholder.typicode.com/posts"

# 准备 POST 数据
post_data = {
    "title": "foo",
    "body": "bar",
    "userId": 1
}
# 将字典编码为 `application/x-www-form-urlencoded` 格式
post_data = parse.urlencode(post_data).encode('utf-8')

# 发起 POST 请求
req = request.Request(url, data=post_data, method="POST")
response = request.urlopen(req)

# 读取响应
data = response.read().decode('utf-8')
print("响应内容:", data)

3. 设置自定义请求头

在发送请求时,通常需要设置一些自定义的 HTTP 头,例如 User-AgentCookie 等。

Python

from urllib import request

# 目标 URL
url = "https://httpbin.org/headers"

# 自定义请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36',
    'Authorization': 'Bearer my_token'
}

# 创建请求对象
req = request.Request(url, headers=headers)

# 发起 GET 请求
response = request.urlopen(req)
data = response.read().decode('utf-8')
print("响应内容:", data)

4. 使用代理发送请求

有时候需要使用代理服务器访问目标网站,可以通过 urllib 实现。

Python

from urllib import request

# 目标 URL
url = "http://httpbin.org/ip"

# 设置代理
proxy = {"http": "http://103.21.163.81:6666", "https": "https://103.21.163.81:6666"}
proxy_handler = request.ProxyHandler(proxy)

# 创建一个 opener 对象
opener = request.build_opener(proxy_handler)

# 使用 opener 发送请求
response = opener.open(url)
data = response.read().decode('utf-8')

print("响应内容:", data)

三、urllib.parse:解析与构造 URL

urllib.parse 提供了一些用于解析、构造和处理 URL 的工具,非常适合用来管理复杂的 URL。

1. 将 URL 分解为组件

可以利用 urlparse 将一个 URL 分解为多个组成部分。

Python

from urllib.parse import urlparse

url = "https://example.com:8080/path/to/file?query=value#section"

# 分解 URL
result = urlparse(url)

print("协议:", result.scheme)
print("域名:", result.netloc)
print("路径:", result.path)
print("查询参数:", result.query)
print("片段:", result.fragment)

输出:

Code

协议: https
域名: example.com:8080
路径: /path/to/file
查询参数: query=value
片段: section

2. 构造 URL

使用 urlencode 构造查询字符串,并拼接到 URL。

Python

from urllib.parse import urlencode

# 基础 URL
base_url = "https://example.com/api?"

# 查询参数
params = {
    "search": "Python urllib",
    "page": 1,
    "count": 10
}

# 构造完整 URL
full_url = base_url + urlencode(params)

print("完整 URL:", full_url)

输出:

Code

完整 URL: https://example.com/api?search=Python+urllib&page=1&count=10

3. 解码查询字符串

使用 parse_qs 或 parse_qsl 将查询字符串解析为字典或元组列表。

Python

from urllib.parse import parse_qs

query = "search=Python+urllib&page=1&count=10"

# 将查询字符串解析为字典
params = parse_qs(query)

print("参数字典:", params)

四、urllib.error: 捕获异常

网络请求由于超时、DNS 错误等原因可能会导致异常,可以通过 urllib.error 捕���并处理。

Python

from urllib import request, error

url = "http://thisurldoesnotexist.xyz"

try:
    response = request.urlopen(url)
except error.URLError as e:
    print("请求失败:", e.reason)

五、urllib.robotparser: 解析 robots.txt

urllib.robotparser 用于解析网站的 robots.txt 文件,检查爬虫是否有权限抓取指定页面。

Python

from urllib.robotparser import RobotFileParser

# 创建解析器
rp = RobotFileParser()

# 设置 robots.txt URL
rp.set_url("https://www.example.com/robots.txt")
rp.read()

# 检查是否允许爬取指定页面
url = "https://www.example.com/some-page"
print(f"允许访问 {url}:", rp.can_fetch("*", url))

六、进阶技巧

1. 超时设置

在调用 urlopen 方法时,可以使用 timeout 参数来设置超时时间。

Python

from urllib import request

url = "https://google.com"

try:
    response = request.urlopen(url, timeout=5)
except Exception as e:
    print("请求超时!")

2. 使用 HTTPS 安全连接

urllib 默认支持 HTTPS 请求,并能够通过 ssl 模块进行控制。

Python

from urllib import request
import ssl

# 禁用 SSL 证书验证(谨慎使用)
ssl._create_default_https_context = ssl._create_unverified_context

url = "https://self-signed.badssl.com/"
response = request.urlopen(url)
print(response.read().decode('utf-8'))

七、总结

urllib 是 Python 的内置网络模块,功能丰富但稍显复杂。尽管在简单场景使用它可能不如第三方库 requests 友好,但它作为基础工具,足够应对大部分基本的 HTTP 请求和 URL 操作需求。

在生产环境中,推荐结合 urllib 和第三方工具构建更灵活的网络模块。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容