基礎
啟用隱身模式
from pyppeteer import launch
async def start_browser():
browser = await launch(**{"headless": False})
browser_context = await browser.createIncognitoBrowserContext()
page = await browser_context.newPage()
await page.goto("http://www.baidu.com")
await browser.close()
return
非隱身模式啟用插件
from pyppeteer import launch
async def start_browser():
chrome_extension_path = "插件所在目錄"
args = [
"--load-extension={}".format(chrome_extension_path),
"--disable-extensions-except={}".format(chrome_extension_path),
]
browser = await launch(**{"headless": False, "args": args})
page = await browser.newPage()
await page.goto("http://www.baidu.com")
await browser.close()
return
正文
如果是非隱身模式啟用插件的話,上面的代碼就可以了。但很蛋疼的是,有個場景必須得在隱身模式下運行,還需要插件。如果是人為操作的話,啟用步驟如下:
- 打開插件管理頁面 chrome://extensions/
- 找到需要啟動的插件,點擊詳細信息,進入插件詳情。
- 在詳情中尋找: 在無痕模式下啟用的選項並勾選
然后就可以在隱身模式下使用了。
BUT,我的目的是自動隱身模式下啟用插件。Google大法開始啟用。。。
一個小時后。。。WTF,反正我是沒找到正常的實現方式,貌似pyppeteer不支持,不知道是不是有什么隱藏的chrome參數能用的,但找起來太費勁了,放棄。
其實在Google過程中也找到了一個辦法,只是不那么優雅而已。其實很簡單,就是把上面人為操作的步驟自動化一下。
代碼並不是很復雜,不過在實現過程中還是學到了點新東西的。
代碼如下:
import asyncio
from pyppeteer.browser import Browser
async def enable_extension_for_incognito(browser: Browser, extension_name: str) -> bool:
"""
在隱身模式下啟用指定插件
Args:
extension_name: 插件名稱
Returns:
"""
# 新開非隱身窗口並打開擴展程序頁面
page = await browser.newPage()
await page.goto("chrome://extensions/")
# 執行js代碼獲取指定的擴展id
get_eid_js = (
"""() => {
var extension_id;
document.querySelector("extensions-manager").shadowRoot
.querySelector("extensions-item-list").shadowRoot
.querySelectorAll("extensions-item").forEach(function (e) {
var e_name = e.shadowRoot.querySelector("#name").textContent.trim();
if (e_name == "%s") {
extension_id = e.getAttribute("id")
}
})
return extension_id
}"""
% extension_name
)
extension_id = await page.evaluate(get_eid_js)
await asyncio.sleep(1)
# 進入擴展詳情頁面
await page.goto("chrome://extensions/?id={}".format(extension_id))
# 判斷插件是否啟用
get_extension_status_js = """
() => {
return document.querySelector("extensions-manager").shadowRoot
.querySelector("extensions-detail-view").shadowRoot
.querySelector("extensions-toggle-row#allow-incognito").shadowRoot
.querySelector("#crToggle").getAttribute("aria-pressed")
}
"""
r = await page.evaluate(get_extension_status_js)
if r != "true":
# 點擊在無痕模式下啟用
click_enable_js = """
() => {document.querySelector("extensions-manager").shadowRoot
.querySelector("extensions-detail-view").shadowRoot
.querySelector("extensions-toggle-row#allow-incognito").shadowRoot
.querySelector("#crToggle").shadowRoot
.querySelector("button").click()}
"""
await page.evaluate(click_enable_js)
await asyncio.sleep(1)
# 確認是否啟用成功
r = await page.evaluate(get_extension_status_js)
assert r == "true"
await page.close()
return True
需要注意的地方有兩個:
- shadowRoot這個東西第一次遇到。。。
- 瀏覽器有記憶功能。如果你已經啟用了某個插件,那么之后再打開的時候插件就已經是啟用狀態了。