怎么用python爬取中国大学排名网站排名信息

发布时间:2022-01-27 13:26:53 作者:柒染
来源:亿速云 阅读:263
# 怎么用Python爬取中国大学排名网站排名信息

## 前言

在当今信息时代,教育数据的获取和分析变得越来越重要。中国大学排名是学生、家长和教育工作者关注的重要参考指标。本文将详细介绍如何使用Python爬取中国大学排名网站的排名信息,包括数据采集、解析、存储等完整流程。

## 一、准备工作

### 1.1 工具准备
- Python 3.6+
- Requests库(发送HTTP请求)
- BeautifulSoup4或lxml(HTML解析)
- Pandas(数据处理)
- 开发工具:PyCharm/VSCode/Jupyter Notebook

### 1.2 目标网站分析
以"软科中国大学排名"为例(实际使用时请遵守网站robots.txt规定):

https://www.shanghairanking.cn/rankings/bcur/2023


### 1.3 安装依赖库
```bash
pip install requests beautifulsoup4 pandas

二、基础爬虫实现

2.1 发送HTTP请求

import requests

url = "https://www.shanghairanking.cn/rankings/bcur/2023"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
}

response = requests.get(url, headers=headers)
print(response.status_code)  # 检查请求状态

2.2 解析HTML内容

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, 'html.parser')

三、数据提取实战

3.1 分析页面结构

通过浏览器开发者工具(F12)检查元素: - 排名表格通常位于<table><div>标签中 - 每所学校信息可能包含在<tr><li>标签中

3.2 提取表格数据

universities = []
table = soup.find('table', {'class': 'rk-table'})  # 根据实际class调整

for row in table.find_all('tr')[1:]:  # 跳过表头
    cols = row.find_all('td')
    if len(cols) > 3:
        rank = cols[0].text.strip()
        name = cols[1].text.strip()
        score = cols[2].text.strip()
        universities.append({
            '排名': rank,
            '学校名称': name,
            '总分': score
        })

3.3 处理分页数据(示例)

base_url = "https://example.com/rankings?page={}"
for page in range(1, 6):  # 假设有5页
    url = base_url.format(page)
    response = requests.get(url, headers=headers)
    # 解析逻辑...

四、数据存储

4.1 保存为CSV文件

import pandas as pd

df = pd.DataFrame(universities)
df.to_csv('university_ranking.csv', index=False, encoding='utf_8_sig')

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

import pymysql

conn = pymysql.connect(host='localhost', user='root', password='123456', database='rankings')
cursor = conn.cursor()

create_table = """
CREATE TABLE IF NOT EXISTS universities (
    id INT AUTO_INCREMENT PRIMARY KEY,
    rank INT,
    name VARCHAR(100),
    score FLOAT
)
"""
cursor.execute(create_table)

for uni in universities:
    insert_sql = f"INSERT INTO universities (rank, name, score) VALUES ({uni['排名']}, '{uni['学校名称']}', {uni['总分']})"
    cursor.execute(insert_sql)

conn.commit()
conn.close()

五、高级技巧

5.1 处理动态加载内容

当数据通过AJAX加载时,可能需要:

import json

ajax_url = "https://example.com/api/rankings"
params = {"year": 2023, "type": "main"}
response = requests.get(ajax_url, params=params)
data = json.loads(response.text)

5.2 使用Selenium

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
driver = webdriver.Chrome(options=options)

driver.get("https://example.com/dynamic-page")
html = driver.page_source
# 后续解析...
driver.quit()

5.3 反爬虫对策

from fake_useragent import UserAgent
ua = UserAgent()
headers = {'User-Agent': ua.random}
proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'http://10.10.1.10:1080',
}
requests.get(url, proxies=proxies)
import time
time.sleep(random.uniform(1, 3))

六、完整代码示例

import requests
from bs4 import BeautifulSoup
import pandas as pd
import random
import time

def get_rankings(year=2023):
    url = f"https://www.shanghairanking.cn/rankings/bcur/{year}"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)..."
    }
    
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        
        soup = BeautifulSoup(response.text, 'html.parser')
        universities = []
        
        table = soup.find('table', {'class': 'rk-table'})
        for row in table.find_all('tr')[1:]:
            cols = row.find_all('td')
            if len(cols) > 3:
                universities.append({
                    '年份': year,
                    '排名': cols[0].text.strip(),
                    '学校代码': cols[1].text.strip(),
                    '学校名称': cols[2].text.strip(),
                    '省份': cols[3].text.strip(),
                    '总分': cols[4].text.strip()
                })
        
        df = pd.DataFrame(universities)
        df.to_csv(f'university_ranking_{year}.csv', index=False, encoding='utf_8_sig')
        print(f"成功获取{year}年排名数据!")
        
    except Exception as e:
        print(f"获取数据失败: {e}")

if __name__ == '__main__':
    for year in range(2019, 2024):
        get_rankings(year)
        time.sleep(random.uniform(2, 5))

七、注意事项

  1. 遵守法律法规:爬取前检查目标网站的robots.txt文件
  2. 控制请求频率:避免给服务器造成过大压力
  3. 数据使用规范:仅用于个人学习研究,不用于商业用途
  4. 异常处理:添加完善的错误处理机制
  5. 数据更新:定期检查网站结构变化

八、扩展方向

  1. 数据可视化:使用Matplotlib/PyEcharts展示排名变化
  2. 历史数据分析:比较多年排名变化趋势
  3. 多维度分析:结合学科排名、就业数据等
  4. 构建Web应用:使用Flask/Django展示数据

结语

本文详细介绍了使用Python爬取大学排名数据的完整流程。实际应用中,请根据目标网站的具体结构调整代码,并始终遵守网络爬虫道德规范。通过掌握这些技术,你可以轻松获取各种公开教育数据,为学习和研究提供数据支持。

注意:本文示例代码仅供参考,实际使用时请替换为目标网站的真实URL和正确的HTML元素选择器。部分网站可能有反爬机制,建议在合法合规的前提下进行数据采集。 “`

这篇文章共计约1900字,包含了从基础到进阶的完整爬虫实现流程,采用Markdown格式编写,可以直接用于技术博客或文档分享。实际应用时请确保遵守相关网站的使用条款。

推荐阅读:
  1. Python练习【爬取银行网站信息】
  2. Python如何基于requests库爬取网站信息

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

python

上一篇:怎么分析Mysql中的嵌套子查询问题

下一篇:Linux系统怎么格式化USB设备

相关阅读

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

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