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()
关键改进点详解
分层异常捕获:
- 先处理
requests相关的错误(比如HEAD请求超时、连接失败) - 再处理Selenium的
WebDriverException(包括你遇到的ERR_SSL_BAD_RECORD_MAC_ALERT这类SSL错误) - 最后用通用
Exception兜底,确保任何意外错误都不会中断循环
- 先处理
超时设置:
- 给
requests.head加上timeout=10,避免某个链接迟迟没有响应卡住整个流程 - 给driver设置
page_load_timeout=30,防止页面无限加载
- 给
可选重试机制:
对于临时的网络波动或SSL错误,可以尝试重试1-2次(代码里注释掉的部分),提升爬取成功率,不用直接放弃这个链接进度与错误日志:
用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
相关产品推荐
相关产品推荐

