为何svc.mt.gov域名站点执行console.log()命令无控制台输出?
问题成因
- 该MT政府站点主动重写了浏览器原生的
console对象方法,这类生产环境站点常将console.log等调试方法赋值为空函数,用于屏蔽开发阶段的日志输出,同时也能提高普通爬虫的调试门槛。 - 你用Selenium的
execute_script执行无效也是同理,你注入的JS调用的是已经被污染的console方法,自然不会产生输出。 - 少数情况是站点设置了严格的内容安全策略,限制了脚本的执行权限,但你可以正常执行命令只是无输出,基本可以排除该情况。
可用解决方案
方法1:DevTools控制台直接恢复
在控制台先执行以下代码重置console为原生版本,之后再执行console.log即可正常输出:
// 创建隐藏iframe获取未被污染的原生console对象 const tempIframe = document.createElement('iframe'); tempIframe.style.display = 'none'; document.body.appendChild(tempIframe); window.console = tempIframe.contentWindow.console; // 测试输出 console.log("Hello world!");
方法2:Selenium执行适配
执行你需要的脚本之前,先注入上面的重置console的代码即可,示例代码如下:
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://svc.mt.gov/dor/property/prc") # 先重置console对象 reset_console = """ const tempIframe = document.createElement('iframe'); tempIframe.style.display = 'none'; document.body.appendChild(tempIframe); window.console = tempIframe.contentWindow.console; """ driver.execute_script(reset_console) # 执行你需要的脚本 driver.execute_script('console.log("Hello world!")')
备选方案(适配禁止创建iframe的站点)
如果站点的CSP规则禁止动态创建iframe,可以直接调用console原型上的原始方法:
const originalLog = Object.getOwnPropertyDescriptor(window.console.__proto__, 'log').value; originalLog("Hello world!");
内容的提问来源于stack exchange,提问作者totalFREAKINpain
相关产品推荐
相关产品推荐

