基于selenium的异步加载数据爬取——以中国大学排名为例

虽然我也不清楚为什么中国大学的排名还要用异步加载...难道是之前上课爬这玩意爬太多了大伙烦了...

from bs4 import BeautifulSoup
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
# 配置Chrome浏览器选项  
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)  # 让浏览器在后台运行  
# 定义URL  
url = "https://www.shanghairanking.cn/rankings/bcur/2024"
# 初始化浏览器并访问URL  
browser = webdriver.Chrome(options=option)
browser.get(url)
# 初始化列表来存储所有页面的数据  
all_data = []
def getData():
    global all_data  # 使用全局变量来存储数据  
    html = browser.page_source  # 获取当前页面的HTML  
    soup = BeautifulSoup(html, "html.parser")
    tbody = soup.find('tbody')  # 查找tbody元素  
    if tbody:  # 确保tbody存在  
        for tr in tbody.find_all('tr'):  # 查找所有的tr元素  
            if tr.find('td'):  # 确保tr元素包含td元素  
                tds = tr.find_all('td')  # 查找所有的td元素  
                # 提取文本并去除空格,然后将它们添加到all_data列表中  
                all_data.append([td.get_text(strip=True) for td in tds])
            # 爬取数据的函数
def crawl_pages(max_pages):
    current_page = 1  # 当前页码初始化为1  
    while current_page <= max_pages:  # 循环爬取指定数量的页面  
        getData()  # 获取当前页面的数据  
        time.sleep(3)  # 等待3秒  
        # 检查是否有下一页按钮,并点击它(如果有的话)  
        try:
            next_page = browser.find_element(By.CSS_SELECTOR, 'li.ant-pagination-next>a')
            next_page.click()
            current_page += 1  # 成功点击后,增加当前页码  
        except:
            break  # 如果没有下一页按钮,则跳出循环  
# 爬取20页数据
crawl_pages(20)
# 将数据存储到txt文件
def write_to_txt(data, filename='中国大学排名.txt'):
    with open(filename, 'w', encoding='utf-8') as f:
        headers = ["排名", "学校名称", "省市", "类型", "总分"]  # 根据实际网页内容调整表头  
        f.write('\t'.join(headers) + '\n')  # 写入表头  
        for row in data:
            f.write('\t'.join(row) + '\n')  # 写入每一行数据  
# 调用函数将数据写入txt文件
write_to_txt(all_data)
# 关闭浏览器  
browser.quit()

更新:三代,生成excel,去掉了大学名称中的多余字符,并加了筛选特定学校功能

import pandas as pd
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 用户输入检索的大学名称
search_value = input('请输入您想检索的大学名称: ')
# 初始化列表来存储所有页面的数据
all_data = []
# 配置Chrome浏览器选项
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)  # 让浏览器在后台运行
# 定义URL
url = "https://www.shanghairanking.cn/rankings/bcur/2024"
# 初始化浏览器并访问URL
browser = webdriver.Chrome(options=option)
browser.get(url)

def getData(page=1):
    global all_data  # 使用全局变量来存储数据
    html = browser.page_source  # 获取当前页面的HTML
    soup = BeautifulSoup(html, "html.parser")
    tbody = soup.find('tbody')  # 查找tbody元素
    if tbody:  # 确保tbody存在
        for tr in tbody.find_all('tr'):  # 查找所有的tr元素
            if tr.find('td'):  # 确保tr元素包含td元素
                tds = tr.find_all('td')  # 查找所有的td元素
                # 提取每个学校的排名、名称、省市、类型、总分和办学层次
                ranking = tds[0].get_text(strip=True)
                name = tds[1].find(class_="name-cn").get_text(strip=True)
                province = tds[2].get_text(strip=True)
                category = tds[3].get_text(strip=True)
                score = tds[4].get_text(strip=True)
                level = tds[5].get_text(strip=True)
                # 添加到数据列表中
                all_data.append([ranking, name, province, category, score, level])


def crawl_pages(max_pages):
    current_page = 1  # 当前页码初始化为1
    while current_page <= max_pages:  # 循环爬取指定数量的页面
        getData()  # 获取当前页面的数据
        try:
            next_page = browser.find_element(By.CSS_SELECTOR, 'li.ant-pagination-next>a')
            next_page.click()
            current_page += 1  # 成功点击后,增加当前页码
        except:
            break  # 如果没有下一页按钮,则跳出循环

# 爬取20页数据
crawl_pages(20)

# 将数据存入DataFrame
df = pd.DataFrame(all_data, columns=["排名", "学校名称", "省市", "类型", "总分", "办学层次"])
# 将数据写入Excel文件
excel_filename = "中国大学完整排名.xlsx"
df.to_excel(excel_filename, index=False)
# 检索包含输入名称的行
search_df = df[df['学校名称'].str.contains(search_value)]
# 如果存在符合条件的数据,则将其写入新的Sheet中
if not search_df.empty:
    search_sheet_name = search_value + "排名"
    with pd.ExcelWriter(excel_filename, mode='a', engine='openpyxl') as writer:
        search_df.to_excel(writer, sheet_name=search_sheet_name, index=False)
    print(f'包含"{search_value}"的数据已写入Excel中的"{search_sheet_name}"工作表。')
else:
    print(f'未找到包含"{search_value}"的数据。')
# 关闭浏览器
browser.quit()

4-28龙圆芝.py

 

版权声明:
作者:夜阑
链接:http://yelan.xyz/index.php/2024/04/26/%e5%9f%ba%e4%ba%8eselenium%e7%9a%84%e5%bc%82%e6%ad%a5%e5%8a%a0%e8%bd%bd%e6%95%b0%e6%8d%ae%e7%88%ac%e5%8f%96-%e4%bb%a5%e4%b8%ad%e5%9b%bd%e5%a4%a7%e5%ad%a6%e6%8e%92%e5%90%8d%e4%b8%ba/
来源:夜阑的小站
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>