Советы по автоматизации Python, часть 22 — Получение данных о рейтинге китайских университетов

фон

[Рейтинг мягких наук] Последний рейтинг китайских университетов мягких наук за 2023 год | Рейтинг лучших университетов Китая (shanghairanking.cn)

Сканируйте данные всех университетов на этом веб-сайте, включая название исследования, уровень, регион, баллы и другую информацию: ['уровень школы', 'уровень дисциплины', 'школьные ресурсы', 'размер и структура факультета', 'подготовка талантов'. , «научные исследования», «служение обществу», «высокие таланты», «крупные проекты и достижения», «международная конкурентоспособность»]

Идеи

Для динамических веб-страниц нет возможности использовать запрос для получения файла веб-страницы, а затем проанализировать его с помощью BS, и нет интерфейса json... мы можем только динамически получить его с помощью js, а затем очистить его или использовать библиотека selenium для имитации кликов.

Для имитации кликов я использую библиотеку Selenium. Это немного медленно, но работает....

(Это самый проблемный веб-сайт, который я когда-либо сканировал. Я долго боролся со следующими тремя кнопками... Я не мог нажать на них после смены страниц. Он постоянно говорил, что что-то их блокирует. Я мог просканировать только один элемент. и перезапустите браузер один раз.)


Подготовить

Библиотеке селена требуется драйвер браузера для имитации кликов.

Здесь используется драйвер Edge, который необходимо загрузить с официального сайта: Microsoft Edge WebDriver — Microsoft Edge Developer.

 Затем поместите файл msedgedriver.exe и код в каталог для запуска.


код

Импортный пакет:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
    
from bs4 import BeautifulSoup
import os
import pandas as pd
from time import sleep

Код краулера:

url = "https://www.shanghairanking.cn/rankings/bcur/2023"
df_all=pd.DataFrame()

options=['办学层次','学科水平','办学资源','师资规模与结构','人才培养','科学研究','服务社会','高端人才','重大项目与成果','国际竞争力']

for i in range(len(options)):
    research_name=options[i]
    print(research_name) 
    
    #启动浏览器
    driver = webdriver.Edge("msedgedriver")
    driver.implicitly_wait(2)
    driver.get(url)
    sleep(2)  
    
    #点击选项
    bu=driver.find_element(By.XPATH, '//*[@id="content-box"]/div[2]/table/thead/tr/th[6]/div/div[1]/div[1]')
    bu.click()
    fund = driver.find_element(By.XPATH,f'//*[@id="content-box"]/div[2]/table/thead/tr/th[6]/div/div[1]/div[2]/ul/li[{i+1}]')
    fund.click() 
    df_oneresearch=pd.DataFrame()
    
    #遍历20面
    for page in range(20):
        # 定位到表格元素
        table = driver.find_element(By.XPATH, '//*[@id="content-box"]/div[2]/table/tbody')
        data_list = []
        rows = table.find_elements(By.TAG_NAME, "tr")[:]
        for row in rows:
            
            cells = row.find_elements(By.TAG_NAME, "td")
            rank = cells[0].text.strip()
            university_name = cells[1].find_element(By.CLASS_NAME, "name-cn").text.strip()
            english_name = cells[1].find_element(By.CLASS_NAME, "name-en").text.strip()
            tags = ""
            #tages = cells[1].find_element(By.CLASS_NAME, "tags").text.strip()
            try:
                tags = cells[1].find_element(By.CLASS_NAME, "tags").text.strip()
            except Exception as e:
                pass
                #print(f'{university_name}报错了')
            location = cells[2].text.strip()
            category = cells[3].text.strip()
            score = cells[4].text.strip()
            research = cells[5].text.strip()
            data_dict = {"排名": rank,"中文名)": university_name,"英文名": english_name,"层次标签" : tags, "省市": 
                         location,"类型": category,"总分": score,research_name: research}
            data_list.append(data_dict)
            df_one=pd.DataFrame(data_list)
        df_oneresearch=pd.concat([df_oneresearch,df_one],axis=0,ignore_index=True)
            
        print(f'{page+1}页爬取完成')
        # 定位到下一页的元素
        next_page_element = driver.find_element(By.CLASS_NAME, "ant-pagination-next")
        next_page_element.click()
    
    for col in df_oneresearch.columns:
        df_all[col]=df_oneresearch[col]
        
    print('2s后关掉浏览器开始下一个')
    sleep(2) 
    driver.quit()

Проверять:

df_all.head()

Конечно, полученные данные можно сохранить следующим образом:
 

df_all.to_excel('高校数据.xlsx',index=False)

Supongo que te gusta

Origin blog.csdn.net/weixin_46277779/article/details/132647222
Recomendado
Clasificación