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

使用Selenium爬取字幕网站失败求助:超时及批量下载中断问题

问题分析与解决方案

一、TimeoutException 错误的常见诱因

  • 反爬机制触发:该网站大概率能识别Selenium的自动化特征(比如浏览器内置的自动化标识),故意延迟元素加载或阻止渲染。可以修改浏览器参数隐藏自动化痕迹,比如添加--disable-blink-features=AutomationControlled禁用自动化检测,同时更换真实的User-Agent,避免使用Selenium默认标识。
  • 等待逻辑不合理:比如使用presence_of_element_located仅等待元素存在,但实际需要元素可见才能交互,建议改用visibility_of_element_located;另外如果用了动态生成的class/id作为选择器,容易失效,换成更稳定的定位方式(比如基于链接文本的By.LINK_TEXT,或页面层级结构定位)。
  • 网络或服务器延迟:服务器响应慢时,可适当延长等待时间(比如从10秒调整到15秒),或添加重试机制,第一次超时后再尝试等待一次。

二、批量下载第二个文件后中断的原因

  • 频率触发反爬:连续下载操作过于频繁,可能触发网站的IP临时限制或请求拦截。每次下载后添加3-5秒的随机延迟,模拟正常用户的操作间隔。
  • 下载处理逻辑漏洞:Selenium处理下载时,第二个文件可能触发浏览器的下载确认弹窗,或脚本未等待第一个文件下载完成就执行后续操作,导致流程中断。可以配置浏览器自动下载无需弹窗,同时添加文件下载完成的检测逻辑(比如检查目标目录下的文件大小是否稳定)。
  • 页面状态异常:下载后页面可能刷新或跳转,脚本未重新定位元素,导致后续操作找不到目标。每次下载完成后回到列表页面,重新获取下一个下载链接即可。

三、该网站是否可爬?

可以爬取,但存在反爬机制。只要遵守网站robots.txt规则,模拟正常用户的操作节奏,规避反爬检测,就能正常获取字幕资源。

四、最优解决方案

1. 优化Selenium配置,规避反爬

给Chrome添加参数隐藏自动化痕迹:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options)

同时在每次点击、跳转、下载操作后,添加time.sleep(random.randint(2,4))模拟随机操作间隔。

2. 改进等待逻辑

优先等待元素可交互后再操作:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 15)
# 等待下载按钮可点击
download_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[contains(text(),'Download')]")))
download_btn.click()

针对动态加载内容,可等待页面完全加载完成:

wait.until(lambda d: d.execute_script('return document.readyState') == 'complete')

3. 稳定批量下载流程

  • 配置浏览器自动下载,禁用弹窗:
    prefs = {
        "download.default_directory": "/你的本地下载路径",
        "download.prompt_for_download": False,
        "download.directory_upgrade": True,
        "safebrowsing.enabled": True
    }
    options.add_experimental_option("prefs", prefs)
    
  • 添加下载完成等待逻辑:
    import os
    import time
    
    def wait_for_download(download_dir, filename_keyword):
        while True:
            # 筛选包含关键词的下载文件
            files = [f for f in os.listdir(download_dir) if filename_keyword in f]
            if files:
                file_path = os.path.join(download_dir, files[0])
                # 等待文件大小稳定,确认下载完成
                prev_size = -1
                while True:
                    current_size = os.path.getsize(file_path)
                    if current_size == prev_size:
                        return
                    prev_size = current_size
                    time.sleep(1)
            time.sleep(1)
    
  • 循环下载时,每次完成后回到列表页面,重新获取下一个目标链接,避免页面状态异常。

4. 备选方案:用requests直接抓取接口

如果Selenium频繁被检测,可尝试分析网站真实下载接口:

  • 用浏览器开发者工具抓包,找到字幕文件的直接下载URL。
  • 复制浏览器请求头(包括Cookie、Referer、User-Agent等),用requests库直接发送请求下载文件。
  • 注意Cookie有效期,必要时先访问列表页面或完成登录(若需)获取有效Cookie。

内容的提问来源于stack exchange,提问作者jfontana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:35:28