如何使用 Puppeteer 避免机器人检测?

为什么有反机器人系统?

  • 保护网站资源和性能

爬虫和机器人程序在短时间内可以发送大量请求,消耗服务器资源,导致网站性能下降甚至崩溃。

反机器人系统可以帮助网站管理和限制这些请求,从而保持网站的稳定性和可用性。

  • 防止数据盗窃和滥用

一些机器人程序爬取网站内容进行未经授权的使用,例如内容盗窃和数据抓取。反机器人系统可以帮助保护网站上的数据和内容,防止未经授权的访问和滥用。

  • 提高安全性

恶意机器人程序可以用于各种攻击,例如分布式拒绝服务(DDoS)攻击、暴力破解密码等。反机器人系统可以帮助识别并阻止这些恶意行为,提高网站的整体安全性。

  • 保护用户隐私

一些机器人程序可能会试图获取用户的个人信息,如电子邮件地址、联系方式等。反机器人系统可以帮助保护用户隐私,防止这些信息被非法收集和滥用。

  • 提高用户体验

当机器人程序大量访问网站时,可能会影响正常用户的速度和体验。通过限制机器人流量,网站可以确保真实用户的更好体验。

  • 防止广告欺诈

一些机器人程序模拟用户点击广告以进行广告欺诈,导致广告商蒙受损失。反机器人检测可以识别并阻止这些虚假点击,保护广告商的利益。

反机器人系统如何工作?

反机器人系统通过多种技术和方法识别和阻止机器人流量。这里主要介绍6种常见的分析方法:

1. 行为分析

  • 监控用户在网站上的行为模式,如鼠标移动、点击、滚动和键盘输入。机器人程序通常无法模拟自然的人类行为。
  • 分析用户请求的速度和频率。机器人通常以非人类的速度发送请求,例如每秒大量请求。

2. 设备和环境检测

  • 收集用户的浏览器指纹信息,包括浏览器类型、版本、操作系统、插件等。机器人程序的浏览器指纹通常与真实用户不同。
  • 检查请求头中的User-Agent字段。许多机器人程序使用默认或异常的User-Agent值。

3. 挑战-响应机制

  • 反机器人系统使用CAPTCHA或reCAPTCHA要求用户执行某些任务(例如识别图片中的物体)以验证其人类身份。
  • 在网页中插入隐藏字段或链接(蜜罐),真实用户不会与这些元素互动,而机器人程序可能会触发这些陷阱,从而暴露其身份。

4. IP和地理位置检测

  • 使用已知恶意IP地址列表,阻止这些地址的请求。
  • 基于IP地址的地理位置限制访问。例如,只允许特定国家或地区的请求。

5. 流量分析

  • 监控和分析网站的流量模式,识别异常流量峰值和分布。
  • 分析用户会话的时长和互动模式。机器人的会话通常较短且有规律。

6. 机器学习

使用机器学习算法分析和识别正常用户与机器人的行为差异。机器学习模型可以不断学习和适应新的机器人行为。

网站如何检测Puppeteer?

网站可以检查页面上的特定JavaScript变量,这些变量通常与Puppeteer的使用相关。

例如,他们可能会查找包含"puppeteer"或其他相关标识符的变量名。

for (let key in window) {
    if (key.includes('puppeteer') || key.includes('webdriver')) {
        // Detected Puppeteer
    }
}

Puppeteer还会修改浏览器行为以自动执行任务。因此,网站可能会检查 navigator.webdriver等属性的存在和值,以确定是否有自动化工具在控制浏览器。

此属性在Puppeteer中通常设置为 true

绕过机器人检测的最简单方法 - Nstbrowser

想快速绕过机器人检测?现在开始免费使用Nstbrowser吧!Nstbrowser提供:

  • 智能IP轮换
  • 高级代理
  • CAPTCHA解答器

Nstbrowser不仅使用真实的浏览器指纹进行网络访问,还模拟真实用户的行为和习惯,使其无法被反机器人系统识别。

此外,为简化网络抓取和自动化,Nstbrowser配备了强大的网站解锁技术,提供无缝的网络访问体验。

使用Puppeteer避免机器人检测的8种最佳方法

如上所述,机器人检测已成为网络爬虫程序的一个主要问题。但别担心!我们仍然可以轻松解决它。

除了使用Nstbrowser,以下是一些使用Puppeteer避免机器人检测的技巧:

方法1. IP/代理轮换

大多数机器人检测器的主要检测方式是通过检查IP。Web服务器可以通过维护每个请求的日志来推导IP地址的模式。

