本文目录导读:

我来帮你写一个通用的API数据拉取脚本,这里提供不同语言的版本:
Python版本(最常用)
基础版 - 使用requests库
import requests
import json
import time
from typing import Dict, List, Any
def fetch_api_data(url: str, method: str = 'GET', headers: Dict = None,
params: Dict = None, data: Dict = None) -> Dict:
"""
通用API数据拉取函数
Args:
url: API地址
method: 请求方法 (GET/POST/PUT/DELETE)
headers: 请求头
params: URL参数
data: POST请求体数据
Returns:
API返回的JSON数据
"""
try:
if method.upper() == 'GET':
response = requests.get(url, headers=headers, params=params, timeout=10)
elif method.upper() == 'POST':
response = requests.post(url, headers=headers, json=data, timeout=10)
elif method.upper() == 'PUT':
response = requests.put(url, headers=headers, json=data, timeout=10)
elif method.upper() == 'DELETE':
response = requests.delete(url, headers=headers, timeout=10)
else:
raise ValueError(f"不支持的请求方法: {method}")
response.raise_for_status() # 检查HTTP错误
return response.json()
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
return None
# 使用示例
if __name__ == "__main__":
# 示例1: 简单的GET请求
url = "https://api.example.com/users"
headers = {
"Authorization": "Bearer your_token_here",
"Content-Type": "application/json"
}
params = {"page": 1, "limit": 10}
data = fetch_api_data(url, headers=headers, params=params)
if data:
print(json.dumps(data, indent=2, ensure_ascii=False))
带分页的高级版
import requests
import time
from typing import Generator, Dict, Any
class APIClient:
"""API客户端,支持分页、重试、速率限制"""
def __init__(self, base_url: str, headers: Dict = None,
max_retries: int = 3, rate_limit: float = 1.0):
self.base_url = base_url
self.headers = headers or {}
self.max_retries = max_retries
self.rate_limit = rate_limit # 请求间隔(秒)
self.session = requests.Session()
self.last_request_time = 0
def _wait_for_rate_limit(self):
"""控制请求频率"""
elapsed = time.time() - self.last_request_time
if elapsed < self.rate_limit:
time.sleep(self.rate_limit - elapsed)
self.last_request_time = time.time()
def _request(self, endpoint: str, method: str = 'GET', **kwargs) -> Dict:
"""发送请求并处理重试"""
url = f"{self.base_url}/{endpoint.lstrip('/')}"
for attempt in range(self.max_retries):
try:
self._wait_for_rate_limit()
if method.upper() == 'GET':
response = self.session.get(url, headers=self.headers, **kwargs)
elif method.upper() == 'POST':
response = self.session.post(url, headers=self.headers, **kwargs)
else:
raise ValueError(f"不支持的方法: {method}")
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
if attempt == self.max_retries - 1:
raise # 最后一次重试失败,抛出异常
print(f"请求失败,重试中... (尝试 {attempt + 1}/{self.max_retries})")
time.sleep(2 ** attempt) # 指数退避
def get_paginated_data(self, endpoint: str, params: Dict = None,
page_key: str = 'page',
data_key: str = 'data') -> Generator[Dict, None, None]:
"""
获取分页数据
Args:
endpoint: API端点
params: 请求参数
page_key: 分页参数名
data_key: 数据在响应中的键名
"""
params = params or {}
page = 1
total_pages = None
while total_pages is None or page <= total_pages:
params[page_key] = page
response = self._request(endpoint, params=params)
if total_pages is None:
# 尝试获取总页数,不同API可能有不同的字段名
total_pages = response.get('total_pages') or \
response.get('totalPages') or \
response.get('pages') or 1
# 提取数据
data = response.get(data_key) or response.get('results') or response.get('items')
if data:
for item in data:
yield item
page += 1
# 使用示例
if __name__ == "__main__":
client = APIClient(
base_url="https://api.example.com",
headers={"Authorization": "Bearer your_token"},
rate_limit=0.5 # 每秒最多2个请求
)
# 获取所有用户数据
for user in client.get_paginated_data(
endpoint="users",
params={"limit": 50},
page_key="page",
data_key="users"
):
print(f"用户: {user['name']} - {user['email']}")
Node.js版本
// 使用 axios
const axios = require('axios');
async function fetchAPIData(url, options = {}) {
try {
const {
method = 'GET',
headers = {},
params = {},
data = {}
} = options;
const config = {
method: method.toLowerCase(),
url,
headers: {
'Content-Type': 'application/json',
...headers
},
timeout: 10000
};
if (method.toUpperCase() === 'GET') {
config.params = params;
} else {
config.data = data;
}
const response = await axios(config);
return response.data;
} catch (error) {
if (error.response) {
console.error(`HTTP错误: ${error.response.status}`);
console.error('响应数据:', error.response.data);
} else if (error.request) {
console.error('无响应:', error.message);
} else {
console.error('请求配置错误:', error.message);
}
return null;
}
}
// 使用示例
async function main() {
const url = 'https://api.example.com/users';
const options = {
headers: {
'Authorization': 'Bearer your_token_here'
},
params: {
page: 1,
limit: 10
}
};
const data = await fetchAPIData(url, options);
if (data) {
console.log(JSON.stringify(data, null, 2));
}
}
main();
Shell脚本版本(使用curl)
#!/bin/bash
# API配置
API_URL="https://api.example.com"
API_TOKEN="your_token_here"
# 函数:发送API请求
fetch_api() {
local endpoint=$1
local method=${2:-GET}
local data=${3:-}
local url="${API_URL}/${endpoint}"
local headers=(
"-H" "Authorization: Bearer ${API_TOKEN}"
"-H" "Content-Type: application/json"
)
if [ "$method" = "GET" ]; then
curl -s "${headers[@]}" "$url"
else
curl -s -X "$method" "${headers[@]}" -d "$data" "$url"
fi
}
# 使用示例
echo "获取用户数据..."
fetch_api "users?page=1&limit=10"
安装依赖
Python:
pip install requests
Node.js:
npm install axios # 或者 yarn add axios
使用建议
- 错误处理:始终添加try-catch/finally
- 重试机制:对重要请求实现指数退避重试
- 速率限制:遵守API的调用频率限制
- 日志记录:记录请求和响应,便于调试
- 缓存:对不频繁变化的数据实现缓存
- 配置管理:将URL、Token等配置放在环境变量中
需要根据具体的API文档调整参数和响应处理方式。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播