【问题标题】:Scraping Browser Console Output - Python Selenium - TCF API抓取浏览器控制台输出 - Python Selenium - TCF API
【发布时间】:2021-03-24 07:22:32
【问题描述】:

我想从实施所谓的Tracking Consent Framework 以符合 GDPR 的网站中抓取所谓的 TC 字符串(跟踪同意字符串)。

在浏览器控制台中,我可以输入类似的内容

window.__tcfapi('ping',2,function(data,success){console.log(data);})

API 的描述可以在这里找到TCF API。第三个参数是将接收到的数据写入控制台的回调函数。 所需的返回值(他的示例来自focus.de)将是一个看起来像这样的字典

{
"cmpId": 6,
"cmpVersion": 1,
"gdprApplies": true,
"tcfPolicyVersion": 2,
"cmpLoaded": true,
"cmpStatus": "loaded",
"displayStatus": "hidden",
"apiVersion": "2",
"gvlVersion": 82}

如何使用 Selenium 将此控制台输出分配给 python 中的变量?

我可以尝试使用execute_script-方法执行脚本,如下所示:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
cap = DesiredCapabilities.CHROME
cap["goog:loggingPrefs"] = {"performance": "ALL"} 
driver = webdriver.Chrome(desired_capabilities=cap)
driver.execute_script("window.__tcfapi('ping',2,function(data,success){console.log(data);})")

然后获取控制台日志,就像在这个问题中讨论的那样:Getting console.log output from Chrome with Selenium Python API bindings

但这似乎效率很低,我猜我的问题更多源于对异步 javascript 编程的误解。

我也尝试使用execute_async_script 方法。 但这只会导致我出现超时错误。

任何提示都非常感谢,非常感谢。

【问题讨论】:

    标签: javascript python selenium asynchronous


    【解决方案1】:

    我使用此解决方法(暂时)解决了它:

    tcs = driver.execute_script("window.__tcfapi('ping',2,function(data,success){window.tcs=data;}); return window.tcs")
    

    所以基本上我更改了回调函数以设置一个全局变量window.tcs,然后可以在我们使用 Selenium 的 execute_script 方法时执行的函数中访问和返回该变量。

    我知道设置全局变量是个坏主意...

    不过,您也可以使用 driver.execute_script("delete window.tcs") 将其删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-26
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      相关资源
      最近更新 更多