引言:
无论是进行Web开发还是进行数据抓取、API调用,处理HTTP请求是Python开发中必不可少的环节。在众多HTTP库中,Requests库凭借其简洁而强大的功能和直观的API设计,成为开发者的首选。本文将深入介绍Python的Requests库,从基本使用方法到高级功能和扩展,帮助开发者轻松愉快地处理各种HTTP请求。
下面封装一个类具体介绍下其基本功能,后面则是系统介绍:
import requests
from requests.exceptions import Timeout, ConnectionError
from requests.auth import HTTPBasicAuth
class HttpRequest:
def __init__(self):
self.session = requests.Session()
def send_get_request(self, url, headers=None, params=None, timeout=None):
"""发送 GET 请求并返回响应内容。可以传递自定义的请求头 headers、查询参数 params 和超时时间 timeout"""
try:
response = self.session.get(url, headers=headers, params=params, timeout=timeout)
return response.text
except (Timeout, ConnectionError) as e:
print(f'Request failed: {e}')
return None
def send_post_request(self, url, headers=None, data=None, json=None, timeout=None):
"""发送 POST 请求并返回响应内容。可以传递自定义的请求头 headers、表单数据 data、JSON 数据 json 和超时时间 timeout。"""
try:
response = self.session.post(url, headers=headers, data=data, json=json, timeout=timeout)
return response.text
except (Timeout, ConnectionError) as e:
print(f'Request failed: {e}')
return None
def set_custom_headers(self, headers):
"""设置自定义的请求头"""
self.session.headers.update(headers)
def set_query_params(self, params):
"""设置 GET 请求的查询参数"""
self.session.params = params
def send_form_data(self, url, data=None, headers=None, timeout=None):
"""发送包含表单数据的 POST 请求,并返回响应内容。
可以传递自定义的请求头 headers、表单数据 data 和超时时间 timeout。"""
try:
response = self.session.post(url, data=data, headers=headers, timeout=timeout)
return response.text
except (Timeout, ConnectionError) as e:
print(f'Request failed: {e}')
return None
def send_json_data(self, url, json=None, headers=None, timeout=None):
"""发送包含 JSON 数据的 POST 请求,并返回响应内容。可以传递自定义的请求头 headers、JSON 数据 json 和超时时间 timeout。""""
try:
response = self.session.post(url, json=json, headers=headers, timeout=timeout)
return response.text
except (Timeout, ConnectionError) as e:
print(f'Request failed: {e}')
return None
def upload_file(self, url, file=None, headers=None, timeout=None):
"""上传文件,并返回响应内容。可以传递自定义的请求头 headers、文件对象 file 和超时时间 timeout"""
try:
files = {'file': file}
response = self.session.post(url, files=files, headers=headers, timeout=timeout)
return response.text
except (Timeout, ConnectionError) as e:
print(f'Request failed: {e}')
return None
def download_file(self, url, save_as=None, headers=None, timeout=None):
"""下载文件并保存。可以传递自定义的请求头 headers、保存文件的路径 save_as 和超时时间 timeout"""
try:
response = self.session.get(url, headers=headers, timeout=timeout)
if save_as:
with open(save_as, 'wb') as f:
f.write(response.content)
return response.text
except (Timeout, ConnectionError, IOError) as e:
print(f'Request failed: {e}')
return None
def get_response_status_code(self, url, headers=None, params=None, timeout=None):
"""发送 GET 请求并返回响应状态码。可以传递自定义的请求头 headers、查询参数 params 和超时时间 timeout"""
try:
response = self.session.get(url, headers=headers, params=params, timeout=timeout)
return response.status_code
except (Timeout, ConnectionError) as e:
print(f'Request failed: {e}')
return None
def get_response_headers(self, url, headers=None, timeout=None):
"""发送 GET 请求并返回响应头信息。可以传递自定义的请求头 headers 和超时时间 timeout"""
try:
response = self.session.get(url, headers=headers, timeout=timeout)
return response.headers
except (Timeout, ConnectionError) as e:
print(f'Request failed: {e}')
return None
def set_basic_auth(self, url, username, password):
"""设置基本身份验证的用户名和密码"""
self.session.auth = HTTPBasicAuth(username, password)
def disable_ssl_certificate_verification(self):
"""禁用 SSL 证书验证"""
self.session.verify = False
以实例化这个类,并使用其中的方法来发送各种类型的HTTP请求。
举例如下:
request = HttpRequest()
request.send_get_request('http://httpbin.org/get')
request.set_custom_headers({'User-Agent': 'Mozilla/5.0'})
request.set_query_params({'key1': 'value1', 'key2': 'value2'})
request.send_form_data('http://httpbin.org/post', data={'username': 'user', 'password': 'pass'})
request.send_json_data('http://httpbin.org/post', json={'name': 'John', 'age': 25})
request.upload_file('http://httpbin.org/post', file=open('example.txt', 'rb'))
request.download_file('http://httpbin.org/image/jpeg', save_as='image.jpg')
request.get_response_status_code('http://httpbin.org/get')
request.get_response_headers('http://httpbin.org/get')
request.set_basic_auth('http://httpbin.org/basic-auth/user/pass', 'user', 'pass')
request.disable_ssl_certificate_verification()
系统介绍如下:
Requests库提供了简洁而人性化的API,使发送HTTP请求变得非常简单。通过get、post等方法实现各种HTTP请求,并且提供了丰富的参数选项。
import requests
response = requests.get('http://httpbin.org/get')
通过设置headers参数,我们可以自定义请求头,模拟各种客户端的请求。
import requests
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get('http://httpbin.org/user-agent', headers=headers)
使用params参数,可以将查询参数添加到URL中,方便进行GET请求的参数传递。
import requests
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('http://httpbin.org/get', params=params)
使用data参数可以发送表单数据,常用于POST请求。
import requests
data = {'username': 'user', 'password': 'pass'}
response = requests.post('http://httpbin.org/post', data=data)
通过json参数,可以方便地发送JSON格式的数据,自动设置请求头为application/json。
import requests
import requests
data = {'name': 'John', 'age': 25}
response = requests.post('http://httpbin.org/post', json=data)
通过使用files参数,实现文件上传操作。
import requests
files = {'file': open('example.txt', 'rb')}
response = requests.post('http://httpbin.org/post', files=files)
使用content属性,轻松下载和保存服务器上的文件。
import requests
response = requests.get('http://httpbin.org/image/jpeg')
with open('image.jpg', 'wb') as f:
f.write(response.content)
获取响应的内容、状态码和响应头等信息,进行进一步的处理和判断。
import requests
response = requests.get('http://httpbin.org/get')
print(response.text) # 获取响应内容
print(response.status_code) # 获取状态码
print(response.headers) # 获取响应头
通过使用Session对象,可以在多个请求之间保持会话状态,包括cookies、headers等信息。
import requests
session = requests.Session()
response1 = session.get('http://httpbin.org/cookies/set?user_id=12345')
response2 = session.get('http://httpbin.org/cookies')
支持基本身份验证、摘要身份验证和OAuth等认证方式。
import requests
from requests.auth import HTTPBasicAuth
response = requests.get('http://httpbin.org/basic-auth/user/pass', auth=HTTPBasicAuth('user', 'pass'))
通过捕获各种异常,处理请求过程中可能出现的错误。
import requests
from requests.exceptions import Timeout, ConnectionError
try:
response = requests.get('http://httpbin.org/get', timeout=0.5)
except Timeout:
print('请求超时')
except ConnectionError:
print('连接错误')
支持使用第三方库实现请求的自动重试,确保请求的稳定性。
支持SSL证书验证,可以通过verify参数进行控制。
import requests
response = requests.get('https://httpbin.org', verify=False)
在需要时,可以忽略证书验证或配置自定义的证书文件,保证请求的安全性。