如何用Python+Selenium绕过戴尔支持页搜索提交时的验证弹窗
解决戴尔支持页面自动化验证弹窗的方案
一、优先使用戴尔官方API(最可靠)
戴尔提供官方支持API,直接调用获取设备信息比浏览器模拟更稳定,完全不会触发验证机制。
示例代码:
import requests def get_dell_device_info(service_tag): url = f"https://www.dell.com/support/api/v2/assetinfo/{service_tag}?apiversion=3.0" headers = { "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" } response = requests.get(url, headers=headers) if response.status_code == 200: data = response.json() model = data['AssetDetails']['ProductHeader']['ProductName'] return model return None for service_tag in ['JX0JL13', '20M11J3', 'BH7C3M2', '6MYH5S2']: model = get_dell_device_info(service_tag) print(f"服务标签 {service_tag} 对应的型号: {model}")
二、优化浏览器自动化行为,降低检测概率
如果必须用浏览器模拟,通过以下方式让操作更接近真人,减少触发验证的几率:
- 添加随机延迟:输入、点击操作间加入1-3秒随机等待
- 用显式等待:替换直接
find_element,等元素加载完成再操作 - 模拟滚动、鼠标移动:进入页面后先滚动,再移动鼠标到输入框点击
- 更换User-Agent:定期替换浏览器的User-Agent字符串
修正后的示例代码:
import time import random from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = 'https://www.dell.com/support/home/en-in' driver = webdriver.Chrome() wait = WebDriverWait(driver, 10) for service_tag in ['JX0JL13', '20M11J3', 'BH7C3M2', '6MYH5S2']: driver.get(url) # 随机延迟+滚动页面 time.sleep(random.uniform(1, 2)) driver.execute_script("window.scrollTo(0, 200);") time.sleep(random.uniform(0.5, 1.5)) # 显式等待输入框并操作 input_element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="inpEntrySelection"]'))) input_element.click() input_element.clear() # 逐个字符输入模拟真人 for char in service_tag: input_element.send_keys(char) time.sleep(random.uniform(0.1, 0.3)) # 等待按钮可点击后提交 submit_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="btn-entry-select"]'))) submit_btn.click() try: # 等待验证弹窗消失 wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, '.captcha-container'))) except: pass # 等待型号元素加载并获取内容 model = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="site-wrapper"]/div/div[4]/div[1]/div[2]/div[1]/div[2]/div/div/div/div[2]/h1'))).text print(f"服务标签 {service_tag} 对应的型号: {model}") time.sleep(random.uniform(2, 3)) driver.quit()
三、使用反检测浏览器工具
用undetected-chromedriver替代普通ChromeDriver,它会自动处理Chrome的自动化检测机制,降低被识别为机器人的概率。
安装命令:
pip install undetected-chromedriver
示例代码:
import time import random import undetected_chromedriver as uc from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By url = 'https://www.dell.com/support/home/en-in' driver = uc.Chrome() wait = WebDriverWait(driver, 10) for service_tag in ['JX0JL13', '20M11J3', 'BH7C3M2', '6MYH5S2']: driver.get(url) time.sleep(random.uniform(1, 2)) input_element = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="inpEntrySelection"]'))) input_element.click() input_element.clear() input_element.send_keys(service_tag) submit_btn = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="btn-entry-select"]'))) submit_btn.click() model = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="site-wrapper"]/div/div[4]/div[1]/div[2]/div[1]/div[2]/div/div/div/div[2]/h1'))).text print(f"服务标签 {service_tag} 对应的型号: {model}") time.sleep(random.uniform(2, 3)) driver.quit()
四、主动处理验证弹窗
如果弹窗已出现,可通过代码等待倒计时结束,或识别验证按钮点击:
try: # 等待验证弹窗出现,再等待其消失 wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'captcha-timer'))) wait.until(EC.invisibility_of_element_located((By.CLASS_NAME, 'captcha-timer'))) except: # 未出现弹窗则跳过 pass
内容的提问来源于stack exchange,提问作者Arunakiri Venkatachalam
相关产品推荐
相关产品推荐

