如何用if/else语句捕获Selenium网页抓取的无效输入握手失败错误并重试?
解决方案:捕获错误并循环获取有效输入
当然可以通过循环+异常捕获来处理无效输入的情况,不仅能捕获握手失败的错误,还能处理输入格式错误、页面加载超时、目标元素不存在等问题,确保用户输入有效内容后才完成抓取。
修改后的完整代码(带中文注释)
import re from selenium.webdriver import Chrome from selenium.webdriver.common.by import By from selenium.common.exceptions import ( TimeoutException, NoSuchElementException, WebDriverException, ValueError ) trn_base_url = "https://tracker.gg/valorant/profile/riot/" while True: try: # 获取用户输入并验证格式 player_tag = input("请输入玩家名称+标签(格式示例:Eazy#Pzy):\n") # 检查输入是否包含且仅包含一个# if '#' not in player_tag or player_tag.count('#') != 1: raise ValueError("输入格式错误,必须包含且仅包含一个#分隔符") player_name, tag = player_tag.split('#') # 去除前后空格(避免用户输入多余空格) player_name = player_name.strip() tag = tag.strip() if not player_name or not tag: raise ValueError("玩家名称或标签不能为空") # 初始化浏览器 driver = Chrome(executable_path='chromedriver.exe') driver.set_window_position(-10000, 0) # 构造目标URL并访问 target_url = f"{trn_base_url}{player_name}%23{tag}" driver.get(target_url) # 获取段位元素,若不存在则判定为无效用户 rank_element = driver.find_element(By.CLASS_NAME, "valorant-rank-bg") rank_text = rank_element.get_attribute('innerText').strip() # 成功获取数据,输出并退出循环 print(f"该玩家的段位为:{rank_text}") driver.quit() break except ValueError as ve: # 处理输入格式错误 print(f"⚠️ 输入错误:{ve},请重新输入。") except (TimeoutException, WebDriverException): # 处理握手失败、页面加载超时等网络/驱动错误 print("⚠️ 握手失败或页面加载超时,请检查输入是否有效或网络状态后重新输入。") if 'driver' in locals(): driver.quit() except NoSuchElementException: # 处理页面加载成功但找不到段位元素(无效用户) print("⚠️ 未找到该玩家信息,请确认输入的玩家名称和标签是否正确后重新输入。") if 'driver' in locals(): driver.quit() except Exception as e: # 捕获其他未预见的错误 print(f"⚠️ 发生未知错误:{str(e)},请重新尝试。") if 'driver' in locals(): driver.quit()
关键改进点说明
- 循环输入机制:用
while True循环持续获取用户输入,直到成功抓取数据后通过break退出循环。 - 前置输入验证:提前检查输入是否符合
名称#标签的格式,避免后续字符串切割报错。 - 多场景异常捕获:
ValueError:处理输入格式错误(无#、多个#、名称/标签为空)。TimeoutException/WebDriverException:捕获握手失败、页面加载超时等网络或驱动层面的错误。NoSuchElementException:捕获页面加载成功但目标元素不存在(即用户信息无效)的情况。
- 资源自动清理:每次失败后关闭浏览器进程,避免残留未关闭的Chrome实例占用系统资源。
内容的提问来源于stack exchange,提问作者Nick Cipriano
相关产品推荐
相关产品推荐

