在自动化操作社交媒体平台时,如何绕过反爬虫机制一直是个挑战。本文将介绍如何配置Selenium驱动本地Chrome浏览器,并利用User Data目录保留浏览器指纹,实现更接近真实用户的操作行为。
传统的无头浏览器或默认配置的Selenium容易被网站识别为机器人,主要原因在于:
而使用本地Chrome浏览器配合User Data目录可以:
下面是完整的实现代码,它会启动本地Chrome浏览器并加载User Data目录:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import random
import os
import json
def open_xiaohongshu_with_user_data():
try:
# 1. 基础配置 - 浏览器选项
chrome_options = Options()
# 指定用户数据目录(保留浏览器指纹和登录状态)
user_data_dir = os.path.join(os.getcwd(), "user-data")
if not os.path.exists(user_data_dir):
os.makedirs(user_data_dir)
chrome_options.add_argument(f"--user-data-dir={user_data_dir}")
# 2. 反检测核心配置 - 隐藏WebDriver特征
chrome_options.add_argument("--disable-blink-features=AutomationControlled") # 隐藏自动化标识
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) # 排除自动化开关
# 3. 模拟真实浏览器环境
# 设置高版本User-Agent
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
chrome_options.add_argument(f"user-agent={user_agent}")
# 指定本地Chrome浏览器二进制文件路径(当前目录下的mychrome.exe)
chrome_binary_path = os.path.join(os.getcwd(), "mychrome.exe")
if os.path.exists(chrome_binary_path):
chrome_options.binary_location = chrome_binary_path
else:
print(f"警告: 未找到{chrome_binary_path},将使用系统默认Chrome")
# 4. 浏览器环境优化
chrome_options.add_argument("--disable-gpu") # 禁用GPU加速
chrome_options.add_argument("--disable-features=IsolateOrigins,site-per-process") # 禁用站点隔离
chrome_options.add_argument(f"--window-size={random.randint(1366, 1920)},{random.randint(768, 1080)}") # 随机窗口尺寸
chrome_options.add_argument("--start-maximized") # 最大化窗口(可选)
# 5. 驱动配置(当前目录下的chromedriver)
chrome_driver_path = os.path.join(os.getcwd(), "chromedriver116.exe")
if not os.path.exists(chrome_driver_path):
raise FileNotFoundError(f"未找到驱动文件: {chrome_driver_path}")
service = Service(chrome_driver_path)
# 6. 创建浏览器驱动
driver = webdriver.Chrome(service=service, options=chrome_options)
# 7. 注入JavaScript隐藏WebDriver特征
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
// 隐藏webdriver属性
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
// 模拟Chrome浏览器属性
window.navigator.chrome = {
runtime: {},
browser: {
getVersion: () => '116.0.5845.141'
}
};
// 模拟媒体设备
navigator.mediaDevices = {
getDevices: () => Promise.resolve([])
};
// 模拟WebGL指纹(可选,增强反检测)
const getParameter = WebGLRenderingContext.getParameter;
WebGLRenderingContext.prototype.getParameter = function(parameter) {
if (parameter === 37445) { // UNMASKED_VENDOR_WEBGL
return 'Intel Open Source Technology Center';
}
if (parameter === 37446) { // UNMASKED_RENDERER_WEBGL
return 'Mesa DRI Intel(R) HD Graphics 630 (Kaby Lake GT2)';
}
return getParameter.call(this, parameter);
};
"""
})
# 8. 打开指纹检测页面验证配置
driver.get("https://fingerprintjs.github.io/BotD/main/")
print("已打开指纹检测页面,请查看检测结果")
# 9. 模拟人机行为 - 滚动和延时
wait = WebDriverWait(driver, 10)
for _ in range(3):
scroll_height = driver.execute_script("return document.body.scrollHeight")
driver.execute_script(f"window.scrollTo(0, {random.randint(0, scroll_height)})")
time.sleep(random.uniform(1, 3)) # 随机延时,模拟人类操作
# 10. 打印页面检测结果
try:
result_element = wait.until(EC.presence_of_element_located((By.ID, 'result')))
print("页面检测结果:", result_element.text)
except Exception as e:
print("未获取到检测结果元素:", e)
# 保持窗口打开,手动查看检测结果
input("按Enter键关闭浏览器...")
except Exception as e:
print(f"出现错误: {e}")
finally:
if 'driver' in locals():
driver.quit()
print("浏览器已关闭")
if __name__ == "__main__":
open_xiaohongshu_with_user_data()
上述代码实现了几个关键功能模块:
# 使用当前目录下的文件
chrome_binary_path = os.path.join(os.getcwd(), "mychrome.exe")
chrome_driver_path = os.path.join(os.getcwd(), "chromedriver116.exe")
user_data_dir = os.path.join(os.getcwd(), "user-data")
通过os.getcwd()
获取当前工作目录,确保程序会优先查找并使用当前目录下的Chrome二进制文件、驱动和User Data目录。
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
这两行配置是反检测的核心,它们会隐藏Selenium的自动化标识,让网站难以察觉这是一个机器人浏览器。
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
// 其他模拟代码...
"""
})
通过注入JavaScript代码,我们模拟了真实浏览器的navigator
对象,隐藏了WebDriver特征并伪造了浏览器属性。
for _ in range(3):
scroll_height = driver.execute_script("return document.body.scrollHeight")
driver.execute_script(f"window.scrollTo(0, {random.randint(0, scroll_height)})")
time.sleep(random.uniform(1, 3))
随机滚动和延时操作是模拟人类浏览行为的关键,避免了机器人式的机械操作。
准备文件
mychrome.exe
并放在当前目录chromedriver116.exe
驱动程序project/
├── mychrome.exe
├── chromedriver116.exe
└── user-data/
首次运行
user-data
目录并启动Chromeuser-data
中后续运行
user-data
中的登录状态多用户配置
user-data
目录,每个目录对应一个账号user_data_dir
参数切换不同账号动态User-Agent
代理配置
chrome_options.add_argument(f"--proxy-server={proxy_ip}:{proxy_port}")
行为模式优化
通过这种方式配置的Selenium浏览器,能够极大降低被小红书等平台检测为机器人的概率,同时保留登录状态和浏览习惯,为自动化操作提供了更稳定的环境。在实际使用中,建议结合具体业务场景进一步优化行为模拟策略,以获得更好的效果。