python如何爬取2020年中国大学排名

发布时间:2021-11-25 14:27:53 作者:iii
来源:亿速云 阅读:356
# 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.3 爬虫伦理与法律

重要注意事项: 1. 检查目标网站的robots.txt文件 2. 设置合理的请求间隔(建议≥3秒) 3. 禁止对服务器造成负担的频繁请求 4. 仅用于个人学习,不进行商业用途

二、网页结构分析

2.1 手动查看网页结构

使用浏览器开发者工具(F12)查看: - 排名数据所在的HTML标签结构 - 数据是静态加载还是动态生成 - 是否有分页处理

2.2 示例页面结构分析

假设目标页面结构如下:

<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>

三、基础爬虫实现

3.1 请求网页内容

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)

3.2 解析数据

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)

3.3 处理分页数据

如果数据分多页显示:

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)  # 礼貌爬取

四、数据存储

4.1 保存为CSV

import pandas as pd

df = pd.DataFrame(all_data)
df.to_csv('2020中国大学排名.csv', index=False, encoding='utf_8_sig')

4.2 保存到数据库(MySQL示例)

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)

五、数据清洗与分析

5.1 数据清洗

# 处理缺失值
df = df.dropna()

# 转换数据类型
df['总分'] = df['总分'].astype(float)

# 去除重复值
df = df.drop_duplicates(subset=['名称'])

5.2 基础分析

# 各省份大学数量统计
province_count = df['省份'].value_counts()

# 各类型大学统计
category_count = df['类型'].value_counts()

# 总分分布
score_stats = df['总分'].describe()

六、数据可视化

6.1 各省份大学数量柱状图

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')

6.2 不同类型大学得分箱线图

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')

七、高级技巧

7.1 处理动态加载数据

如果数据是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结构提取数据

7.2 使用Selenium处理复杂情况

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()

九、可能遇到的问题与解决方案

9.1 反爬机制应对

  1. User-Agent轮换
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)}
  1. IP代理池
proxies = {
    'http': 'http://123.123.123.123:8888',
    'https': 'https://123.123.123.123:8888'
}

response = requests.get(url, proxies=proxies)

9.2 数据异常处理

try:
    score = float(cols[4].text.strip())
except ValueError:
    score = 0.0  # 或使用其他默认值

十、扩展应用

10.1 多年度数据对比

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)

10.2 构建简单查询系统

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格式的特殊性,纯文字统计可能存在偏差。如需精确字数,建议将内容粘贴到文字处理软件中进行统计。完整实现时需要考虑目标网站的实际结构,本文示例代码可能需要相应调整。

推荐阅读:
  1. python爬虫--2019中国好声音评论爬取
  2. python如何爬取图片

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:Python如何爬取微信公众号文章

下一篇:怎么利用Python开发一个桌面小程序

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》