循环调用driver.get()触发ConnectionRefusedError[Errno61]问题求助
解决循环遍历URL抓取商品时的ConnectionRefusedError问题
问题根源分析
你的代码出现连接拒绝错误,核心原因在于:
- 错误复用/销毁浏览器实例:循环内使用
with webdriver as driver会在每次循环结束后自动调用driver.quit()关闭浏览器,第二次循环时浏览器进程已终止,无法建立新连接。 - 重复初始化driver与模块覆盖:代码中先创建
driver实例,又将webdriver(模块名)赋值为Chrome实例,导致后续调用逻辑混乱。 - 依赖固定sleep而非显式等待:硬编码的
time.sleep无法保证元素加载完成,同时可能导致请求节奏不合理触发反爬。 - 无异常处理机制:单个URL抓取失败会直接中断整个流程。
修正后的可行代码
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC import pandas as pd import csv import time # 全局初始化Chrome浏览器,仅创建一次实例 chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36') s = Service(executable_path="/Users/Downloads/chromedriver") driver = webdriver.Chrome(service=s, options=chrome_options) wait = WebDriverWait(driver, 15) # 设置全局显式等待超时 source = 'offsaks.csv' data_list = [] try: # 读取CSV中的URL列表 with open(source, 'rt', encoding='utf-8-sig') as csvfile: readCSV = csv.reader(csvfile, delimiter=',') next(readCSV) # 跳过表头 urls = [row[1] for row in readCSV] # 循环处理每个URL for idx, url in enumerate(urls, 1): print(f"处理第{idx}个URL: {url}") try: driver.get(url) # 显式等待价格元素加载完成 price = wait.until( EC.presence_of_element_located((By.XPATH, '//*[@id="maincontent"]/div[1]/div[2]/div[3]/div/div[1]/div/div/div/span/span[1]/span[2]/span/span')) ).text.strip() # 显式等待标题元素加载完成 title = wait.until( EC.presence_of_element_located((By.XPATH, '//*[@id="maincontent"]/div[1]/div[2]/div[3]/div/h1/span[2]/span/span')) ).text.strip() data_list.append({ 'URL': url, 'Title': title, 'Price': price }) print(f"抓取成功: {title} - {price}") # 控制请求节奏,避免反爬 time.sleep(3) except Exception as e: print(f"处理URL失败: {str(e)}") data_list.append({ 'URL': url, 'Title': '抓取失败', 'Price': '抓取失败', 'Error': str(e) }) continue finally: # 无论流程是否成功,最终关闭浏览器 driver.quit() print("浏览器已关闭") # 保存结果到CSV df = pd.DataFrame(data_list) df.to_csv('test_1.csv', index=False) print("结果已保存至test_1.csv")
关键修改说明
- 单实例复用浏览器:在循环外创建浏览器实例,循环内持续复用,避免重复启动/关闭导致的连接问题。
- 显式等待替代固定sleep:通过
WebDriverWait等待元素加载完成,既保证稳定性又节省不必要的等待时间。 - 异常捕获与容错:单个URL抓取失败时记录错误信息,不中断整个循环流程。
- 反爬优化:添加User-Agent、控制请求间隔,降低被目标网站拦截的概率。
- 结果完整性:保存原始URL与错误信息,方便后续排查问题。
内容的提问来源于stack exchange,提问作者Andrea C
相关产品推荐
相关产品推荐

