Python如何实现同时进行多个浏览器注入

 更新时间:2025年03月04日 09:19:23   作者:百锦再@新空间代码工作室  
浏览器注入是一种技术,允许我们在运行中的浏览器进程中注入代码,以便执行特定的任务,下面我们就来看看Python如何实现同时进行多个浏览器注入吧

浏览器注入是一种技术,允许我们在运行中的浏览器进程中注入代码,以便执行特定的任务。在某些场景下,如自动化测试、Web数据抓取、安全性研究或扩展浏览器功能,我们可能需要同时对多个浏览器进行注入,以提高效率和并行能力。

方案概述

本方案基于 Python 语言,结合 Pyppeteer、Selenium 和 CDP(Chrome DevTools Protocol) 来实现同时进行多个浏览器的注入。该方案支持:

  • 多进程并行注入:利用 Python 的 multiprocessing 库并行控制多个浏览器实例。
  • JavaScript 代码注入:通过 Chrome 的 evaluate 方法动态执行 JavaScript 代码。
  • 浏览器进程隔离:为每个浏览器分配独立的 Session,避免相互干扰。
  • 数据通信与监控:通过 WebSocket 监听浏览器的执行状态,以便管理多个浏览器实例。

第一部分:环境配置

为了实现本方案,我们需要安装必要的依赖项:

pip install selenium pyppeteer

此外,我们需要 Chrome 或 Chromium 作为浏览器执行环境,并且确保 Chrome 允许远程调试模式。

第二部分:浏览器注入的核心逻辑

1. 使用 Pyppeteer 进行浏览器注入

Pyppeteer 是 Chrome Puppeteer 的 Python 版本,它允许我们以编程方式控制 Chromium,并执行 JavaScript 代码。

(1) 启动多个浏览器实例

使用 Pyppeteer,我们可以同时启动多个浏览器实例:

import asyncio
from pyppeteer import launch

async def inject_js(browser_id, url, script):
    print(f"[{browser_id}] 启动浏览器...")
    browser = await launch(headless=False, args=['--no-sandbox'])
    page = await browser.newPage()
    await page.goto(url)
    
    print(f"[{browser_id}] 注入 JavaScript 代码...")
    result = await page.evaluate(script)
    
    print(f"[{browser_id}] 执行结果:{result}")
    await browser.close()

async def main():
    url = "https://www.example.com"
    script = "document.body.style.backgroundColor = 'red'; '注入成功';"
    
    tasks = [inject_js(i, url, script) for i in range(5)]  # 5 个浏览器实例
    await asyncio.gather(*tasks)

asyncio.run(main())

说明:

  • launch 用于启动浏览器。
  • newPage 创建新页面并访问指定 URL。
  • evaluate 方法执行 JavaScript 代码,实现注入。

2. 使用 Selenium 进行浏览器注入

Selenium 是另一种常见的浏览器自动化工具,我们可以结合它进行 JavaScript 注入。

(1) 启动多个 Selenium 浏览器实例

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import multiprocessing

def inject_js_selenium(browser_id, url, script):
    print(f"[{browser_id}] 启动浏览器...")
    
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    
    driver = webdriver.Chrome(service=Service("/path/to/chromedriver"), options=chrome_options)
    driver.get(url)
    
    print(f"[{browser_id}] 注入 JavaScript 代码...")
    driver.execute_script(script)
    
    print(f"[{browser_id}] 注入完成")
    driver.quit()

if __name__ == "__main__":
    url = "https://www.example.com"
    script = "document.body.style.backgroundColor = 'blue';"
    
    processes = []
    for i in range(5):  # 5个浏览器实例
        p = multiprocessing.Process(target=inject_js_selenium, args=(i, url, script))
        p.start()
        processes.append(p)
    
    for p in processes:
        p.join()

说明:

  • webdriver.Chrome 用于创建 Chrome 实例。
  • execute_script 方法执行 JavaScript 代码,实现注入。
  • multiprocessing 用于并行运行多个浏览器实例。

3. 使用 CDP 进行 DevTools 远程调试注入

CDP(Chrome DevTools Protocol)提供了一种更底层的方式来控制浏览器。

import asyncio
from pyppeteer import launch

