Python(7)----小作業之模擬訪問+錯誤總結
API請求與數據分析任務總結文檔
?? 任務概述
任務目標
使用Python的requests庫向公共API發送請求,分析返回的數據結構,并實現完整的異常處理。
使用API
- API地址:
https://jsonplaceholder.typicode.com/posts - 類型: RESTful API
- 方法: GET
- 返回格式: JSON
?? 代碼實現與問題總結
初始代碼問題分析
主要錯誤:類型理解錯誤
# 錯誤代碼
for k in content_response.items['title']:
print(f'標題:{k}')
問題根源:
- 數據結構誤解: 沒有正確理解
response.json()返回的是列表,不是字典 - 方法使用錯誤: 對列表使用了字典的
items()方法 - 語法錯誤:
items['title']語法不正確
正確理解:
# response.json() 返回的數據結構:
[
{
"userId": 1,
"id": 1,
"title": "帖子標題",
"body": "帖子內容"
},
{
"userId": 1,
"id": 2,
"title": "另一個標題",
"body": "另一個內容"
},
# ... 更多帖子
]
修復后的正確代碼
print(f'獲取所有帖子的標題:')
for post in content_response: # post是字典,不是k
print(f'標題:{post.get("title", "")}') # 使用get方法安全訪問
?? 關鍵知識點總結
1. 請求發送與異常處理
import requests
from requests.exceptions import ConnectionError, HTTPError, Timeout
try:
response = requests.get(url=url, timeout=10) # 添加超時
response.raise_for_status() # 自動檢查HTTP狀態碼
# 處理成功響應...
except HTTPError as e:
print(f'HTTP錯誤: {e}')
except ConnectionError as e:
print(f'連接錯誤: {e}')
except Timeout as e:
print(f'請求超時: {e}')
except Exception as e:
print(f'其他異常: {e}')
要點:
- 使用分層異常處理,從具體到一般
response.raise_for_status()自動檢查4xx/5xx錯誤- 設置
timeout避免無限等待
2. 響應數據分析
# 獲取響應狀態
print(f'狀態碼: {response.status_code}')
# 解析JSON數據
content_response = response.json() # 返回的是列表!
# 數據結構分析
print(f'數據總量: {len(content_response)}') # 列表長度
# 訪問單個元素
first_post = content_response[0] # 第一個帖子(字典)
print('第一個帖子詳情:')
for key, value in first_post.items(): # 遍歷字典
print(f'{key}: {value}')
# 提取特定字段
print('所有帖子標題:')
for post in content_response: # 遍歷列表
title = post.get('title', '無標題') # 安全獲取
print(f'標題: {title}')
3. 數據結構理解
response.json()
↓
列表 (List)
↓
[字典1, 字典2, 字典3, ...]
↓
每個字典包含: userId, id, title, body
??? 常見錯誤與解決方案
錯誤1: 混淆列表和字典操作
錯誤: list.items()
解決: 列表沒有items()方法,字典才有
錯誤2: 錯誤的遍歷方式
錯誤: for k in list.items['key']
解決:
# 正確方式1
for item in list:
value = item['key']
# 正確方式2(安全)
for item in list:
value = item.get('key', '默認值')
錯誤3: 缺少錯誤處理
錯誤: 直接訪問不存在的鍵
解決: 使用dict.get(key, default)方法
錯誤4: 字符串引號嵌套
錯誤: print(f'標題:{k.get('title',' ')}')
解決: 使用雙引號或轉義
print(f"標題:{k.get('title', ' ')}") # 外雙內單
?? 數據分析技巧
1. 數據統計
# 基本統計
total_posts = len(content_response)
print(f'帖子總數: {total_posts}')
# 按用戶分組
from collections import defaultdict
user_posts = defaultdict(int)
for post in content_response:
user_posts[post['userId']] += 1
print('各用戶發帖數:')
for user_id, count in user_posts.items():
print(f'用戶 {user_id}: {count} 篇')
2. 數據采樣
# 查看前N個樣本
sample_size = 3
print(f'前{sample_size}個帖子:')
for i, post in enumerate(content_response[:sample_size]):
print(f'{i+1}. {post["title"]}')
3. 字段分析
# 分析所有可用字段
if content_response:
sample_post = content_response[0]
print('可用字段:')
for field in sample_post.keys():
print(f'- {field}')
?? 調試技巧
1. 類型檢查
print(f'響應類型: {type(response.json())}')
print(f'第一個元素類型: {type(content_response[0])}')
2. 數據結構探索
# 查看數據結構
import json
print('完整數據結構:')
print(json.dumps(content_response[0], indent=2, ensure_ascii=False))
3. 逐步調試
# 分步處理,避免一次性操作太多
data = response.json()
print(f"步驟1 - 獲取數據,類型: {type(data)}, 長度: {len(data)}")
first_item = data[0] if data else {}
print(f"步驟2 - 第一個元素類型: {type(first_item)}")
if first_item:
print(f"步驟3 - 可用鍵: {list(first_item.keys())}")
?? 學習收獲
已掌握技能
- ? 請求發送: 使用requests庫發送HTTP請求
- ? 異常處理: 分層處理各種網絡異常
- ? 數據解析: 解析JSON響應數據
- ? 數據結構分析: 理解列表和字典的嵌套結構
- ? 安全訪問: 使用
get()方法避免KeyError - ? 數據遍歷: 正確遍歷復雜數據結構
需要繼續加強
- ?? 類型判斷: 在處理數據前確認數據類型
- ?? 錯誤預防: 添加更多邊界條件檢查
- ?? 代碼優化: 提高代碼的可讀性和復用性
?? 后續練習建議
基礎鞏固
- 嘗試其他API端點(如
/users,/comments) - 添加參數發送請求(如
?userId=1) - 實現數據過濾和搜索功能
進階挑戰
- 封裝為可復用的函數或類
- 添加日志記錄功能
- 實現數據持久化(保存到文件)
- 添加單元測試
這份總結文檔涵蓋了任務的核心知識點和常見問題,建議定期回顧并結合實際項目練習,以鞏固所學內容。

浙公網安備 33010602011771號