如何修复运行Selenium代码时ChromeDriver无法启动Chrome浏览器的问题
问题根因排查
- 1 无程序入口:整段代码仅定义了所有工具函数,没有写主动触发执行的入口逻辑,脚本加载完所有函数定义后就直接结束运行,自然不会触发浏览器启动逻辑
- 2 函数调用顺序错误:
scrape函数内前两行先提交了scraper任务,但scraper内部函数是在这两行之后才定义的,调用时scraper还未初始化 - 3 参数名错误:Selenium的
webdriver.Chrome构造函数不存在rpath参数,指定驱动路径需要用executable_path参数,Selenium 4.6+版本后官方内置自动管理驱动,也可以不用手动传路径 - 4 函数入参错误:
scrape函数默认入参scraper=None,提交任务时传入的是未赋值的空参数,没有实际执行逻辑 - 5 逻辑死循环:
scrape函数末尾递归调用自身,一旦触发会无限递归导致栈溢出 - 6 多余导入冲突:开头
from os import link没有实际使用,还和后续代码里的link变量重名,容易触发命名冲突
修复方案
首先调整代码逻辑,补充主入口,修正参数和函数顺序,移除递归逻辑,添加线程池等待逻辑,修复后的代码如下:
from concurrent.futures.thread import ThreadPoolExecutor from selenium.webdriver.chrome.options import Options from selenium import webdriver import time import random import string chromeOptions = Options() chromeOptions.headless = False # 最大线程数可以根据自己设备配置调整,避免开太多导致崩溃 executor = ThreadPoolExecutor(5) def generate_random_string(length): letters = string.ascii_lowercase rand_string = ''.join(random.choice(letters) for i in range(length)) return rand_string # 提取页面所有链接 def getlinks(url): # 新版本Selenium不需要手动传驱动路径,会自动匹配,有需要可以加executable_path参数 driver = webdriver.Chrome(options=chromeOptions) link_list = [] driver.get(url) a_tags = driver.find_elements_by_xpath('.//a') for b in a_tags: link = b.get_attribute("href") if link: link_list.append(link) driver.quit() return link_list # 实际爬取逻辑 def scraper(url): try: driver = webdriver.Chrome(options=chromeOptions) driver.get(url) time.sleep(15) driver.quit() except Exception as e: print(f"访问{url}出错:{e}") def scrape(url): # 这里替换成你自己的目标链接前缀 target_prefix = "替换成你的目标链接前缀" executor.submit(scraper, url) executor.submit(scraper, target_prefix + generate_random_string(10)) if __name__ == '__main__': # 替换成你自己的目标首页链接 target_home_url = "替换成你的目标首页链接" urls = getlinks(target_home_url) # 循环次数可自行调整 for url in urls * 2: scrape(url) # 等待所有线程任务执行完成 executor.shutdown(wait=True)
修复后运行前替换代码里的目标链接前缀和目标首页链接即可正常运行。
内容的提问来源于stack exchange,提问作者kiwi
相关产品推荐
相关产品推荐

