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

使用Selenium遍历站点分页URL触发InvalidSessionIdException如何解决

报错原因

  • 核心错误是driver.close()放在了for循环的finally代码块中,第一次循环执行结束后浏览器会话就被关闭,后续循环调用driver.get()时已经没有有效会话,直接抛出InvalidSessionIdException
  • 次要问题1:ChromeOptions配置定义在driver初始化之后,配置没有生效,需要将options参数传入driver初始化语句
  • 次要问题2:当页面没有匹配到albumListGenre元素时,genre变量未定义,直接追加genre.text会抛出变量未定义错误
  • 次要问题3:高版本Selenium已废弃find_elements_by_class_name等旧式元素定位写法,以及executable_path参数的直接传值方式,建议改用标准写法

修复后代码

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

# 先定义配置再初始化driver
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors-spki-list')
options.add_argument('--ignore-ssl-errors')

# 把配置传入driver初始化
driver = webdriver.Chrome(executable_path=r'C:\MYPATH\chromedriver.exe', options=options)

title_list = []
date_list  = []
genre_list = []

for page_num in range(1, 11):
    url = r"https://www.albumoftheyear.org/list/1500-rolling-stones-500-greatest-albums-of-all-time-2020/{}".format(page_num)
    driver.get(url)

    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "centerContent"))
        )
        # 改用标准定位写法
        albumlistrow = element.find_elements(By.CLASS_NAME, 'albumListRow')
        for a in albumlistrow:
            title = a.find_element(By.CLASS_NAME, 'albumListTitle')
            date = a.find_element(By.CLASS_NAME, 'albumListDate')
            # 初始化genre默认值,避免未定义报错
            genre_text = ''
            try:
                genre = a.find_element(By.CLASS_NAME, 'albumListGenre')
                genre_text = genre.text
            except NoSuchElementException:
                pass
            title_list.append(title.text)
            date_list.append(date.text)
            genre_list.append(genre_text)
    except Exception as e:
        print(f"第{page_num}页爬取出错:{str(e)}")

# 所有页面爬取完成后再关闭浏览器会话
driver.close()

df = pd.DataFrame(list(zip(title_list,date_list,genre_list)), columns=['title', 'date','genre'])
df.head()

如果使用Selenium 4.6+版本,无需手动下载chromedriver,也可以改用Service写法初始化driver:

from selenium.webdriver.chrome.service import Service
driver = webdriver.Chrome(service=Service(), options=options)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:45:04