OpenWPMs run_custom_function 如何影响范围?
How does OpenWPMs run_custom_function affect the Scope?
我正在尝试使用 OpenWPM 抓取一些网站并编写了一个自定义函数 get_pp_links()
,它向全局列表添加了一些内容。但是当我将它与 OpenWPMs 一起使用时
run_custom_function()
,我附加到列表的东西消失了。
我的脚本如下所示:
from automation import CommandSequence, TaskManager
NUM_BROWSERS = 2
alist = [1]
def get_pp_links(**kwargs):
alist.append(1)
def main():
# The list of sites that we wish to crawl
with open("top-100.csv", "r") as file:
csv_reader = reader(file)
sites = list(csv_reader)
# Loads the default manager preferences
manager_params, browser_params = TaskManager.load_default_params(NUM_BROWSERS)
# Update browser configuration
for i in range(NUM_BROWSERS):
browser_params[i]['headless'] = True
# Instantiates the measurement platform
manager = TaskManager.TaskManager(manager_params, browser_params)
for site in sites:
command_sequence = CommandSequence.CommandSequence("https://"+site[1], reset=True)
command_sequence.get(sleep=0, timeout=60)
command_sequence.run_custom_function(get_pp_links, ())
manager.execute_command_sequence(command_sequence)
# Shuts down the browsers and waits for the data to finish logging
manager.close()
print(alist)
if __name__ == "__main__":
main()
并且 top-100.cvs
包含域列表:
92,twitch.tv
93,forbes.com
94,bbc.com
我希望列表随着每个扫描的站点而增长,因此结果看起来像 [1,1,1,1]
,但打印的列表只有 [1]
我认为这与 run_custom_function()
有某种联系,因为当我直接调用 get_pp_links()
时,问题没有出现。
这是因为 OpenWPM 为每个生成的浏览器创建了一个新进程。
由于每个进程都与父进程相互隔离,因此会发生以下情况。
alist
在主进程中创建。
alist
被复制到浏览器进程中。
alist
在浏览器进程中被 get_pp_links
改变
- 变化停留在浏览器进程中,您无法在父进程中观察到它们。
您可以通过使用 multiprocessing.SyncManager
并在进程之间同步列表来解决这个问题。
我正在尝试使用 OpenWPM 抓取一些网站并编写了一个自定义函数 get_pp_links()
,它向全局列表添加了一些内容。但是当我将它与 OpenWPMs 一起使用时
run_custom_function()
,我附加到列表的东西消失了。
我的脚本如下所示:
from automation import CommandSequence, TaskManager
NUM_BROWSERS = 2
alist = [1]
def get_pp_links(**kwargs):
alist.append(1)
def main():
# The list of sites that we wish to crawl
with open("top-100.csv", "r") as file:
csv_reader = reader(file)
sites = list(csv_reader)
# Loads the default manager preferences
manager_params, browser_params = TaskManager.load_default_params(NUM_BROWSERS)
# Update browser configuration
for i in range(NUM_BROWSERS):
browser_params[i]['headless'] = True
# Instantiates the measurement platform
manager = TaskManager.TaskManager(manager_params, browser_params)
for site in sites:
command_sequence = CommandSequence.CommandSequence("https://"+site[1], reset=True)
command_sequence.get(sleep=0, timeout=60)
command_sequence.run_custom_function(get_pp_links, ())
manager.execute_command_sequence(command_sequence)
# Shuts down the browsers and waits for the data to finish logging
manager.close()
print(alist)
if __name__ == "__main__":
main()
并且 top-100.cvs
包含域列表:
92,twitch.tv
93,forbes.com
94,bbc.com
我希望列表随着每个扫描的站点而增长,因此结果看起来像 [1,1,1,1]
,但打印的列表只有 [1]
我认为这与 run_custom_function()
有某种联系,因为当我直接调用 get_pp_links()
时,问题没有出现。
这是因为 OpenWPM 为每个生成的浏览器创建了一个新进程。
由于每个进程都与父进程相互隔离,因此会发生以下情况。
alist
在主进程中创建。alist
被复制到浏览器进程中。alist
在浏览器进程中被get_pp_links
改变- 变化停留在浏览器进程中,您无法在父进程中观察到它们。
您可以通过使用 multiprocessing.SyncManager
并在进程之间同步列表来解决这个问题。