使用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
相关产品推荐
相关产品推荐

