You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Selenium遍历URL列表构建爬虫时遭遇MaxRetryError阻塞问题求助

问题原因分析

嘿,这个MaxRetryError的症结一眼就能看出来!你在for循环的finally块里直接关闭了CSV文件和退出了浏览器驱动——第一次循环处理完第一个URL后,driver.quit()已经把Chrome驱动彻底关掉了,第二次循环再调用driver.get(i)时,根本找不到可用的驱动连接,自然就抛出了“目标机器主动拒绝连接”的错误。另外还有个小问题:你嵌套遍历offresoffres2会导致数据重复写入,比如每个职位信息会和所有合同类型配对,这肯定不是你想要的结果。

解决方案与优化后的代码

我给你整理了修复后的代码,同时做了几个关键优化:

  • 把资源关闭操作移到循环外,确保所有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

火山引擎 最新活动