Selenium WebDriver点击按钮后跳转至空白页面,直接访问目标链接却正常
这种情况我之前也碰到过,十有八九是网站的反爬机制检测到了Selenium的特征——毕竟直接访问正常、点击跳转就空白,核心差异就在于请求的上下文环境。给你几个实用的调试和解决方向:
伪装浏览器特征,隐藏自动化标识
现在很多网站会通过navigator.webdriver属性识别Selenium,默认情况下这个属性会被设为true。你可以通过ChromeOptions配置来修改这个行为:from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() # 禁用自动化控制特征 options.add_argument("--disable-blink-features=AutomationControlled") # 排除自动化开关 options.add_experimental_option("excludeSwitches", ["enable-automation"]) # 关闭自动化扩展 options.add_experimental_option('useAutomationExtension', False) driver = webdriver.Chrome(options=options) # 再用JS重置webdriver属性,双重保险 driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")这些配置能让你的浏览器环境更接近普通用户,降低被反爬机制识别的概率。
替换固定等待,改用显式等待策略
你现在用的time.sleep()是固定时长等待,很可能出现页面未完全就绪就触发操作、或者跳转后加载被阻塞的情况。建议换成Selenium的显式等待,根据页面元素状态动态调整等待时间:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待cookie拒绝按钮可点击 cookieDeclineButton = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "onetrust-reject-all-handler")) ) cookieDeclineButton.click() # 等待购买按钮可点击再执行点击 bestelSimkaartButton = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "/html/body/div[2]/div[1]/div[1]/div/div[1]/div[2]/div[1]/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[3]/button")) ) bestelSimkaartButton.click() # 跳转后等待目标页面的关键元素出现,确认加载完成 try: WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.TAG_NAME, "h1")) # 替换成目标页面实际存在的元素 ) except: print("页面加载超时,可能仍被反爬拦截")显式等待比固定sleep更可靠,也能减少不必要的等待时间。
模拟真实用户的操作节奏
网站可能会检测操作的机械性——比如你打开页面就点cookie按钮,立刻又点购买,节奏太生硬。可以加一些贴近真实用户的小动作:from selenium.webdriver.common.action_chains import ActionChains # 先滚动到购买按钮的可见位置 driver.execute_script("arguments[0].scrollIntoView();", bestelSimkaartButton) # 模拟鼠标悬停后再点击 ActionChains(driver).move_to_element(bestelSimkaartButton).click().perform()这种操作流程更接近真人行为,不容易触发反爬规则。
校验请求头和Cookie状态
直接访问目标URL时,浏览器的Cookie和请求头可能和点击跳转时存在差异。你可以用Chrome开发者工具的Network面板,对比两种访问方式的请求参数,看看有没有缺失的关键Cookie或请求头字段,比如自定义User-Agent:options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36")有些网站会校验User-Agent,换成普通浏览器的UA能进一步降低被检测的概率。
先从伪装浏览器特征入手试试,这是解决这类问题最常用的方案;如果不行再逐步尝试其他方法,总能找到适配的方式。
备注:内容来源于stack exchange,提问作者Denzel