他们使用Web应用防火墙(WAF)跟踪和阻止IP地址活动,并将可疑IP列入黑名单。重复和编程的请求会损害IP信誉并导致永久封锁。

要避免机器人检测,您可以使用IP轮换或Puppeteer设置代理:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    args: [
      '--proxy-server=http://your_proxy_ip:your_proxy_port',
      // Add any other Chrome flags you need
    ],
  });
  const page = await browser.newPage();

  // Now Puppeteer will use the proxy specified above
  await page.goto('https://example.com');
  
  // Continue with your automation tasks

  await browser.close();
})();
  • --proxy-server=http://your_proxy_ip:your_proxy_port 参数指定代理服务器的地址和端口。
  • 您可以根据需要添加其他Chrome标志(args)。

请确保将 your_proxy_ip 和 your_proxy_port 替换为实际代理服务器的IP地址和端口号。

方法2. 旋转HTTP头信息和User-Agent

网站通常检查请求的User-Agent以确定请求来自哪个浏览器和操作系统。

通常,Puppeteer使用固定的User-Agent,这使其容易被检测到。通过随机化User-Agent,请求将更有可能被识别为来自不同的真实用户。

此外,反机器人系统还会检查HTTP头以识别机器人。这些头包括 Accept-LanguageAccept-EncodingCache-Control 等。

默认的HTTP头也可能暴露自动化工具的使用。随机化和设置常见的HTTP头将帮助您的请求更加真实。

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
const randomUseragent = require('random-useragent'); // Random User-Agent Library

puppeteer.use(StealthPlugin());

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();

  // Define common HTTP headers
  const commonHeaders = {
    'Accept-Language': 'en-US,en;q=0.9',
    'Accept-Encoding': 'gzip, deflate, br',
    'Cache-Control': 'no-cache',
    'Upgrade-Insecure-Requests': '1',
  };

  // Randomize User-Agent and HTTP headers
  const setRandomHeaders = async (page) => {
    const userAgent = randomUseragent.getRandom(); // Get random User-Agent
    await page.setUserAgent(userAgent);

    await page.setExtraHTTPHeaders(commonHeaders);
  };

  await setRandomHeaders(page);

  await page.evaluateOnNewDocument(() => {
    Object.defineProperty(navigator, 'webdriver', {
      get: () => false,
    });
  });

  await page.goto('https://example.com', {
    waitUntil: 'networkidle2',
  });

方法3. 禁用navigator.webdriver

默认情况下,Puppeteer将navigator.webdriver属性设置为true。这暴露了自动化工具的存在。通过禁用或修改此属性,您可以减少被检测的机会。

await page.evaluateOnNewDocument(() => {
  Object.defineProperty(navigator, 'webdriver', { get: () => false });
});

方法4. 使用​stealth插件​

使用 puppeteer-extra-plugin-stealth 插件可以帮助Puppeteer避免被检测为机器人。

该插件修改了一些浏览器的默认行为和特性,使其看起来像是一个真实用户。

首先,您需要安装 puppeteer-extra 和 puppeteer-extra-plugin-stealth 插件:

npm install puppeteer-extra puppeteer-extra-plugin-stealth

接下来,您可以在代码中使用这些插件来启动Puppeteer:

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());

const browser = await puppeteer.launch

({ headless: true });

方法5. 使用Cookie

如果您想从社交媒体平台或其他需要身份验证的网站抓取数据,通常需要重复登录。

这种重复的身份验证请求会触发警报,账号可能会被封锁或面临CAPTCHA或JavaScript认证挑战。

我们可以通过使用Cookie来避免这种情况。登录一次后,我们可以收集登录会话Cookie,以便将来重复使用。

方法6. 使用CAPTCHA解答服务

在进行网络抓取时,您肯定会遇到CAPTCHA识别问题。这时,您需要利用CAPTCHA解答服务。

通常,这些服务使用真实用户来解决CAPTCHA,从而减少被检测为机器人的可能性。

这可以确保绕过机器人检测,并有助于降低运行机器人的整体成本。

方法7. 延迟输入和随机化

真实用户无法在一分钟内发出500个请求!

真实用户也无法有固定的浏览习惯和程序!

因此,为了防止被反机器人系统轻易检测到,我们需要在使用Puppeteer时,为自动化程序设置延迟输入和一些随机化操作。这样可以模拟真实用户,从而在一定程度上降低被检测的风险。

  • 模拟人类输入速度,而不是立即输入所有内容:
