Selenium Base CDP模式下页面加载后设置窗口尺寸的最优方法(避免机器人检测)
Selenium Base CDP模式下页面加载后设置窗口尺寸的最优方法(避免机器人检测)
我最近也碰到过一模一样的问题——在用SeleniumBase的CDP模式时,页面加载后调整窗口尺寸很容易触发机器人检测。你提到用非CDP的sb.set_window_size(x,y)会被runtimeEnableLeak检测到,这点我太有体会了,在一些反爬严格的站点上确实会踩这个坑,就像你遇到的那样,会被站点的机器人检测器标记出来。
你尝试sb.cdp.set_window_size(x,y)失败是正常的,因为CDP的接口里并没有这个直接封装的方法,所以运行时会抛出AttributeError: 'types.SimpleNamespace' object has no attribute 'set_window_size'的错误。
不过你找到的用sb.cdp.set_window_rect的 workaround 思路非常正确!我可以给你一些优化建议,让这个实现更简洁、可读性更强:
优化后的实现代码
import random # 通过CDP执行JS,获取页面及屏幕的关键尺寸参数 size_info = sb.cdp.evaluate(""" return { screenWidth: window.screen.width, screenHeight: window.screen.height, viewportWidth: window.innerWidth, viewportHeight: window.innerHeight, pageScrollWidth: document.documentElement.scrollWidth, pageScrollHeight: document.documentElement.scrollHeight }; """) # 打印尺寸信息用于调试 print(f"""当前尺寸详情: 屏幕宽度: {size_info['screenWidth']} 屏幕高度: {size_info['screenHeight']} 视口宽度: {size_info['viewportWidth']} 视口高度: {size_info['viewportHeight']} 页面滚动宽度: {size_info['pageScrollWidth']} 页面滚动高度: {size_info['pageScrollHeight']}""") # 计算目标窗口尺寸,末尾的100是预留的额外高度,可按需调整 target_width = size_info['pageScrollWidth'] + size_info['screenWidth'] - size_info['viewportWidth'] target_height = size_info['pageScrollHeight'] + size_info['screenHeight'] - size_info['viewportHeight'] + 100 # 调用CDP原生方法设置窗口位置和尺寸 sb.cdp.set_window_rect(x=0, y=0, width=target_width, height=target_height) print("等待窗口尺寸调整完成...") sb.sleep(random.randint(5, 8))
为什么这个方法更稳妥?
set_window_rect是CDP原生支持的API,它模拟的是浏览器本身调整窗口的行为,不会像非CDP方法那样触发runtimeEnableLeak这类机器人检测信号,因为完全走的是浏览器原生的交互逻辑。- 通过JS获取页面真实的滚动尺寸后再计算目标值,能让窗口刚好适配页面内容,避免出现异常尺寸被反爬规则识别。
那有没有更简便的方法呢?目前SeleniumBase的CDP工具类里确实没有直接封装set_window_size方法,所以用set_window_rect是当前最可靠的方案。如果后续SeleniumBase更新CDP相关的工具函数,可能会增加这个便捷方法,但就现在来说,这个实现已经足够安全好用了。
备注:内容来源于stack exchange,提问作者sudoExclamationExclamation




