You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium加载链接出错时如何跳过当前站点,持续完成批量网页爬取任务

解决Selenium批量爬取时临时错误中断流程的问题

看起来你遇到了批量爬取时最头疼的问题之一——单个链接的临时错误搞砸了整个流程!别担心,我们可以通过异常捕获+容错处理来解决这个问题,让你的爬虫自动跳过故障链接,继续跑完全程。

核心思路:用try-except包裹爬取逻辑

Python的try-except块是处理这类问题的核心,它能捕获代码执行中出现的异常,让你决定是重试还是直接跳过,而不是让程序崩溃。结合你的场景,我们可以分层捕获不同类型的错误,让流程更健壮。

改进后的完整代码示例

先修正你原代码里的小拼写错误(huis_html应该是house_html),然后加入完整的容错逻辑:

from selenium.common.exceptions import WebDriverException
import requests
from bs4 import BeautifulSoup
import time

# 初始化Chrome驱动(示例)
from selenium import webdriver
driver = webdriver.Chrome()
driver.set_page_load_timeout(30)  # 设置页面加载超时,避免无限等待

for index, house in enumerate(all_nd):
    try:
        # 先做HEAD请求检查,加上超时避免卡住,允许重定向
        head_response = requests.head(house, timeout=10, allow_redirects=True)
        if head_response.status_code == 200:
            # 加载页面时捕获Selenium的所有异常
            driver.get(house)
            house_html = driver.page_source
            house_soup = BeautifulSoup(house_html, "html.parser")  # 指定解析器避免警告
            
            # ----------------------
            # 这里写你处理house_soup的业务逻辑
            # ----------------------
            
            print(f"✅ 成功处理第{index+1}/{len(all_nd)}个链接: {house}")
        else:
            print(f"⚠️ HEAD请求返回{head_response.status_code},跳过链接: {house}")
    
    # 捕获requests相关的异常(比如连接超时、DNS解析失败等)
    except requests.exceptions.RequestException as e:
        print(f"❌ HEAD请求失败,跳过链接: {house},错误: {str(e)}")
        # 可选:记录失败链接到文件,后续单独处理
        # with open("failed_links.txt", "a", encoding="utf-8") as f:
        #     f.write(f"{house}\tHEAD请求错误: {str(e)}\n")
    
    # 捕获Selenium的所有WebDriver异常(包括你遇到的SSL错误)
    except WebDriverException as e:
        print(f"❌ 页面加载失败,跳过链接: {house},错误: {str(e)}")
        # 可选:尝试重试1-2次,避免临时网络波动导致失败
        # retry_count = 2
        # for _ in range(retry_count):
        #     time.sleep(2)
        #     try:
        #         driver.get(house)
        #         house_html = driver.page_source
        #         house_soup = BeautifulSoup(house_html, "html.parser")
        #         # 重新处理业务逻辑
        #         print(f"🔄 重试后成功处理链接: {house}")
        #         break
        #     except WebDriverException:
        #         continue
    
    # 捕获其他未预见的异常,兜底用
    except Exception as e:
        print(f"❌ 处理链接时发生未知错误,跳过链接: {house},错误: {str(e)}")
    
    # 可选:添加短暂延迟,避免被目标网站反爬,同时减少网络压力
    time.sleep(1)

# 爬取结束后关闭驱动
driver.quit()

关键改进点详解

  1. 分层异常捕获:

    • 先处理requests相关的错误(比如HEAD请求超时、连接失败)
    • 再处理Selenium的WebDriverException(包括你遇到的ERR_SSL_BAD_RECORD_MAC_ALERT这类SSL错误)
    • 最后用通用Exception兜底,确保任何意外错误都不会中断循环
  2. 超时设置:

    • 给requests.head加上timeout=10,避免某个链接迟迟没有响应卡住整个流程
    • 给driver设置page_load_timeout=30,防止页面无限加载
  3. 可选重试机制:
    对于临时的网络波动或SSL错误,可以尝试重试1-2次(代码里注释掉的部分),提升爬取成功率,不用直接放弃这个链接

  4. 进度与错误日志:
    用enumerate打印当前处理的进度,加上成功/失败的标识,方便你跟踪爬取状态,也能快速定位出问题的链接

额外的长期爬取建议

因为你要爬取13000个链接,属于长时间任务,还有几个小技巧能让爬虫更稳定:

  • 定期重启driver:浏览器运行久了会有内存泄漏,每处理100-200个链接就重启一次driver:

    if (index + 1) % 200 == 0:
        driver.quit()
        time.sleep(2)
        driver = webdriver.Chrome()
        driver.set_page_load_timeout(30)
    
  • 记录失败链接:把所有失败的链接写入文本文件,之后可以单独排查或重新爬取

这样修改后,你的爬虫就能稳稳地跑完13000个链接,再也不会因为单个临时错误而前功尽弃了!

内容的提问来源于stack exchange,提问作者Max Lonysa Muller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 15:22:52