python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python多浏览器注入

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

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

浏览器注入是一种技术,允许我们在运行中的浏览器进程中注入代码,以便执行特定的任务,下面我们就来看看Python如何实现同时进行多个浏览器注入吧

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

方案概述

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

第一部分:环境配置

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

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())

说明:

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()

说明:

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 注入。核心方法包括:

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

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

您可能感兴趣的文章:
阅读全文