如何使用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
相关产品推荐
相关产品推荐

