当前位置: 首页 > news >正文

浏览器注入可以实现同时进行n个浏览器注入的方案

浏览器注入是一种技术,允许我们在运行中的浏览器进程中注入代码,以便执行特定的任务。在某些场景下,如自动化测试、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 个浏览器中同时进行代码注入,满足自动化测试、数据采集、安全研究等需求。

相关文章:

  • JavaWeb-社区版Idea安装配置
  • Spring Boot 与 MyBatis 版本兼容性
  • 简述下Spark中的自带的standalone集群管理的任务执行流程
  • 【决策树】分类属性的选择
  • Linux端口映射
  • 图解KV Cache:解锁LLM推理效率的关键
  • NVIDIA GPU 系列简单介绍
  • Vue盲区扫雷
  • oracle decode
  • WireGuard搭建网络,供整个公司使用
  • 自动计算相机pose,pyrender渲染例子
  • QILSTE H6-C210TCG高亮翠绿光LED灯珠 发光二极管LED
  • 使用 `#pragma comment(lib, “xxx.lib“)` 简化 DLL 依赖管理
  • (十 八)趣学设计模式 之 观察者模式!
  • vscode通过ssh远程连接(linux系统)不能跳转问题
  • CSS—显示模式display、定位position、元素溢出overflow、float浮动
  • 【入门Web安全之前端学习的侧重点和针对性的建议】
  • java后端开发day26--常用API(一)
  • 浅克隆与深克隆区别
  • MySQL SQL 优化专题
  • 4月一二线城市新房价格环比上涨,沪杭涨幅居百城前列
  • 解放日报:“北斗七星”列阵,AI群星闪耀
  • 迪卡侬回应出售中国业务30%股份传闻:始终扎根中国长期发展
  • 司法服务保障西部陆海新通道建设,最高法专门发文
  • 讲座|为什么要不断地翻译叶芝的诗?它们为什么值得细读?
  • 融创服务全面退出彰泰服务集团:约8.26亿元出售广西彰泰融创智慧80%股权