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("浏览器已关闭")