Scrapy与分布式开发(2.1.3):python常用网络请求库urllib3

Python urllib3模块详细讲解

一、引言

urllib3 是一个 Python 库,用于发送 HTTP 请求。它是 urlliburllib2 的后续版本,并提供了更高级的功能和更好的性能。urllib3 支持 HTTP/1.1 和 HTTP/2 协议,并具有连接池、自动重试、文件上传/下载等特性。

二、安装

pip install urllib3

三、基本用法

发送 GET 请求

import urllib3

http = urllib3.PoolManager()
response = http.request('GET', 'https://www.example.com')

print(response.status)  # 输出 HTTP 状态码
print(response.data.decode('utf-8'))  # 输出响应内容

发送 POST 请求

import urllib3

http = urllib3.PoolManager()
headers = {'Content-Type': 'application/json'}
data = '{"key": "value"}'

response = http.request('POST', 'https://www.example.com/post', headers=headers, body=data)

print(response.status)
print(response.data.decode('utf-8'))

四、高级特性

连接池

urllib3 默认使用连接池来复用 HTTP 连接,以提高性能。

http = urllib3.PoolManager()

# 使用同一个连接池发送多个请求
response1 = http.request('GET', 'https://www.example.com/page1')
response2 = http.request('GET', 'https://www.example.com/page2')

自动重试

urllib3 支持自动重试失败的请求。

retries = urllib3.Retry(total=5, backoff_factor=0.1, status_forcelist=[ 500, 502, 503, 504 ])
http = urllib3.PoolManager(retries=retries)

response = http.request('GET', 'https://www.example.com/unreliable')

超时设置

可以为请求设置超时时间。

timeout = urllib3.Timeout(connect=5, read=10)
http = urllib3.PoolManager(timeout=timeout)

response = http.request('GET', 'https://www.example.com/slow', timeout=timeout)

代理设置

可以通过设置代理来发送请求。

proxies = {
    "http": "http",
    "https": "http",
}

http = urllib3.PoolManager(proxies=proxies)
response = http.request('GET', 'https://www.example.com')

文件上传和下载

urllib3 支持文件上传和下载。

# 文件上传
http = urllib3.PoolManager()
with open('local-file.txt', 'rb') as f:
    fields = {'file': ('filename.txt', f)}
    encoded_fields = urllib3.fields.encode_multipart_formdata(fields)
    response = http.request('POST', 'https://www.example.com/upload', body=encoded_fields)

# 文件下载
http = urllib3.PoolManager()
response = http.request('GET', 'https://www.example.com/download/file.txt', preload_content=False)
with open('downloaded-file.txt', 'wb') as f:
    shutil.copyfileobj(response.stream, f)

安全性

urllib3 支持 SSL 证书验证,以确保 HTTPS 请求的安全性。

http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())
response = http.request('GET', 'https://www.example.com/secure')
posted @ 2024-02-27 16:45  七夜魔手  阅读(9)  评论(0编辑  收藏  举报  来源