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

