当前位置: 首页 > news >正文

小红书自动化操作:使用本地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()
核心配置解析

上述代码实现了几个关键功能模块:

  1. 本地文件定位
# 使用当前目录下的文件
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目录。

  1. 反检测配置
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])

这两行配置是反检测的核心,它们会隐藏Selenium的自动化标识,让网站难以察觉这是一个机器人浏览器。

  1. 浏览器指纹模拟
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})// 其他模拟代码..."""
})

通过注入JavaScript代码,我们模拟了真实浏览器的navigator对象,隐藏了WebDriver特征并伪造了浏览器属性。

  1. 人机行为模拟
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))

随机滚动和延时操作是模拟人类浏览行为的关键,避免了机器人式的机械操作。

部署与使用指南
  1. 准备文件

    • 将Chrome浏览器安装包重命名为mychrome.exe并放在当前目录
    • 下载与Chrome版本匹配的chromedriver116.exe驱动程序
    • 确保目录结构如下:
      project/
      ├── mychrome.exe
      ├── chromedriver116.exe
      └── user-data/
      
  2. 首次运行

    • 首次运行时,程序会创建user-data目录并启动Chrome
    • 浏览器会打开指纹检测页面,手动完成登录操作
    • 登录后按Enter键关闭浏览器,登录状态会保存在user-data
  3. 后续运行

    • 再次运行程序时,会加载user-data中的登录状态
    • 可以直接访问小红书等平台,无需重复登录
    • 程序会保持与首次运行一致的浏览器指纹
进阶优化建议
  1. 多用户配置

    • 创建多个user-data目录,每个目录对应一个账号
    • 通过修改user_data_dir参数切换不同账号
  2. 动态User-Agent

    • 维护一个User-Agent池,每次运行时随机选择
    • 可以模拟不同设备和浏览器版本的访问行为
  3. 代理配置

    • 添加代理支持,避免单一IP频繁访问导致封锁
    chrome_options.add_argument(f"--proxy-server={proxy_ip}:{proxy_port}")
    
  4. 行为模式优化

    • 增加更多随机操作,如鼠标移动轨迹、点击位置随机性
    • 模拟真实用户的浏览深度和停留时间

通过这种方式配置的Selenium浏览器,能够极大降低被小红书等平台检测为机器人的概率,同时保留登录状态和浏览习惯,为自动化操作提供了更稳定的环境。在实际使用中,建议结合具体业务场景进一步优化行为模拟策略,以获得更好的效果。

http://www.lryc.cn/news/579549.html

相关文章:

  • Linux系统(信号篇):信号的处理
  • spring6合集——spring概述以及OCP、DIP、IOC原则
  • MongoDB Memory Server与完整的MongoDB的主要区别
  • CANFD芯片在工控机数据采集和测量中的应用分析
  • 重新学习Vue中的按键监听和鼠标监听
  • PDF的图片文字识别工具
  • 110道Python面试题(真题)
  • Spring AI ETL Pipeline使用指南
  • 01_前后端打包发布、API接口调试
  • Stata如何做机器学习?——SHAP解释框架下的足球运动员价值驱动因素识别:基于H2O集成学习模型
  • Spring生态:引领企业级开发新纪元
  • Linux开发工具——gcc/g++
  • 【CSS揭秘】笔记
  • Ubuntu20.4编译AOSP源码实践
  • 开源 C# .net mvc 开发(六)发送邮件、定时以及CMD编程
  • XILINX Ultrascale+ Kintex系列FPGA的架构
  • 支持向量机(SVM)分类
  • ReactNative【实战系列教程】我的小红书 3 -- 自定义底栏Tab导航(含图片选择 expo-image-picker 的使用)
  • GPT-2论文阅读:Language Models are Unsupervised Multitask Learners
  • Mac电脑 触摸板增强工具 BetterTouchTool
  • 探秘展销编辑器:相较于传统展销的卓越优势与甄选指南​
  • Redis实现哨兵模式
  • MCP协议打破数据孤岛
  • 在Ubuntu24上安装ollama
  • VsCode 配置 C/C++ 开发环境
  • 【第三章:神经网络原理详解与Pytorch入门】01.神经网络算法理论详解与实践-(3)神经网络中的前向传播、反向传播的原理与实现
  • JavaScript的初步学习
  • 2021/7 N2 jlpt 词汇
  • npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree
  • Apache POI 详解 - Java 操作 Excel/Word/PPT