通用 JS 脚本_隐藏 Selenium 自动化特征_防止被反爬_的python例子

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/110.0.5481.178 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("通用 JS 脚本_隐藏 Selenium 自动化特征_防止被反爬.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("浏览器已关闭")

### 关于集信达虫的相关信息 集信达虫并非一个广泛公开的标准工具或框架名称,因此其具体实现方式可能依赖于具体的业务场景和技术栈。然而,基于已有的参考资料以及常见的虫技术实践,可以推测集信达虫可能是某个特定领域内的定制化解决方案,或者是一个内部开发的自动化数据采集工具。 以下是关于如何构建类似功能的虫的一些常见技术和方法: #### 1. **虫的基础架构** 网络虫一般分为两种主要类型:通用虫和聚焦虫[^1]。对于像“集信达”这样的应用场景,更倾向于使用聚焦虫来满足特定的数据需求。这种类型的虫会专注于某一类网站或某些特定的内容结构,通过预定义规则过滤掉无关的信息。 #### 2. **Selenium 的应用实例** 如果目标站点涉及动态加载内容(例如 JavaScript 渲染),则可以考虑采用 Selenium 工具库来进行页面交互操作并提取所需数据[^2]。下面展示了一个简单的 Python 脚本例子用于演示这一过程: ```python from selenium import webdriver # 初始化 WebDriver 对象 (需提前下载对应版本驱动程序) driver = webdriver.Chrome(executable_path="./chromedriver") try: # 打开目标 URL 地址 driver.get("https://example.com/target-page") # 查找所有符合条件的文章列表项 elements = driver.find_elements_by_xpath("//div[contains(@class,'article-list')]//a") for elem in elements[:5]: # 提取前五个链接作为样例输出 link_text = elem.text.strip() href_value = elem.get_attribute('href') print(f"{link_text}: {href_value}") finally: driver.quit() # 完成后关闭浏览器窗口释放资源 ``` 此代码片段展示了如何利用 XPath 表达式定位 HTML 文档中的节点集合,并从中解析出超链接地址及其描述文字等内容。 #### 3. **API 接口调用与身份验证机制** 当面对受保护的目标服务端 API 时,则需要额外注意请求头设置、令牌管理等问题[^3]。比如,在发起 GET 请求之前先完成 OAuth 认证流程获得有效 access_token 后再将其附加到后续每次访问所需的 HTTP Header 字段之中;又或者是模拟真实用户的登录行为从而绕过措施等等。 #### 4. **实际案例分析——华安信达论坛自动登录** 这里提供了一种较为基础的手动构造 POST 请求体的方式实现了某 BBS 平台的身份认证逻辑[^4]: ```python import urllib.request as request import http.cookiejar as cookielib def login(username, password): cj = cookielib.CookieJar() opener = request.build_opener(request.HTTPCookieProcessor(cj)) main_page_url = 'http://bbs.example.org/' resp_main = opener.open(main_page_url) sid = '' for c in cj: if c.name == "phpbb2mysql_sid": sid = c.value form_data = { 'username': username, 'password': password, 'autologin': 'on', 'sid': sid, 'redirect': '/index.php' } encoded_form = urlencode(form_data).encode() auth_endpoint = f'{main_page_url}ucp.php?mode=login' req_auth = request.Request(auth_endpoint, data=encoded_form) res_auth = opener.open(req_auth) if __name__ == '__main__': user_id = input('Enter your username:') passwd = getpass.getpass(prompt='Password:') try: login(user_id, passwd) print('Login successful.') except Exception as e: print(e) ``` 该脚本通过 Cookie 处理器捕获初始响应中携带 session id 参数值,并以此为基础组装完整的表单提交资料最终达成无缝切换至个人中心界面的效果。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值