You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动