浏览器注入技术实现多浏览器注入方案并行实施指南

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

方案概述

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

  1. 多进程并行注入:利用 Python 的 multiprocessing 库并行控制多个浏览器实例。
  2. JavaScript 代码注入:通过 Chrome 的 evaluate 方法动态执行 JavaScript 代码。
  3. 浏览器进程隔离:为每个浏览器分配独立的 Session,避免相互干扰。
  4. 数据通信与监控:通过 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. 增强并发性

    可以使用 ThreadPoolExecutorasyncio.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 个浏览器中同时进行代码注入,满足自动化测试、数据采集、安全研究等需求。

    作者:百锦再@新空间代码工作室

    物联沃分享整理
    物联沃-IOTWORD物联网 » 浏览器注入技术实现多浏览器注入方案并行实施指南

    发表回复