小红书自动化操作:使用本地Chrome和User Data实现高效反检测
小红书自动化操作:使用本地Chrome和User Data实现高效反检测
在自动化操作社交媒体平台时,如何绕过反爬虫机制一直是个挑战。本文将介绍如何配置Selenium驱动本地Chrome浏览器,并利用User Data目录保留浏览器指纹,实现更接近真实用户的操作行为。
为什么使用本地Chrome和User Data?
传统的无头浏览器或默认配置的Selenium容易被网站识别为机器人,主要原因在于:
- 浏览器指纹特征明显(User-Agent、WebDriver标识等)
- 缺少真实用户的浏览习惯和状态记录
- 操作行为过于规律,缺乏随机性
而使用本地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 jsondef 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-Agentuser_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_pathelse: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_WEBGLreturn 'Intel Open Source Technology Center';}if (parameter === 37446) { // UNMASKED_RENDERER_WEBGLreturn '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))
随机滚动和延时操作是模拟人类浏览行为的关键,避免了机器人式的机械操作。
部署与使用指南
-
准备文件
- 将Chrome浏览器安装包重命名为
mychrome.exe
并放在当前目录 - 下载与Chrome版本匹配的
chromedriver116.exe
驱动程序 - 确保目录结构如下:
project/ ├── mychrome.exe ├── chromedriver116.exe └── user-data/
- 将Chrome浏览器安装包重命名为
-
首次运行
- 首次运行时,程序会创建
user-data
目录并启动Chrome - 浏览器会打开指纹检测页面,手动完成登录操作
- 登录后按Enter键关闭浏览器,登录状态会保存在
user-data
中
- 首次运行时,程序会创建
-
后续运行
- 再次运行程序时,会加载
user-data
中的登录状态 - 可以直接访问小红书等平台,无需重复登录
- 程序会保持与首次运行一致的浏览器指纹
- 再次运行程序时,会加载
进阶优化建议
-
多用户配置
- 创建多个
user-data
目录,每个目录对应一个账号 - 通过修改
user_data_dir
参数切换不同账号
- 创建多个
-
动态User-Agent
- 维护一个User-Agent池,每次运行时随机选择
- 可以模拟不同设备和浏览器版本的访问行为
-
代理配置
- 添加代理支持,避免单一IP频繁访问导致封锁
chrome_options.add_argument(f"--proxy-server={proxy_ip}:{proxy_port}")
-
行为模式优化
- 增加更多随机操作,如鼠标移动轨迹、点击位置随机性
- 模拟真实用户的浏览深度和停留时间
通过这种方式配置的Selenium浏览器,能够极大降低被小红书等平台检测为机器人的概率,同时保留登录状态和浏览习惯,为自动化操作提供了更稳定的环境。在实际使用中,建议结合具体业务场景进一步优化行为模拟策略,以获得更好的效果。