You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Selenium从浏览器新标签页中爬取所需目标数据

代码逻辑校验与优化方案

现有代码核心问题

  • 致命逻辑缺陷:调用window.open打开新标签页后,Selenium驱动默认仍绑定原主页面,后续所有元素定位操作都在原页面执行,完全取不到新标签页的社团数据
  • 硬等待稳定性差:全用time.sleep做等待,页面加载速度波动时很容易出现元素找不到的报错,等待时间过长又会浪费运行时间
  • 元素定位脆弱:全部用绝对路径XPath定位元素,前端页面结构稍有调整(比如新增一层容器标签)定位逻辑就会失效
  • 代码冗余严重:同一种提取元素文本的逻辑重复写了9次,后续修改维护成本极高
  • 仅支持单页面爬取:当前逻辑只能爬1个指定社团的信息,没有做主页面所有社团链接的遍历逻辑

优化实现代码

import pandas as pd
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 初始化浏览器
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10) # 最长等待10秒,元素出现就立即执行后续操作

try:
    # 打开主页面
    browser.get("http://event.ybu.edu.tr/kulupler/")
    # 打开新标签页
    browser.execute_script("window.open('http://event.ybu.edu.tr/kulup/afak', 'new window')")
    # 切换到新打开的标签页(核心修复点)
    browser.switch_to.window(browser.window_handles[-1])
    
    # 下滑到底部(适配懒加载内容)
    browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    time.sleep(0.5)

    # 封装统一提取逻辑,减少冗余
    def get_elements_text(by, locator):
        elements = wait.until(EC.presence_of_all_elements_located((by, locator)))
        return [ele.text.strip() for ele in elements]

    # 提取所有数据,替换绝对XPath为更稳定的定位方式
    kulupList = get_elements_text(By.XPATH, "//table//tr[1]/td[2]")
    MailList = get_elements_text(By.CSS_SELECTOR, "#bilgiler > a.btn.bg-orange.btn-social")
    FacebookList = get_elements_text(By.CSS_SELECTOR, "#bilgiler > a.btn.bg-blue.btn-social")
    TwitterList = get_elements_text(By.CSS_SELECTOR, "#bilgiler > a.btn.btn-social.bg-aqua")
    InstagramList = get_elements_text(By.CSS_SELECTOR, "#bilgiler > a.btn.btn-social.bg-light-blue")
    DanismanList = get_elements_text(By.XPATH, "//table//tr[2]/td[2]")
    BaskanList = get_elements_text(By.XPATH, "//table//tr[3]/td[2]")
    UyeList = get_elements_text(By.XPATH, "//table//tr[4]/td[2]")
    EtkinlikList = get_elements_text(By.XPATH, "//table//tr[5]/td[2]")

    # 导出CSV
    liste = {
        'KulupAdi':kulupList,
        'MailAdresi':MailList,
        'FacebookAdresi':FacebookList,
        'TwitterAdresi':TwitterList,
        'InstagramAdresi':InstagramList,
        'AkademikDanisman':DanismanList,
        'KulupBaskani':BaskanList,
        'ToplamUyeSayisi':UyeList,
        'ToplamEtkinlikSayisi':EtkinlikList
    }
    df = pd.DataFrame(data = liste)
    df.to_csv("AYBU.csv", index=False, encoding='utf-8-sig')

finally:
    browser.quit()

批量爬取拓展说明

如果需要爬取全站所有社团的信息,只需要在打开主页面后先提取所有社团的详情页链接,再循环遍历每个链接切换标签页爬取即可,无需手动拼接单个社团的访问地址。

内容的提问来源于stack exchange,提问作者codesfullinmymind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:45:09