使用Selenium遍历URL列表构建爬虫时遭遇MaxRetryError阻塞问题求助
问题原因分析
嘿,这个MaxRetryError的症结一眼就能看出来!你在for循环的finally块里直接关闭了CSV文件和退出了浏览器驱动——第一次循环处理完第一个URL后,driver.quit()已经把Chrome驱动彻底关掉了,第二次循环再调用driver.get(i)时,根本找不到可用的驱动连接,自然就抛出了“目标机器主动拒绝连接”的错误。另外还有个小问题:你嵌套遍历offres和offres2会导致数据重复写入,比如每个职位信息会和所有合同类型配对,这肯定不是你想要的结果。
解决方案与优化后的代码
我给你整理了修复后的代码,同时做了几个关键优化:
- 把资源关闭操作移到循环外,确保所有URL处理完成后再收尾
- 用
zip()同时遍历职位和合同列表,保证信息一一对应 - 给Cookie弹窗操作加异常捕获,避免弹窗未出现时脚本崩溃
- 替换废弃的旧API写法,移除不必要的
time.sleep改用显式等待
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 import csv options = webdriver.ChromeOptions() options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') PATH = r"C:\Program Files (x86)\chromedriver.exe" # 加r避免Windows转义字符问题 driver = webdriver.Chrome(PATH, options=options) driver.maximize_window() driver.implicitly_wait(30) wait = WebDriverWait(driver, 30) # 循环外打开CSV文件,避免重复创建/关闭 csv_file = open(r'\path_to_folder.csv', 'w', newline='', encoding='utf-8') # 指定utf-8防中文乱码 csv_writer = csv.writer(csv_file) csv_writer.writerow(['titre', 'contrat', 'localisation', 'description']) # 目标URL列表 listurl = [ 'https://candidat.pole-emploi.fr/offres/emploi/horticulteur/s1m1', 'https://candidat.pole-emploi.fr/offres/emploi/ouvrier-agricole/s1m2' ] # 遍历URL列表 for url in listurl: driver.get(url) # 处理Cookie弹窗,加异常捕获避免弹窗未出现时崩溃 try: wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Continuer sans accepter"))).click() wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, "cookie-banner"))) # 等待弹窗消失 except Exception: print("Cookie弹窗未出现或无法点击") # 提取元素 try: zone = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "zone-resultats"))) offres = zone.find_elements(By.CSS_SELECTOR, "div.media-body") offres2 = zone.find_elements(By.CSS_SELECTOR, "div.media-right.media-middle.hidden-xs") # 一一对应遍历职位和合同信息 for offre, offre2 in zip(offres, offres2): titre = offre.find_element(By.CSS_SELECTOR, "h2.t4.media-heading").text localisation = offre.find_element(By.CSS_SELECTOR, "span").text description = offre.find_element(By.CLASS_NAME, "description").text contrat = offre2.find_element(By.CLASS_NAME, "contrat").text print(f"标题:{titre}\n合同:{contrat}\n地点:{localisation}\n描述:{description}\n---") csv_writer.writerow([titre, contrat, localisation, description]) except Exception as ex: print(f"处理URL {url} 时出错:{ex}") # 所有URL处理完成后再关闭资源 csv_file.close() driver.quit()
额外提示
- 路径字符串前加
r可避免Windows下的转义字符解析问题 - 写入CSV时指定
encoding='utf-8'能有效避免中文乱码 - 尽量使用
find_elements(By.XXX, "selector")的新写法,旧的find_elements_by_xxx系列API已经被官方废弃
内容的提问来源于stack exchange,提问作者hug




