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


    为什么有反机器人系统?

    • 保护网站资源和性能

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

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

    • 防止数据盗窃和滥用

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

    • 提高安全性

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

    • 保护用户隐私

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

    • 提高用户体验

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

    • 防止广告欺诈

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

    反机器人系统如何工作?

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

    1. 行为分析

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

    2. 设备和环境检测

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

    3. 挑战-响应机制

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

    4. IP和地理位置检测

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

    5. 流量分析

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

    6. 机器学习

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

    网站如何检测Puppeteer?

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

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

    1. for (let key in window) {
    2. if (key.includes('puppeteer') || key.includes('webdriver')) {
    3. // Detected Puppeteer
    4. }
    5. }

    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设置代理:

    1. const puppeteer = require('puppeteer');
    2. (async () => {
    3. const browser = await puppeteer.launch({
    4. args: [
    5. '--proxy-server=http://your_proxy_ip:your_proxy_port',
    6. // Add any other Chrome flags you need
    7. ],
    8. });
    9. const page = await browser.newPage();
    10. // Now Puppeteer will use the proxy specified above
    11. await page.goto('https://example.com');
    12. // Continue with your automation tasks
    13. await browser.close();
    14. })();
    • --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头将帮助您的请求更加真实。

    1. const puppeteer = require('puppeteer-extra');
    2. const StealthPlugin = require('puppeteer-extra-plugin-stealth');
    3. const randomUseragent = require('random-useragent'); // Random User-Agent Library
    4. puppeteer.use(StealthPlugin());
    5. (async () => {
    6. const browser = await puppeteer.launch({ headless: true });
    7. const page = await browser.newPage();
    8. // Define common HTTP headers
    9. const commonHeaders = {
    10. 'Accept-Language': 'en-US,en;q=0.9',
    11. 'Accept-Encoding': 'gzip, deflate, br',
    12. 'Cache-Control': 'no-cache',
    13. 'Upgrade-Insecure-Requests': '1',
    14. };
    15. // Randomize User-Agent and HTTP headers
    16. const setRandomHeaders = async (page) => {
    17. const userAgent = randomUseragent.getRandom(); // Get random User-Agent
    18. await page.setUserAgent(userAgent);
    19. await page.setExtraHTTPHeaders(commonHeaders);
    20. };
    21. await setRandomHeaders(page);
    22. await page.evaluateOnNewDocument(() => {
    23. Object.defineProperty(navigator, 'webdriver', {
    24. get: () => false,
    25. });
    26. });
    27. await page.goto('https://example.com', {
    28. waitUntil: 'networkidle2',
    29. });

    方法3. 禁用navigator.webdriver

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

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

    方法4. 使用​stealth插件​

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

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

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

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

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

    1. const puppeteer = require('puppeteer-extra');
    2. const StealthPlugin = require('puppeteer-extra-plugin-stealth');
    3. puppeteer.use(StealthPlugin());
    4. const browser = await puppeteer.launch
    5. ({ headless: true });

    方法5. 使用Cookie

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

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

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

    方法6. 使用CAPTCHA解答服务

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

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

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

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

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

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

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

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

    方法8. 使用浏览器扩展

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

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

    加载本地扩展:

    • 下载您想要使用的浏览器扩展(例如Chrome扩展)到本地。
    • 在启动Puppeteer时,通过指定args参数加载扩展:
    1. const puppeteer = require('puppeteer');
    2. (async () => {
    3. const browser = await puppeteer.launch({
    4. headless: false, // non-headless mode
    5. args: [
    6. `--disable-extensions-except=/path/to/extension/`, // Load extensions with specified paths
    7. `--load-extension=/path/to/extension/`
    8. ]
    9. });
    10. const page = await browser.newPage();
    11. await page.goto('https://example.com');
    12. // Continue executing your code
    13. })();
    • 这将允许您在Puppeteer控制的浏览器实例中加载和使用特定扩展,有时可以帮助绕过机器人检测。

    更改默认Chrome扩展路径

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

    结语

    在本文中,我们讨论了:

    • 为什么网站使用反机器人系统?
    • 它们如何工作?
    • 使用Puppeteer避免机器人检测的8种最佳方法。
  • 相关阅读:
    Docker高级篇
    从一条更新SQL的执行过程窥探InnoDB之REDOLOG
    Unet网络结构搭建
    裸片-PCBA
    【单链表】无头单项不循环(2)
    运营商大数据实时获取精准数据
    E语言基本特征码/时钟反调试/窗体push大法
    vuecli项目实战--管理系统
    vue实战入门后台篇五:springboot+mybatis实现网站后台-操作日志功能实现
    GitHub:ViT-pytorch相关学习-视觉分类方向-1
  • 原文地址:https://blog.csdn.net/wellshake/article/details/140271787