爬蟲與數據分析結合案例:中國大學排名爬取與分析全流程
一、案例背景與目標
本案例以高三網中國大學排名(網址:2021中國的大學排名一覽表_高三網)為數據源,完成從數據爬取到分析可視化的全流程實踐。主要目標包括:
- 爬取學校名稱、總分、全國排名、星級排名、辦學層次等信息
- 對爬取的數據進行預處理(處理缺失值)
- 通過可視化圖表分析學校星級分布情況
二、數據爬取實現
1. 核心步驟
爬取過程分為三個關鍵環節:獲取網頁內容、解析數據、保存為 CSV 文件。
(1)獲取網頁內容
使用requests
庫發送 HTTP 請求,處理編碼和異常:
import requestsdef get_html(url, time=3):try:r = requests.get(url, timeout=time)r.encoding = r.apparent_encoding # 自動識別編碼r.raise_for_status() # 狀態碼非200時拋出異常return r.textexcept Exception as error:print(error)
(2)解析網頁數據
用BeautifulSoup
解析 HTML,通過 CSS 選擇器定位表格數據:
from bs4 import BeautifulSoupdef parser(html):soup = BeautifulSoup(html, "lxml")out_list = []for row in soup.select("table>tbody>tr"): # 遍歷表格行td_html = row.select("td") # 獲取單元格row_data = [td_html[1].text.strip(), # 學校名稱td_html[2].text.strip(), # 總分td_html[3].text.strip(), # 全國排名td_html[4].text.strip(), # 星級排名td_html[5].text.strip() # 辦學層次]out_list.append(row_data)return out_list
(3)保存為 CSV 文件
使用csv
模塊將數據寫入文件:
import csvdef save_csv(item, path):with open(path, "wt", newline="", encoding="utf-8") as f:csv_write = csv.writer(f)csv_write.writerows(item) # 批量寫入數據
(4)主程序調用
if __name__ == "__main__":url = "http://www.bspider.top/gaosan/"html = get_html(url)out_list = parser(html)save_csv(out_list, "school.csv")
三、數據預處理:處理缺失值
爬取的school.csv
中 “總分” 列存在空值,需用 Pandas 處理,提供四種方案:
1. 刪除含空值的行
import pandas as pd
df = pd.read_csv("school.csv")
new_df = df.dropna() # 直接刪除含空值的行
print(new_df.to_string())
2. 用指定內容替換空值
df.fillna("暫無分數信息", inplace=True) # 統一替換為文本
3. 用均值替換空值
x = df["總分"].mean() # 計算總分均值
df["總分"].fillna(x, inplace=True) # 填充空值
4. 用中位數替換空
x = df["總分"].median() # 計算總分中位數
df["總分"].fillna(x, inplace=True)
四、數據分析與可視化
1. 數據概況
共爬取 820 所學校,星級分布如下:
- 8 星:8 所
- 7 星:16 所
- 6 星:36 所
- 5 星:59 所
- 4 星:103 所
- 3 星:190 所
- 2 星:148 所
- 1 星:260 所
2. 可視化圖表
(1)柱形圖:展示不同星級學校數量
import matplotlib.pyplot as plt
import numpy as npx = np.array(["8星", "7星", "6星", "5星", "4星", "3星", "2星", "1星"])
y = np.array([8, 16, 36, 59, 103, 190, 148, 260])plt.title("不同星級的學校個數")
plt.rcParams["font.sans-serif"] = ["SimHei"] # 解決中文顯示問題
plt.bar(x, y) # 垂直柱形圖
# 或使用水平柱形圖:plt.barh(x, y)
plt.show()
(2)餅圖:展示星級占比
y = np.array([1, 2, 4.5, 7.2, 12.5, 23.1, 18, 31.7]) # 各星級占比(%)
plt.pie(y,labels=["8星", "7星", "6星", "5星", "4星", "3星", "2星", "1星"]
)
plt.title("不同星級的學校個數占比")
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.show()
五、案例總結
本案例完整演示了 “爬蟲 - 預處理 - 分析” 的閉環流程:
- 爬蟲階段:通過
requests
和BeautifulSoup
高效獲取結構化表格數據 - 預處理階段:針對缺失值提供多種處理方案,根據實際需求選擇(如均值填充適合對稱分布數據)
- 可視化階段:用柱形圖展示數量差異,餅圖展示占比關系,直觀呈現數據特征
通過該案例可掌握數據從獲取到分析的核心技能,為更復雜的數據分析項目奠定基礎。