Python的urllib.request模块是用于发送HTTP请求的Python内置模块。该模块提供了功能丰富的API,可以完全控制HTTP请求的各个方面,并且支持多种HTTP请求方法和请求头参数设置。本篇攻略将详细讲解urllib.request模块发送请求的实现过程,包括请求对象的构建、请求参数的设定、请求方法的执行、响应对象的处理等。下面进入正题。
构建请求对象
请求对象是发送HTTP请求的基本平台,它包含了请求的各种参数和信息。在urllib.request模块中,我们可以通过Request类来构建请求对象。Request类的构造函数如下:
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
这里,参数url是必须的,表示请求的目标地址;参数data是可选的,表示请求的数据体;参数headers也是可选的,表示请求的头信息;参数method是可选的,表示请求的HTTP方法。以下是一个请求对象的构建示例:
import urllib.request
url = 'https://www.example.com/'
headers = {'User-Agent': 'Mozilla/5.0'}
data = b'hello, world!'
req = urllib.request.Request(url=url, data=data, headers=headers, method='POST')
上述代码构建了一个POST类型的请求对象req,其中url为目标地址,data为发送的数据,headers为请求头信息。
设置请求参数
在构建请求对象后,我们可以对请求进行一系列的参数设定,包括请求方法、请求头、请求体、超时时间、代理设置等。以下是一些常用的请求参数设置示例。
请求方法
在构建请求对象时,设置method参数可以设定请求的HTTP方法。如不指定method参数,将默认为GET方法。以下是常见的HTTP方法及其含义。
- GET:获取资源
- POST:提交数据
- PUT:更新资源
- DELETE:删除资源
请求头
在构建请求对象时,设置headers参数可以设定请求头信息。请求头用来说明服务器要采取的操作,包括浏览器身份信息、编码格式、参数类型等。以下是几个常见的请求头示例:
headers = {'User-Agent': 'Mozilla/5.0', 'Accept-Language': 'en-US,en;q=0.5'}
上述代码设置了User-Agent和Accept-Language两个请求头信息,分别表示浏览器类型和语言偏好。
请求体
在POST等请求方法中,可以通过设置data参数来设定请求体内容。请求体的格式可以是字符串、字典、元组、字节流等多种形式。以下是一个字节流的请求体示例:
data = b'hello, world!'
超时设置
在发送请求时,可以设置timeout参数来设定请求的超时时间,单位为秒。如果在指定时间内无法获取响应,将抛出timeout异常。以下是一个10秒超时的请求:
req = urllib.request.Request(url=url, timeout=10)
代理设置
如果需要通过代理服务器发送请求,可以通过设置ProxyHandler和opener参数来实现。以下是一个通过代理发送请求的示例:
import urllib.request
url = 'https://www.example.com/'
headers = {'User-Agent': 'Mozilla/5.0'}
data = b'hello, world!'
req = urllib.request.Request(url=url, data=data, headers=headers, method='POST')
proxy_handler = urllib.request.ProxyHandler({'http': 'http://127.0.0.1:8080'}) # 设置代理
opener = urllib.request.build_opener(proxy_handler) # 构建opener
response = opener.open(req) # 发送请求并获取响应
执行请求方法
在构建请求对象并设置请求参数后,可以通过urlopen方法发送请求并获取响应。urlopen方法的返回值是一个响应对象。urlopen方法的完整语法如下:
urllib.request.urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *, cafile=None, capath=None, cadefault=False, context=None)
这里,参数url是必要的,表示请求的目标地址;参数data是可选的,表示请求的数据体;参数timeout也是可选的,表示请求的超时时间。以下是一个GET请求示例:
import urllib.request
url = 'https://www.example.com/'
headers = {'User-Agent': 'Mozilla/5.0'}
req = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(req)
上述代码构建了一个GET类型的请求,发送到目标地址,并获取了响应对象response。
处理响应对象
在获取响应对象后,我们可以对其进行各种信息的提取和处理。响应对象包含了HTTP响应的各个方面,包括状态码、响应头信息、响应体内容等。以下是响应对象的一些常见属性和方法。
状态码
响应对象的属性status表示HTTP状态码,如200表示成功响应。以下是一个状态码的判断示例:
if response.status == 200:
print('请求成功')
响应头
响应对象的属性headers表示请求头信息,如Content-Type表示响应体类型。以下是一个获取响应头信息的示例:
content_type = response.getheader('Content-Type')
响应体
响应对象的方法read表示获取响应体内容。以下是一个获取响应体内容的示例:
body = response.read()
示例说明
以下是一个利用urllib.request模块发送POST请求的示例,该请求需要上传文件和表单数据,同时也通过开启debug日志的方式查看请求和响应报文。
import urllib.request
import http.cookiejar
import logging
import os
# debug日志
http_handler = urllib.request.HTTPHandler(debuglevel=1)
https_handler = urllib.request.HTTPSHandler(debuglevel=1)
opener = urllib.request.build_opener(http_handler, https_handler)
urllib.request.install_opener(opener)
# CookieJar
cookie_jar = http.cookiejar.CookieJar()
cookie_processor = urllib.request.HTTPCookieProcessor(cookie_jar)
# Request
url = 'https://www.example.com/upload'
file_path = 'example.png'
file_name = os.path.basename(file_path)
with open(file_path, mode='rb') as file:
file_content = file.read()
form_data = {
'username': 'john',
'password': '123456',
'file': (file_name, file_content),
'submit': 'upload'
}
boundary = '----WebKitFormBoundary' + 'abc' # 分隔符
headers = {
'Content-Type': 'multipart/form-data; boundary=' + boundary,
'User-Agent': 'Mozilla/5.0'
}
encoded_form_data = b''
for key, value in form_data.items():
if isinstance(value, tuple):
filename, data = value
encoded_form_data += ('--' + boundary + '\r\n'
+ 'Content-Disposition: form-data; name="' + key + '"; filename="' + filename + '"\r\n'
+ 'Content-Type: application/octet-stream\r\n\r\n').encode()
encoded_form_data += data + b'\r\n'
else:
encoded_form_data += ('--' + boundary + '\r\n'
+ 'Content-Disposition: form-data; name="' + key + '"\r\n'
+ 'Content-Type: text/plain\r\n\r\n').encode()
encoded_form_data += str(value).encode() + b'\r\n'
encoded_form_data += ('--' + boundary + '--\r\n').encode()
data_len = str(len(encoded_form_data))
req = urllib.request.Request(url, data=encoded_form_data, headers=headers, method='POST')
req.add_header('Content-Length', data_len)
# 发送请求
response = urllib.request.urlopen(req)
# 处理响应
content = response.read()
print(content.decode())
上述代码构建了一个上传图片文件和表单数据的POST请求。其中,file_path和form_data分别表示要上传的文件和表单数据,boundary为分隔符,headers表示请求头信息。在发送请求后,通过读取响应对象的方式,获取了响应内容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python urllib request模块发送请求实现过程解析 - Python技术站