async def inject_cdp(browser_id, url, script):
    browser = await launch(headless=False, args=['--remote-debugging-port=9222'])
    pages = await browser.pages()
    page = pages[0] if pages else await browser.newPage()
    
    await page.goto(url)
    print(f"[{browser_id}] 通过 CDP 注入 JavaScript 代码...")
    
    cdp_session = await page.target.createCDPSession()
    await cdp_session.send("Runtime.evaluate", {"expression": script})
    
    print(f"[{browser_id}] CDP 注入完成")
    await browser.close()

async def main():
    url = "https://www.example.com"
    script = "document.title = 'CDP 注入成功';"
    
    tasks = [inject_cdp(i, url, script) for i in range(3)]  # 3 个浏览器实例
    await asyncio.gather(*tasks)

asyncio.run(main())

第三部分:优化与扩展

1. 增强并发性

可以使用 ThreadPoolExecutor 或 asyncio.Queue 来提高任务调度的效率。

import concurrent.futures

def parallel_execution():
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        futures = {executor.submit(inject_js_selenium, i, "https://www.example.com", "console.log('执行JS')") for i in range(5)}
        for future in concurrent.futures.as_completed(futures):
            print(future.result())

parallel_execution()

2. 增强数据存储

可以将 JavaScript 代码的执行结果存入数据库,如 MongoDB 或 Redis。

第四部分:总结

本方案基于 Pyppeteer、Selenium、CDP 三种方式实现了同时对多个浏览器进行 JavaScript 注入。核心方法包括:

  • Pyppeteer:适用于灵活控制浏览器行为。
  • Selenium:适用于自动化 Web 操作。
  • CDP:适用于底层浏览器调试控制。

通过 多进程、多线程 并行化任务调度,我们可以高效地在 n 个浏览器中同时进行代码注入,满足自动化测试、数据采集、安全研究等需求。

到此这篇关于Python如何实现同时进行多个浏览器注入的文章就介绍到这了,更多相关Python多浏览器注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python简单分割文件的方法

    python简单分割文件的方法

    这篇文章主要介绍了python简单分割文件的方法,涉及Python针对文件的读取与写入技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • caffe的python接口之手写数字识别mnist实例

    caffe的python接口之手写数字识别mnist实例

    这篇文章主要为大家介绍了caffe的python接口之手写数字识别mnist实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 使用python实现md5加密

    使用python实现md5加密

    这篇文章主要介绍了使用python实现md5加密,md5为计算机安全领域广泛使用的一种散列函数,用于确保信息传输完整一致,需要的朋友可以参考下
    2023-04-04
  • python中join与os.path.join()函数实例详解

    python中join与os.path.join()函数实例详解

    os.path.join()函数用于路径拼接文件路径,下面这篇文章主要给大家介绍了关于python中join与os.path.join()函数的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • 超详细注释之OpenCV Haar级联检测器进行面部检测

    超详细注释之OpenCV Haar级联检测器进行面部检测

    这篇文章主要介绍了OpenCV Haar级联检测器进行面部检测,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • python3实现高效的端口扫描

    python3实现高效的端口扫描

    这篇文章主要为大家详细介绍了python3实现高效的端口扫描,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • PyTorch中torch.no_grad()用法举例详解

    PyTorch中torch.no_grad()用法举例详解

    这篇文章主要介绍了PyTorch中torch.no_grad()用法的相关资料,torch.no_grad()是PyTorch的上下文管理器,用于临时禁用自动梯度计算,减少内存消耗并加快计算速度,它适用于模型评估或推理阶段,可以显著提高效率,需要的朋友可以参考下
    2024-09-09
  • 解决Pytorch 训练与测试时爆显存(out of memory)的问题

    解决Pytorch 训练与测试时爆显存(out of memory)的问题

    今天小编就为大家分享一篇解决Pytorch 训练与测试时爆显存(out of memory)的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 在Python的Flask框架中构建Web表单的教程

    在Python的Flask框架中构建Web表单的教程

    Flask框架中自带一个Form表单类,通过它的子类来实现表单将相当惬意,这里就为大家带来Python的Flask框架中构建Web表单的教程,需要的朋友可以参考下
    2016-06-06
  • Python中dataclass库实例详解

    Python中dataclass库实例详解

    这篇文章主要介绍了Python中dataclass库,合理使用dataclass将会大大减轻开发中的负担,将我们从大量的重复劳动中解放出来,这既是dataclass的魅力,本文结合实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-09-09

最新评论