await page.type('input[name=username]', 'myUsername', { delay: 100 });
await page.type('input[name=password]', 'myPassword', { delay: 100 });
  • 随机化鼠标移动、点击和滚动操作:
await page.mouse.move(100, 100);
await page.mouse.click(100, 100);

方法8. 使用浏览器扩展

在使用Puppeteer运行自动化任务时,有时可以利用浏览器扩展来帮助绕过一些机器人检测。

这些扩展可以修改浏览器的行为,使其看起来更像是由真实用户操作的。

加载本地扩展:

  • 下载您想要使用的浏览器扩展(例如Chrome扩展)到本地。
  • 在启动Puppeteer时,通过指定args参数加载扩展:
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    headless: false, // non-headless mode
    args: [
      `--disable-extensions-except=/path/to/extension/`, // Load extensions with specified paths
      `--load-extension=/path/to/extension/`
    ]
  });
  const page = await browser.newPage();
  await page.goto('https://example.com');
  // Continue executing your code
})();
  • 这将允许您在Puppeteer控制的浏览器实例中加载和使用特定扩展,有时可以帮助绕过机器人检测。

更改默认Chrome扩展路径

Puppeteer默认使用一个空的扩展目录来模拟Chrome。您可以通过设置userDataDir来指定一个自定义的用户数据目录,并在其中预加载所需的扩展。

结语

在本文中,我们讨论了:

  • 为什么网站使用反机器人系统?
  • 它们如何工作?
  • 使用Puppeteer避免机器人检测的8种最佳方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/784292.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑马点评商户缓存查询作业——Redis中查询商户类型

记录下自己在gpt帮助下完成的第一个需求~~~ 1. ShopTypeController 2. IShopTypeService 3. ShopTypeServiceImpl(模仿ShopServiceImpl来写的) 一共分为“1.redis中查询缓存”→“2.判断缓存是否存在,存在直接返回”→“3.缓存不存在则去查数…

sql盲注

文章目录 布尔盲注时间盲注 布尔盲注 介绍:在网页只给你两种回显的时候是用,类似于布尔类型的数据,1表示正确,0表示错误。 特点:思路简单,步骤繁琐且麻烦。 核心函数: length()函数substr()函…

【MYSQL】如何解决 bin log 与 redo log 的一致性问题

该问题问的其实就是redo log 的两阶段提交 为什么说redo log 具有崩溃恢复的能力 MySQL Server 层拥有的 bin log 只能用于归档,不足以实现崩溃恢复(crash-safe),需要借助 InnoDB 引擎的 redo log 才能拥有崩溃恢复的能力。所谓崩…

【AutoencoderKL】基于stable-diffusion-v1.4的vae对图像重构

模型地址:https://huggingface.co/CompVis/stable-diffusion-v1-4/tree/main/vae 主要参考:Using-Stable-Diffusion-VAE-to-encode-satellite-images sd1.4 vae 下载到本地 from diffusers import AutoencoderKL from PIL import Image import torch import to…

第二证券:资金抱团“高股息”,超三成A股年内创历史新低!

A股商场行情冰火两重天。 “预制菜榜首股”跌破发行价 7月8日,味知香盘中最低跌至19.26元/股,股价跌破发行价,并创前史新低。揭露资料显现,公司是集研发、生产、销售为一体的半成品菜企业,现在具有8大产品系列&#…

九科bit-Worker RPA 内容学习

简介: 什么是RPA? RPA(Robotic Process Automation,机器人流程自动化)本质上是一种“AI数字员工”,针对企业中存在的大批量、重复性、机械化人工操作,通过模拟人的工作流程使之实现自动化。 b…

Java | Leetcode Java题解之第219题存在重复元素II

题目&#xff1a; 题解&#xff1a; class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {Set<Integer> set new HashSet<Integer>();int length nums.length;for (int i 0; i < length; i) {if (i > k) {set.remove(nums[i - …

【小鸡案例】表单focus和blur事件用法

input中有2个属性&#xff0c;一个是focus获取焦点&#xff0c;一个是blur失去焦点。获取焦点就是我们点击输入框时输入框被选中&#xff1b;失去焦点即点击输入框以外的区域&#xff0c;今天就用这两种属性做一个点击输入框的动画效果。 先写个输入框&#xff0c;代码如下&am…

【leetcode周赛记录——405】

405周赛记录 #1.leetcode100339_找出加密后的字符串2.leetcode100328_生成不含相邻零的二进制字符串3.leetcode100359_统计X和Y频数相等的子矩阵数量4.leetcode100350_最小代价构造字符串 刷了一段时间算法了&#xff0c;打打周赛看看什么水平了 #1.leetcode100339_找出加密后的…

