Files
MoFin/venv/lib/python3.12/site-packages/akshare/request.py
T
知微 fa45d8aa5f fix: 小果地址统一node122(兼容LAN+EasyTier)
- health_checklist.json: 192.168.1.122→node122
- ocr_client.py: docstring IP→node122
- docs/market-data-requirements.md: IP→node122
- 所有API调用通过ProxyHandler({})绕过系统代理
  Privoxy对node122:18003返回500,直连正常
2026-06-30 02:56:35 +08:00

118 lines
4.2 KiB
Python

import time
import requests
from requests.exceptions import RequestException
from akshare.exceptions import NetworkError, APIError, RateLimitError, DataParsingError
from akshare.utils.context import config
def make_request_with_retry_json(
url, params=None, headers=None, proxies=None, max_retries=3, retry_delay=1
):
"""
发送 HTTP GET 请求,支持重试机制和代理设置。
:param url: 请求的 URL
:param params: URL 参数 (可选)
:param headers: 请求头 (可选)
:param proxies: 代理设置 (可选)
:param max_retries: 最大重试次数
:param retry_delay: 初始重试延迟(秒)
:return: 解析后的 JSON 数据
"""
if proxies is None:
proxies = config.proxies
for attempt in range(max_retries):
try:
response = requests.get(
url, params=params, headers=headers, proxies=proxies
)
if response.status_code == 200:
try:
data = response.json()
if not data:
raise DataParsingError("Empty response data")
return data
except ValueError:
raise DataParsingError("Failed to parse JSON response")
elif response.status_code == 429:
raise RateLimitError(
f"Rate limit exceeded. Status code: {response.status_code}"
)
else:
raise APIError(
f"API request failed. Status code: {response.status_code}"
)
except (RequestException, RateLimitError, APIError, DataParsingError) as e:
if attempt == max_retries - 1:
if isinstance(e, RateLimitError):
raise
elif isinstance(e, (APIError, DataParsingError)):
raise
else:
raise NetworkError(
f"Failed to connect after {max_retries} attempts: {str(e)}"
)
time.sleep(retry_delay)
retry_delay *= 2 # 指数退避策略
raise NetworkError(f"Failed to connect after {max_retries} attempts")
def make_request_with_retry_text(
url, params=None, headers=None, proxies=None, max_retries=3, retry_delay=1
):
"""
发送 HTTP GET 请求,支持重试机制和代理设置。
:param url: 请求的 URL
:param params: URL 参数 (可选)
:param headers: 请求头 (可选)
:param proxies: 代理设置 (可选)
:param max_retries: 最大重试次数
:param retry_delay: 初始重试延迟(秒)
:return: 解析后的 JSON 数据
"""
if proxies is None:
proxies = config.proxies
for attempt in range(max_retries):
try:
response = requests.get(
url, params=params, headers=headers, proxies=proxies
)
if response.status_code == 200:
try:
data = response.text
if not data:
raise DataParsingError("Empty response data")
return data
except ValueError:
raise DataParsingError("Failed to parse JSON response")
elif response.status_code == 429:
raise RateLimitError(
f"Rate limit exceeded. Status code: {response.status_code}"
)
else:
raise APIError(
f"API request failed. Status code: {response.status_code}"
)
except (RequestException, RateLimitError, APIError, DataParsingError) as e:
if attempt == max_retries - 1:
if isinstance(e, RateLimitError):
raise
elif isinstance(e, (APIError, DataParsingError)):
raise
else:
raise NetworkError(
f"Failed to connect after {max_retries} attempts: {str(e)}"
)
time.sleep(retry_delay)
retry_delay *= 2 # 指数退避策略
raise NetworkError(f"Failed to connect after {max_retries} attempts")