Python如何實(shí)現(xiàn)同時(shí)進(jìn)行多個(gè)瀏覽器注入
瀏覽器注入是一種技術(shù),允許我們?cè)谶\(yùn)行中的瀏覽器進(jìn)程中注入代碼,以便執(zhí)行特定的任務(wù)。在某些場(chǎng)景下,如自動(dòng)化測(cè)試、Web數(shù)據(jù)抓取、安全性研究或擴(kuò)展瀏覽器功能,我們可能需要同時(shí)對(duì)多個(gè)瀏覽器進(jìn)行注入,以提高效率和并行能力。

方案概述
本方案基于 Python 語言,結(jié)合 Pyppeteer、Selenium 和 CDP(Chrome DevTools Protocol) 來實(shí)現(xiàn)同時(shí)進(jìn)行多個(gè)瀏覽器的注入。該方案支持:
- 多進(jìn)程并行注入:利用 Python 的 multiprocessing 庫(kù)并行控制多個(gè)瀏覽器實(shí)例。
- JavaScript 代碼注入:通過 Chrome 的 evaluate 方法動(dòng)態(tài)執(zhí)行 JavaScript 代碼。
- 瀏覽器進(jìn)程隔離:為每個(gè)瀏覽器分配獨(dú)立的 Session,避免相互干擾。
- 數(shù)據(jù)通信與監(jiān)控:通過 WebSocket 監(jiān)聽瀏覽器的執(zhí)行狀態(tài),以便管理多個(gè)瀏覽器實(shí)例。
第一部分:環(huán)境配置
為了實(shí)現(xiàn)本方案,我們需要安裝必要的依賴項(xiàng):
pip install selenium pyppeteer
此外,我們需要 Chrome 或 Chromium 作為瀏覽器執(zhí)行環(huán)境,并且確保 Chrome 允許遠(yuǎn)程調(diào)試模式。
第二部分:瀏覽器注入的核心邏輯
1. 使用 Pyppeteer 進(jìn)行瀏覽器注入
Pyppeteer 是 Chrome Puppeteer 的 Python 版本,它允許我們以編程方式控制 Chromium,并執(zhí)行 JavaScript 代碼。
(1) 啟動(dòng)多個(gè)瀏覽器實(shí)例
使用 Pyppeteer,我們可以同時(shí)啟動(dòng)多個(gè)瀏覽器實(shí)例:
import asyncio
from pyppeteer import launch
async def inject_js(browser_id, url, script):
print(f"[{browser_id}] 啟動(dòng)瀏覽器...")
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}] 執(zhí)行結(jié)果:{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 個(gè)瀏覽器實(shí)例
await asyncio.gather(*tasks)
asyncio.run(main())
說明:
- launch 用于啟動(dòng)瀏覽器。
- newPage 創(chuàng)建新頁(yè)面并訪問指定 URL。
- evaluate 方法執(zhí)行 JavaScript 代碼,實(shí)現(xiàn)注入。
2. 使用 Selenium 進(jìn)行瀏覽器注入
Selenium 是另一種常見的瀏覽器自動(dòng)化工具,我們可以結(jié)合它進(jìn)行 JavaScript 注入。
(1) 啟動(dòng)多個(gè) Selenium 瀏覽器實(shí)例
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}] 啟動(dòng)瀏覽器...")
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個(gè)瀏覽器實(shí)例
p = multiprocessing.Process(target=inject_js_selenium, args=(i, url, script))
p.start()
processes.append(p)
for p in processes:
p.join()
說明:
- webdriver.Chrome 用于創(chuàng)建 Chrome 實(shí)例。
- execute_script 方法執(zhí)行 JavaScript 代碼,實(shí)現(xiàn)注入。
- multiprocessing 用于并行運(yùn)行多個(gè)瀏覽器實(shí)例。
3. 使用 CDP 進(jìn)行 DevTools 遠(yuǎn)程調(diào)試注入
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 個(gè)瀏覽器實(shí)例
await asyncio.gather(*tasks)
asyncio.run(main())
第三部分:優(yōu)化與擴(kuò)展
1. 增強(qiáng)并發(fā)性
可以使用 ThreadPoolExecutor 或 asyncio.Queue 來提高任務(wù)調(diào)度的效率。
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('執(zhí)行JS')") for i in range(5)}
for future in concurrent.futures.as_completed(futures):
print(future.result())
parallel_execution()
2. 增強(qiáng)數(shù)據(jù)存儲(chǔ)
可以將 JavaScript 代碼的執(zhí)行結(jié)果存入數(shù)據(jù)庫(kù),如 MongoDB 或 Redis。
第四部分:總結(jié)
本方案基于 Pyppeteer、Selenium、CDP 三種方式實(shí)現(xiàn)了同時(shí)對(duì)多個(gè)瀏覽器進(jìn)行 JavaScript 注入。核心方法包括:
- Pyppeteer:適用于靈活控制瀏覽器行為。
- Selenium:適用于自動(dòng)化 Web 操作。
- CDP:適用于底層瀏覽器調(diào)試控制。
通過 多進(jìn)程、多線程 并行化任務(wù)調(diào)度,我們可以高效地在 n 個(gè)瀏覽器中同時(shí)進(jìn)行代碼注入,滿足自動(dòng)化測(cè)試、數(shù)據(jù)采集、安全研究等需求。
到此這篇關(guān)于Python如何實(shí)現(xiàn)同時(shí)進(jìn)行多個(gè)瀏覽器注入的文章就介紹到這了,更多相關(guān)Python多瀏覽器注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3實(shí)現(xiàn)將本地JSON大數(shù)據(jù)文件寫入MySQL數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Python3實(shí)現(xiàn)將本地JSON大數(shù)據(jù)文件寫入MySQL數(shù)據(jù)庫(kù)的方法,涉及Python針對(duì)json大數(shù)據(jù)文件的逐行讀取、mysql數(shù)據(jù)庫(kù)寫入等相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
python之Flask實(shí)現(xiàn)簡(jiǎn)單登錄功能的示例代碼
這篇文章主要介紹了python之Flask實(shí)現(xiàn)簡(jiǎn)單登錄功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
python結(jié)合selenium獲取XX省交通違章數(shù)據(jù)的實(shí)現(xiàn)思路及代碼
這篇文章主要介紹了python結(jié)合selenium獲取XX省交通違章數(shù)據(jù)的實(shí)現(xiàn)思路及代碼方法的相關(guān)資料2016-06-06
詳解DeBug Python神級(jí)工具PySnooper
這篇文章主要介紹了詳解DeBug Python神級(jí)工具PySnooper,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python抓取京東圖書評(píng)論數(shù)據(jù)
最近接了個(gè)項(xiàng)目,需要抓取京東圖書的評(píng)論,把代碼放出來給大家分享下,希望能有所幫助2014-08-08
使用Python腳本在Linux下實(shí)現(xiàn)部分Bash Shell的教程
這篇文章主要介紹了使用Python腳本在Linux下實(shí)現(xiàn)部分Bash Shell的教程,包括一些簡(jiǎn)單的輸入輸出和郵件功能,需要的朋友可以參考下2015-04-04
利用Flask實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)增刪改查API的全過程
這篇文章主要介紹了如何用Flask實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)增刪改查API,本文圍繞用Flask實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)增刪改查(CRUD)API展開,并附上完整代碼示例,幫助開發(fā)者掌握Flask結(jié)合MySQL開發(fā)API的方法,需要的朋友可以參考下2025-09-09

