Selenium 使用cdp连接指纹浏览器
selenium使用指纹浏览器和普通的区别是用itbrowser代替普通的浏览器,并且通过cdp连接,在代码上无需进行其他逻辑上的修改。
要通过Selenium连接一个已经运行的Chrome浏览器实例,你可以使用Chrome DevTools Protocol (CDP)。这通常用于调试或自动化已经打开的浏览器会话。
首先启动浏览器
具体请查看 如何通过命令行和代码启动itbrowser并指定指纹
各语言实现示例
Java实现
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.v85.log.Log;
public class ConnectToRunningChrome {
public static void main(String[] args) {
// 设置ChromeDriver路径
System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
// 配置Chrome选项
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
// 创建WebDriver实例
WebDriver driver = new ChromeDriver(options);
// 连接到CDP
DevTools devTools = ((ChromeDriver) driver).getDevTools();
devTools.createSession();
devTools.send(Log.enable());
devTools.addListener(Log.entryAdded(), logEntry -> {
System.out.println("Log: " + logEntry.getText());
});
// 使用driver进行操作
driver.get("https://www.example.com");
System.out.println("Title: " + driver.getTitle());
// 关闭浏览器
driver.quit();
}
}
JavaScript (Node.js) 实现
const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
async function connectToRunningChrome() {
// 配置Chrome选项
let options = new chrome.Options();
options.setChromeBinaryPath('/path/to/chrome');
options.addArguments('--remote-debugging-port=9222');
options.debuggerAddress('127.0.0.1:9222');
// 创建WebDriver实例
let driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(options)
.build();
try {
// 连接到CDP
const cdpConnection = await driver.createCDPConnection('page');
// 使用driver进行操作
await driver.get('https://www.example.com');
console.log('Title:', await driver.getTitle());
} finally {
// 关闭浏览器
await driver.quit();
}
}
connectToRunningChrome().catch(console.error);
Python实现
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 配置Chrome选项
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
# 创建WebDriver实例
driver = webdriver.Chrome(options=chrome_options)
try:
# 连接到CDP
driver.execute_cdp_cmd("Browser.getVersion", {})
# 使用driver进行操作
driver.get("https://www.example.com")
print("Title:", driver.title)
finally:
# 关闭浏览器
driver.quit()
Golang实现
package main
import (
"fmt"
"log"
"time"
"github.com/tebeka/selenium"
"github.com/tebeka/selenium/chrome"
)
func main() {
// 配置Selenium服务
const (
seleniumPath = "/path/to/chromedriver"
port = 4444
)
opts := []selenium.ServiceOption{}
service, err := selenium.NewChromeDriverService(seleniumPath, port, opts...)
if err != nil {
log.Fatalf("Error starting the ChromeDriver server: %v", err)
}
defer service.Stop()
// 配置Chrome选项
caps := selenium.Capabilities{
"browserName": "chrome",
}
chromeCaps := chrome.Capabilities{
DebuggerAddr: "127.0.0.1:9222",
}
caps.AddChrome(chromeCaps)
// 创建WebDriver实例
wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
if err != nil {
log.Fatalf("Error connecting to Chrome: %v", err)
}
defer wd.Quit()
// 使用driver进行操作
err = wd.Get("https://www.example.com")
if err != nil {
log.Fatalf("Error getting page: %v", err)
}
title, err := wd.Title()
if err != nil {
log.Fatalf("Error getting title: %v", err)
}
fmt.Println("Title:", title)
time.Sleep(5 * time.Second)
}
注意事项
-
确保Chrome浏览器是以调试模式启动的,例如:
chrome.exe --itbrowser=myfingerprint.json --remote-debugging-port=9222 --user-data-dir=/path/to/temp/dir
-
各语言实现中,需要正确设置ChromeDriver的路径和Chrome浏览器的路径。
-
端口号(如9222)需要保持一致,既在启动Chrome时指定的端口,也在代码中连接的端口。