使用Python和selenium获取Ublock Origin记录器数据

yrdbyhpb  于 2022-12-25  发布在  Python
关注(0)|答案(1)|浏览(140)

bounty已结束。此问题的答案可获得+50的信誉奖励。奖励宽限期将在22小时后结束。8oris正在寻找来自信誉良好来源的答案

我想知道Ublock Origin使用Python(运行在Linux服务器上,所以没有GUI)和Selenium(带有firefox驱动程序)检测到的被屏蔽的跟踪器的数量。我不需要真的屏蔽它们,但我需要知道有多少。
Ublock Origin有一个记录器(https://github.com/gorhill/uBlock/wiki/The-logger#settings-dialog),我想把它扔掉。
此记录器可通过如下URL获得:moz扩展名://* fc 469 b55 -3182-4104-a95 c-6 b 0 b4 f87 cf 0 f */logger-ui.html#_其中斜体部分是Ublock源插件的UUID。
在这个日志记录器中,对于每个条目,都有一个div,其class设置为“logEntry”(下面截图中的黄色长方形),我想获取绿色长方形中的数据:

到目前为止,我得到了这个:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options as FirefoxOptions
browser_options = FirefoxOptions()
browser_options.headless = True
              
#   Activate add on
str_ublock_extension_path = "/usr/local/bin/uBlock0_1.45.3b10.firefox.signed.xpi"
browser = webdriver.Firefox(executable_path='/usr/loca/bin/geckodriver',options=browser_options)        
str_id  = browser.install_addon(str_ublock_extension_path)
        
#   Getting the UUID which is new each time the script is launched
profile_path = browser.capabilities['moz:profile']    
id_extension_firefox = "uBlock0@raymondhill.net"
with open('{}/prefs.js'.format(profile_path), 'r') as file_prefs:
     lines = file_prefs.readlines()
     for line in lines:
     if 'extensions.webextensions.uuids' in line:
         sublines = line.split(',')
         for subline in sublines:
             if id_extension_firefox in subline:
                internal_uuid = subline.split(':')[1][2:38]
                                    
        str_uoo_panel_url = "moz-extension://" + internal_uuid + "/logger-ui.html#_"
        ubo_logger = browser.get(str_uoo_panel_url)
        ubo_logger_log_entries = ubo_logger.find_element(By.CLASS_NAME, "logEntry")
        
        for log_entrie in ubo_logger_log_entries:
            print(log_entrie.text)

考虑到print(browser.page_source)会显示一些相关的html代码,使用这个“奇怪”的url和moz-extension://似乎是可行的。
问题:ubo_logger.find_element(By.CLASS_NAME, "logEntry")什么也没得到。我做错了什么?

5tmbdcev

5tmbdcev1#

我发现这个很管用:

parent = driver.find_element(by=By.XPATH, value='//*[@id="vwContent"]')
children = parent.find_elements(by=By.XPATH, value='./child::*')

for child in children:
    attributes = (child.find_element(by=By.XPATH, value='./child::*')).find_elements(by=By.XPATH, value='./child::*')
    print(attributes[4].text)

然后,您还可以执行以下操作:

if attributes[4].text.isdigit():
    result = int(attributes[4].text)

这会将生成的文本转换为int。

相关问题