您好,登录后才能下订单哦!
# Python如何爬取2020年中国大学排名
## 前言
在当今信息爆炸的时代,数据已成为重要的战略资源。对于教育领域而言,大学排名数据不仅反映了高校的综合实力,也是学生择校、学术研究的重要参考依据。本文将详细介绍如何使用Python爬取2020年中国大学排名数据,并对其进行清洗、分析和可视化展示。
## 一、准备工作
### 1.1 确定数据来源
常见的中国大学排名数据来源包括:
- 软科中国大学排名(ShanghaiRanking)
- 武书连中国大学排行榜
- 校友会中国大学排名
- 中国教育在线等第三方平台
本文以软科2020年中国大学排名为例(假设目标URL为:`https://www.shanghairanking.cn/rankings/bcur/2020`)
### 1.2 技术栈准备
需要安装的Python库:
```python
pip install requests beautifulsoup4 pandas numpy matplotlib
重要注意事项: 1. 检查目标网站的robots.txt文件 2. 设置合理的请求间隔(建议≥3秒) 3. 禁止对服务器造成负担的频繁请求 4. 仅用于个人学习,不进行商业用途
使用浏览器开发者工具(F12)查看: - 排名数据所在的HTML标签结构 - 数据是静态加载还是动态生成 - 是否有分页处理
假设目标页面结构如下:
<table class="ranking-table">
<thead>...</thead>
<tbody>
<tr>
<td>1</td>
<td><a href="/institution/tsinghua-university">清华大学</a></td>
<td>北京</td>
<td>综合</td>
<td>100.0</td>
</tr>
<!-- 更多行 -->
</tbody>
</table>
import requests
from bs4 import BeautifulSoup
url = "https://www.shanghairanking.cn/rankings/bcur/2020"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
}
def get_html(url):
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status()
response.encoding = response.apparent_encoding
return response.text
except Exception as e:
print(f"请求失败: {e}")
return None
html = get_html(url)
def parse_html(html):
soup = BeautifulSoup(html, 'html.parser')
table = soup.find('table', {'class': 'ranking-table'})
universities = []
for row in table.tbody.find_all('tr'):
cols = row.find_all('td')
if len(cols) >= 5:
rank = cols[0].text.strip()
name = cols[1].text.strip()
location = cols[2].text.strip()
category = cols[3].text.strip()
score = cols[4].text.strip()
universities.append({
'排名': rank,
'名称': name,
'省份': location,
'类型': category,
'总分': score
})
return universities
data = parse_html(html)
如果数据分多页显示:
base_url = "https://www.shanghairanking.cn/rankings/bcur/2020?page={}"
all_data = []
for page in range(1, 6): # 假设共5页
url = base_url.format(page)
html = get_html(url)
if html:
page_data = parse_html(html)
all_data.extend(page_data)
time.sleep(3) # 礼貌爬取
import pandas as pd
df = pd.DataFrame(all_data)
df.to_csv('2020中国大学排名.csv', index=False, encoding='utf_8_sig')
import pymysql
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://user:password@localhost:3306/edu_db')
df.to_sql('university_ranking_2020',
con=engine,
if_exists='replace',
index=False)
# 处理缺失值
df = df.dropna()
# 转换数据类型
df['总分'] = df['总分'].astype(float)
# 去除重复值
df = df.drop_duplicates(subset=['名称'])
# 各省份大学数量统计
province_count = df['省份'].value_counts()
# 各类型大学统计
category_count = df['类型'].value_counts()
# 总分分布
score_stats = df['总分'].describe()
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(12, 6))
province_count.plot(kind='bar')
plt.title('2020中国各省份上榜大学数量')
plt.xlabel('省份')
plt.ylabel('数量')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('province_count.png')
plt.figure(figsize=(10, 6))
sns.boxplot(x='类型', y='总分', data=df)
plt.title('不同类型大学得分分布')
plt.xticks(rotation=30)
plt.tight_layout()
plt.savefig('score_by_category.png')
如果数据是AJAX加载:
import json
api_url = "https://www.shanghairanking.cn/api/pub/v1/bcur/2020"
def get_json_data(url):
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json()
return None
json_data = get_json_data(api_url)
# 解析JSON结构提取数据
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get(url)
# 等待元素加载
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "ranking-table"))
html = driver.page_source
driver.quit()
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import matplotlib.pyplot as plt
def main():
# 1. 获取数据
base_url = "https://www.shanghairanking.cn/rankings/bcur/2020?page={}"
headers = {"User-Agent": "Mozilla/5.0..."}
all_data = []
for page in range(1, 6):
url = base_url.format(page)
try:
response = requests.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(response.text, 'html.parser')
table = soup.find('table', {'class': 'ranking-table'})
for row in table.tbody.find_all('tr'):
cols = row.find_all('td')
if len(cols) >= 5:
all_data.append({
'排名': cols[0].text.strip(),
'名称': cols[1].text.strip(),
'省份': cols[2].text.strip(),
'类型': cols[3].text.strip(),
'总分': float(cols[4].text.strip())
})
time.sleep(3)
print(f"已获取第{page}页数据")
except Exception as e:
print(f"第{page}页获取失败: {e}")
# 2. 保存数据
df = pd.DataFrame(all_data)
df.to_csv('2020中国大学排名.csv', index=False, encoding='utf_8_sig')
# 3. 数据分析与可视化
plt.style.use('ggplot')
# 各省份统计
plt.figure(figsize=(12, 6))
df['省份'].value_counts().plot(kind='bar')
plt.title('2020中国各省份上榜大学数量')
plt.savefig('province_count.png')
return df
if __name__ == '__main__':
df = main()
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64)...",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)..."
]
headers = {'User-Agent': random.choice(user_agents)}
proxies = {
'http': 'http://123.123.123.123:8888',
'https': 'https://123.123.123.123:8888'
}
response = requests.get(url, proxies=proxies)
try:
score = float(cols[4].text.strip())
except ValueError:
score = 0.0 # 或使用其他默认值
years = [2018, 2019, 2020]
all_years_data = []
for year in years:
url = f"https://www.shanghairanking.cn/rankings/bcur/{year}"
# 获取并解析数据...
df['年份'] = year
all_years_data.append(df)
combined_df = pd.concat(all_years_data)
def query_university(name):
result = df[df['名称'].str.contains(name)]
if not result.empty:
return result.iloc[0].to_dict()
return None
本文详细介绍了使用Python爬取2020年中国大学排名的完整流程,从网页分析、数据获取到存储分析和可视化展示。通过这个案例,我们不仅可以获得有价值的排名数据,还能掌握实用的网络爬虫技术。需要注意的是,实际应用中应根据目标网站的具体结构调整代码,并始终遵守网络爬虫的道德规范和法律法规。
提示:本文代码示例仅供参考,实际运行时需要根据目标网站的具体结构进行调整。建议在爬取前先与网站管理员确认爬取权限。 “`
注:本文实际约3500字,由于Markdown格式的特殊性,纯文字统计可能存在偏差。如需精确字数,建议将内容粘贴到文字处理软件中进行统计。完整实现时需要考虑目标网站的实际结构,本文示例代码可能需要相应调整。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。