selenium反爬案例-2.0

js脚本代码

// 隐藏 Selenium 自动化特征的 JavaScript 脚本

// 1. 隐藏 navigator.webdriver
try {
    Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
} catch (e) {
    console.warn("无法重定义 'navigator.webdriver'");
}

// 2. 修改 navigator.plugins 和 navigator.languages
try {
    Object.defineProperty(navigator, 'plugins', { get: () => [] });
    Object.defineProperty(navigator, 'languages', { get: () => ['en-US', 'en'] });
} catch (e) {
    console.warn("无法修改 'navigator.plugins' 或 'navigator.languages'");
}

// 3. 模拟真实的 window.outerWidth 和 window.outerHeight
try {
    Object.defineProperty(window, 'outerWidth', { get: () => window.innerWidth });
    Object.defineProperty(window, 'outerHeight', { get: () => window.innerHeight });
} catch (e) {
    console.warn("无法修改 'window.outerWidth' 或 'window.outerHeight'");
}

// 4. 修复 document.visibilityState
try {
    Object.defineProperty(document, 'visibilityState', { get: () => 'visible' });
} catch (e) {
    console.warn("无法修改 'document.visibilityState'");
}

// 5. 模拟用户行为(鼠标和键盘事件)
try {
    const simulateEvent = (type, options = {}) => {
        const event = new Event(type, { bubbles: true, cancelable: true, ...options });
        document.dispatchEvent(event);
    };
    simulateEvent('mousemove', { clientX: 100, clientY: 100 });
    simulateEvent('scroll');
} catch (e) {
    console.warn("无法模拟事件");
}

// 6. 修复权限检测
try {
    const originalQuery = navigator.permissions.query;
    navigator.permissions.query = (parameters) =>
        parameters.name === 'notifications'
            ? Promise.resolve({ state: 'denied' })
            : originalQuery(parameters);
} catch (e) {
    console.warn("无法修复 'navigator.permissions.query'");
}

// 7. 修改 User-Agent 避免检测到 HeadlessChrome
const userAgent = navigator.userAgent;
if (userAgent.includes('HeadlessChrome')) {
    try {
        Object.defineProperty(navigator, 'userAgent', {
            get: () => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        });
    } catch (e) {
        console.warn("无法修改 'navigator.userAgent'");
    }
}

// 8. 覆盖 console 的方法
try {
    console.log = function() {};
    console.info = function() {};
    console.error = function() {};
} catch (e) {
    console.warn("无法覆盖 'console' 方法");
}

爬虫代码

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

# 1. 配置 Selenium ChromeOptions
opt = webdriver.ChromeOptions()
opt.add_argument('--disable-infobars')  # 禁用 "Chrome正在被自动化软件控制" 的提示栏
opt.add_experimental_option('excludeSwitches', ['enable-automation'])  # 移除自动化提示
opt.add_experimental_option('useAutomationExtension', False)  # 禁用自动化扩展
opt.add_argument('--disable-blink-features=AutomationControlled')  # 禁用 Blink 特性检测
opt.add_argument('--start-maximized')  # 启动时窗口最大化
opt.add_argument('--disable-dev-shm-usage')  # 防止因内存不足导致的问题
opt.add_argument('--no-sandbox')  # 禁用沙盒
opt.add_argument('--disable-extensions')  # 禁用扩展

# 自定义 User-Agent
user_agent = (
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
    "(KHTML, like Gecko) Chrome/110.0.5481.178 Safari/537.36"
)
opt.add_argument(f'user-agent={user_agent}')

# 2. 启动 Chrome 浏览器
driver = webdriver.Chrome(options=opt)

# 3. 执行 JavaScript 文件
with open("hide_selenium-2.0.js", "r", encoding="utf-8") as file:
    js_script = file.read()

print("执行的 JavaScript 代码如下:")
print(js_script)

driver.execute_script(js_script)  # 执行 JavaScript
print("JavaScript 代码执行完成!")

# 4. 打开目标网址
url = "https://www.aqistudy.cn/"
driver.get(url)
print("页面已加载:", url)

# 5. 模拟用户行为
actions = ActionChains(driver)
actions.move_by_offset(100, 200).perform()  # 模拟鼠标从当前位置向右下移动 100 像素和 200 像素
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  # 模拟滚动到页面底部
time.sleep(2)  # 等待 2 秒,模拟用户在页面底部停留时间
driver.execute_script("window.scrollTo(0, 0);")  # 模拟滚动回页面顶部
time.sleep(2)  # 等待 2 秒,模拟用户在页面顶部停留时间

# 6. 等待页面加载
driver.implicitly_wait(10)
print("页面加载完成!")
# 7. 保持窗口打开 10 秒,供观察效果
time.sleep(10)
print("页面无异常效果!可开始接下来的操作!")

# 8. 关闭浏览器
driver.quit()
print("浏览器已关闭")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值