网站设计与网页配色,怎么进wordpress,自己做的网站 打开了没有图片,鹤壁做网站价格前言 使用Selenium 创建多个浏览器#xff0c;这在自动化操作中非常常见。 而在Python中#xff0c;使用 Selenium threading 或 Selenium ThreadPoolExecutor 都是很好的实现方法。 应用场景#xff1a;
创建多个浏览器用于测试或者数据采集#xff1b;使用Selenium 控… 前言 使用Selenium 创建多个浏览器这在自动化操作中非常常见。 而在Python中使用 Selenium threading 或 Selenium ThreadPoolExecutor 都是很好的实现方法。 应用场景
创建多个浏览器用于测试或者数据采集使用Selenium 控制本地安装的 chrome浏览器 去做一些操作…
文章提供了 Selenium threading 和 Selenium ThreadPoolExecutor 结合的代码模板拿来即用。
知识点 上面两个都是 Python 内置模块无需手动安装~
导入模块
import threading
from concurrent.futures import ThreadPoolExecutor, as_completed 多线程还是线程池 在Selenium中使用 多线程 或者是 线程池差别并不大。主要都是网络I/O的操作。 在使用 ThreadPoolExecutor 的情况下任务将被分配到不同的线程中执行从而提高并发处理能力。与使用 threading 模块相比使用 ThreadPoolExecutor 有以下优势:
更高的并发处理能力线程池 可以动态地调整线程数量以适应任务的数量和处理要求从而提高并发处理能力。更好的性能线程池 可以根据任务的类型和大小动态地调整线程数量从而提高性能和效率。…
总之使用 线程池 可以提高并发处理能力更易于管理并且可以提供更好的性能和效率。
但是选择多线程效果也不差。
所以使用哪个都不必纠结哪个代码量更少就选哪个自然是最好的。 多个浏览器✨
Selenium自动化中需要多个浏览器属于是非常常见的操作了。
不管是用于自动化测试、还是爬虫数据采集这都是个可行的方法。
这里示例的代码中线程池的运行时候只有 多线程 的一半 多线程与 多 浏览器 这份代码的应用场景会广一些后续复用修改一下 browser_thread 函数的逻辑就可以了。 这里模拟相对复杂的操作在创建的浏览器中新打开一个标签页用于访问指定的网站。
然后切换到新打开的标签页进行截图。 代码释义
定义一个名为 start_browser 的函数用于创建 webdriver.Chrome 对象。定义一个名为 browser_thread 的函数接受一个 webdriver.Chrome 对象和一个整数作为参数用于打开指定网页并截图。 切换到最后一个窗口然后截图。main函数创建了5个浏览器5个线程执行上面的操作然后等待所有线程执行完毕。
# -*- coding: utf-8 -*-
# Name: multi_thread.py
# Author: 小月
# Date: 2023/10/26 20:00
# Description:
import threading
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
def start_browser():
service ChromeService(ChromeDriverManager().install())
driver webdriver.Chrome(serviceservice)
return driver
def browser_thread(driver: webdriver.Chrome, idx: int):
url_list [https://www.csdn.net/, https://www.baidu.com,
https://music.163.com/, https://y.qq.com/, https://cn.vuejs.org/]
try:
driver.execute_script(fwindow.open({url_list[idx]}))
driver.switch_to.window(driver.window_handles[-1])
driver.save_screenshot(f{idx}.png)
return True
except Exception:
return False
def main():
for idx in range(5):
driver start_browser()
threading.Thread(targetbrowser_thread, args(driver, idx)).start()
# 等待所有线程执行完毕
for thread in threading.enumerate():
if thread is not threading.current_thread():
thread.join()
if __name__ __main__:
main() 运行结果
运行时长在9.28秒速度与网络环境有很大关系木桶效应取决于最后运行完成的浏览器看到程序运行完成后多出了5张截图。 线程池与 多 浏览器 这份代码与 多线程与 多浏览器 的操作基本一致。速度上却比多线程节省了一半。 # -*- coding: utf-8 -*-
# Name: demo2.py
# Author: 小月
# Date: 2023/10/26 20:00
# Description:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from concurrent.futures import ThreadPoolExecutor, as_completed
MAX_WORKERS 5
service ChromeService(ChromeDriverManager().install())
def start_browser():
driver webdriver.Chrome(serviceservice)
return driver
def browser_task(driver: webdriver.Chrome, idx: int):
url_list [https://www.csdn.net/, https://www.baidu.com,
https://music.163.com/, https://y.qq.com/, https://cn.vuejs.org/]
try:
driver.execute_script(fwindow.open({url_list[idx]}))
driver.switch_to.window(driver.window_handles[-1])
driver.save_screenshot(f{idx}.png)
return True
except Exception:
return False
def main():
executor ThreadPoolExecutor(max_workersMAX_WORKERS)
ths list()
for idx in range(5):
driver start_browser()
th executor.submit(browser_task, driver, idxidx)
ths.append(th)
# 获取结果
for future in as_completed(ths):
print(future.result())
if __name__ __main__:
main() 运行结果
运行时长在4.5秒运行效果图不是很匹配但确实是比多线程快很多。看到程序运行完成后多出了5张截图。 多个标签页 这个的应用场景有点意思。 这里的操作与上面的 多个浏览器其实是差不多的。
区别在于上面打开多个浏览器这里打开多个标签页。
所以这个需要考量一个问题资源争夺。与是这里用上了 threading.Lock 锁用以保护资源线程安全。
多线程与 多 标签页
代码释义 与上面差不多不解释了。 # -*- coding: utf-8 -*-
# Name: demo2.py
# Author: 小月
# Date: 2023/10/26 20:00
# Description:
import threading
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
service ChromeService(ChromeDriverManager().install())
lock threading.Lock()
def start_browser():
driver webdriver.Chrome(serviceservice)
return driver
def browser_thread(driver: webdriver.Chrome, idx: int):
url_list [https://www.csdn.net/, https://www.baidu.com,
https://music.163.com/, https://y.qq.com/, https://cn.vuejs.org/]
try:
lock.acquire()
driver.execute_script(fwindow.open({url_list[idx]}))
driver.switch_to.window(driver.window_handles[idx 1])
driver.save_screenshot(f{idx}.png)
return True
except Exception:
return False
finally:
lock.release()
def main():
driver start_browser()
for idx in range(5):
threading.Thread(targetbrowser_thread, args(driver, idx)).start()
# 等待所有线程执行完毕
for thread in threading.enumerate():
if thread is not threading.current_thread():
thread.join()
if __name__ __main__:
main() 运行结果 线程池与 多 标签页 这里不展示运行结果了因为效果与 多线程与 多 标签页 一致。 # -*- coding: utf-8 -*-
# Name: thread_pool.py
# Author: 小月
# Date: 2023/10/26 20:00
# Description:
import time
import threading
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from concurrent.futures import ThreadPoolExecutor, as_completed
MAX_WORKERS 5
service ChromeService(ChromeDriverManager().install())
lock threading.Lock()
def start_browser():
driver webdriver.Chrome(serviceservice)
return driver
def browser_task(driver: webdriver.Chrome, idx: int):
url_list [https://www.csdn.net/, https://www.baidu.com,
https://music.163.com/, https://y.qq.com/, https://cn.vuejs.org/]
try:
lock.acquire()
driver.execute_script(fwindow.open({url_list[idx]}))
driver.switch_to.window(driver.window_handles[idx 1])
driver.save_screenshot(f{idx}.png)
return True
except Exception:
return False
finally:
lock.release()
def main():
driver start_browser()
executor ThreadPoolExecutor(max_workersMAX_WORKERS)
ths list()
for idx in range(5):
th executor.submit(browser_task, driver, idxidx)
ths.append(th)
# 获取结果
for future in as_completed(ths):
print(future.result())
if __name__ __main__:
st time.time()
main()
et time.time()
print(et - st) 总结⚡⚡
本文章介绍了 Selenium threading 和 Selenium ThreadPoolExecutor 来创建多个浏览器或多个标签页的操作。
文中示例的代码比较简单所以 线程池 比 多线程 运行的更加快。
但在实际的使用过程中可以根据自己的喜好去选择 线程池 还是 多线程 。
后话
本次分享到此结束
see you~