主要获取页面五个字段;分别是:校名、地区、管理部门、类别、双一流
在这里有一个坑就是后续的一些院校在类别和双一流这个标签上面都没有这个值,所以使用try...except...来进行判断的话会很慢很慢,如果有解决问题的小伙伴欢迎留言一起探讨解决方案!
这个项目采用的是Selenium自动翻页获取数据,软科这个网站的所有数据都在一个JSON文件里面,但是在抓包的时候会发现有个参数是随机变化的,除非弄明白这个参数是如何生成的否则很难获取到,直接上代码(ps:真的很慢!!!)
import csv
import time
import pandas as pd
from selenium import webdriver
from selenium.common import NoSuchElementException
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://www.shanghairanking.cn/institution")
# 等待浏览器加载渲染页面
driver.implicitly_wait(2)
# 下拉页面到底部
js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight'
driver.execute_script(js)
college_header = ['校名', '地区', '管理部门', '类别', '双一流']
def get_college_data():
college_data = []
divs = driver.find_elements(By.CSS_SELECTOR, ".univ-main")
for div in divs:
# 校名
college_name = div.find_element(By.XPATH, "./div/div[2]/div[1]/span").text
# 地区
college_area = div.find_element(By.XPATH, "./div/div[2]/div[3]/span[1]").text
# 管理部门
college_section = div.find_element(By.XPATH, "./div/div[2]/div[3]/span[2]").text
# 类别
try:
college_category = div.find_element(By.XPATH, "./div/div[2]/div[3]/span[3]").text
except NoSuchElementException:
college_category = "Null"
# 双一流
try:
college_grade = div.find_element(By.XPATH, "./div/div[2]/div[3]/span[4]").text
except NoSuchElementException:
college_grade = "Null"
college_data.append([
college_name,
college_area,
college_section,
college_category,
college_grade
])
college_data = pd.DataFrame(columns=college_header, data=college_data)
return college_data
college_datas = []
for page in range(1,10):
time.sleep(1)
print(f"正在获取{page}页!")
data = get_college_data()
college_datas.append(data)
driver.find_element(By.CLASS_NAME, "ant-pagination-next").click()
csv_file = pd.concat(college_datas, ignore_index=True)
csv_file.to_csv('college_data.csv', mode='w', index=False, sep=',')