源码层面学习动态代理

前言 在Java中&#xff0c;动态代理主要分为CGLIB动态代理和JDK动态代理&#xff0c;我们从Hutool的源码也可一窥这两者的使用方式和区别&#xff1b; CGLIB动态代理 JDK动态代理 使用场景 CglibInterceptor和JdkInterceptor都是Hutool提供的代理工具&#xff0c;用于在运行时…

Redis存储原理与数据模型

Redis存储结构 存储转换 redis-value编码 string int&#xff1a;字符串长度小于等于20切能转成整数raw&#xff1a;字符串长度大于44embstr&#xff1a;字符串长度小于等于44 list quicklist&#xff08;双向链表&#xff09;ziplist&#xff08;压缩链表&#xff09; hash …

【智能算法改进】多策略改进的蜣螂优化算法

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】蜣螂优化算法&#xff08;DBO&#xff09;原理及实现 2.改进点 混沌反向学习初始化 采用 Pwlcm 分段混沌映射&#xff0c;由于 Pwlcm 在其定义区间上具有均匀的密度函数&#xff0c;在特定的…

1.从入门到环境搭建及程序基础

目录 1.1 C督学营开营 1 老师介绍 2 学习常见问题 3 如何学习课程 1.2 程序员职业发展方向 1 前端 2 后端 3 网络安全 1.3 Windows 的 CLion 开发环境安装 1 C 语言的由来 2 安装 MinGW 编译器 3 安装 CLion 开发环境 4 运行&试用 CLion 5 新建项目​ ​6 激…

基于LangChain的RAG开发教程(二)

v1.0官方文档&#xff1a;https://python.langchain.com/v0.1/docs/get_started/introduction/ 最新文档&#xff1a;https://python.langchain.com/v0.2/docs/introduction/ LangChain是一个能够利用大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;能…

家里猫咪浮毛太多怎么办?值得买的猫毛空气净化器推荐

作为一位拥有5年铲屎经验的铲屎官&#xff0c;我知道许多新手铲屎官可能听说过宠物空气净化器&#xff0c;但了解得不多。事实上&#xff0c;宠物空气净化器确实是养猫家庭必备的小家电之一。它的大面积进风口可以有效吸附空气中的微小浮毛和皮屑&#xff0c;专门的除臭技术能有…

15个最佳WooCommerce商城网站及其主要功能

正在寻找的WooCommerce商城网站来激发灵感&#xff1f; 在动态的在线购物世界中&#xff0c;WooCommerce 就像企业的超级英雄。它帮助他们轻松创建强大而可靠的在线商店&#xff0c;并与WordPress顺畅协作。 从创新的产品展示到简化的结账流程&#xff0c;每个特色网站都拥有…

Linux--线程(概念篇)

目录 1.背景知识 再谈地址空间&#xff1a; 关于页表&#xff08;32bit机器上&#xff09; 2.线程的概念和Linux中线程的实现 概念部分&#xff1a; 代码部分&#xff1a; 问题&#xff1a; 3.关于线程的有点与缺点 4.进程VS线程 1.背景知识 再谈地址空间&#xff1a…

【TB作品】51单片机 Proteus仿真00016 乒乓球游戏机

课题任务 本课题任务 (联机乒乓球游戏)如下图所示: 同步显示 oo 8个LED ooooo oo ooooo 8个LED 单片机 单片机 按键 主机 从机 按键 设计题目:两机联机乒乓球游戏 图1课题任务示意图 具体说明: 共有两个单片机,每个单片机接8个LED和1 个按键,两个单片机使用串口连接。 (2)单片机…

视频号矩阵管理系统:短视频内容营销的智能助手

随着短视频行业的蓬勃发展&#xff0c;视频号矩阵管理系统应运而生&#xff0c;为内容创作者和品牌提供了一站式的短视频管理和营销解决方案。本文将深入探讨视频号矩阵管理系统的核心功能&#xff0c;以及它如何助力用户在短视频营销领域取得成功。 视频号矩阵管理系统概述 …

C++语言相关的常见面试题目(一)

1. const关键字的作用 答&#xff1a; 省流&#xff1a;&#xff08;1&#xff09;定义变量&#xff0c;主要为了防止修改 (2) 修饰函数参数&#xff1a;防止在函数内被改变 &#xff08;3&#xff09;修饰函数的返回值 &#xff08;4&#xff09;修饰类中的成员函数 2. Sta…