如何避免使用木偶检测
#教程 #puppeteer #node #webscraping

这些天,网站使用可以检测刮擦器的反机器人系统。确保无缝刮擦过程的最佳方法是使用适当的掩蔽方法,例如无头浏览器。

Puppeteer是一个无头的铬

在本文中,我们将讨论刮擦时避免使用木偶探测的最佳方法。但是在此之前...

什么是木偶?

Puppeteer是一个node.js库,通过编程为铬无头浏览器提供高级API。

您可以使用NPM或纱线轻松安装它,其关键好处之一是其访问和操纵DevTools协议的能力。

可以通过反机器人检测到木偶?

是的,这些反机器人能够检测到木偶等无头浏览器。

让我们证明这是一个快速刮擦的示例,即试图爬行NowSecure。这是一个带有机器人检查测试的网站,告诉您是否通过了保护。

为此

npm install puppeteer

接下来,我们将创建一个JavaScript文件index.js并使用node.js node index.js运行文件,例如:

const puppeteer = require('puppeteer'); 

(async () => { 
    // Initiate the browser 
    const browser = await puppeteer.launch(); 

    // Create a new page with the default browser context 
    const page = await browser.newPage(); 

    // Setting page view 
    await page.setViewport({ width: 1280, height: 720 }); 

    // Go to the target website 
    await page.goto('https://nowsecure.nl/'); 

    // Wait for security check 
    await page.waitForTimeout(30000); 

    // Take screenshot 
    await page.screenshot({ path: 'image.png', fullPage: true }); 

    // Closes the browser and all of its pages 
    await browser.close(); 
})();

因此,这是我们在那个示例中所做的:我们使用基本的Puppeteer设置来创建一个新的浏览器页面并访问目标网站。然后,我们在安全检查后进行屏幕截图。

当我们仅使用Puppeteer时,这是网页的屏幕截图:

NowSecure Blocked

您可以从结果中看到,我们没有通过支票,也无法阻止在网页上检测到木偶的检测。

避免使用木偶探测的六个技巧

确保平滑爬行过程的最佳方法之一是避免木偶机器人检测。这是防止木偶检测和avoid getting blocked while scraping的方法:

1.使用代理

最广泛采用的反机器人策略之一是IP跟踪,该机器人检测系统在其中跟踪网站的请求。当IP在短时间内提出许多请求时,反机器人可以检测到木偶刮板。

为了避免在PuppeTeer中检测到,您可以使用代理,该代理在用户和Internet之间提供网关。因此,当将请求发送到服务器时,将其路由到代理,然后将响应数据发送给我们。

为此,我们可以在启动puppeteer时向args参数添加代理:

const puppeteer = require('puppeteer'); 
const proxy = ''; // Add your proxy here 

(async () => { 
    // Initiate the browser with a proxy 
    const browser = await puppeteer.launch({args: ['--proxy-server=${proxy}']}); 

    // ... continue as before 
})();

就是这样!您的木偶刮板现在可以在刮擦网页时避免检测机器人。


沮丧的是,您的网络刮刀一次又一次被阻止?

Zenrows API为您处理旋转代理和无头浏览器。

Try for FREE


2.标题

标题包含有关HTTP请求的上下文和元数据信息。它标识该工具是普通的Web浏览器还是机器人。您可以通过在HTTP请求中加入正确的标题来帮助防止检测。

由于Puppeteer在headlessChrome下工作,因此您可以通过添加诸如用户代理之类的自定义标题来进一步进行。这是网络刮擦中使用的流行标题,它标识了请求的应用程序,操作系统,供应商和版本。

const puppeteer = require('puppeteer'); 

(async () => { 
    const browser = await puppeteer.launch(); 
    const page = await browser.newPage(); 

    // Add Headers 
    await page.setExtraHTTPHeaders({ 
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', 
        'upgrade-insecure-requests': '1', 
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8', 
        'accept-encoding': 'gzip, deflate, br', 
        'accept-language': 'en-US,en;q=0.9,en;q=0.8' 
    }); 

    // ... continue as before 
})();

有几种在Puppeteer中添加标头的方法,但最简单的方法是在打开新页面时添加它。

3.限制请求

如前所述,反机器人可以通过发送的请求数来跟踪用户的活动。而且,由于普通用户不会每秒发送数百个请求 ,因此限制了请求的数量并在请求之间休息有助于避免puppeteer检测。

为此,您可以使用.setRequestInterception()限制木偶中呈现的资源。

const puppeteer = require('puppeteer'); 

(async () => { 
    const browser = await puppeteer.launch(); 
    const page = await browser.newPage(); 

    // Limit requests 
    await page.setRequestInterception(true); 
    page.on('request', async (request) => { 
        if (request.resourceType() == 'image') { 
            await request.abort(); 
        } else { 
            await request.continue(); 
        } 
    }); 

    // ... continue as before 
})();

通过设置.setRequestInterception() = true,我们忽略了Puppeteer为图像提出的请求。这样,我们可以限制请求。另外,由于加载和等待的资源更少,我们将获得更快的刮板。

4.模仿用户行为

机器学习系统研究所有用户行为并将机器人行为与用户进行比较。模仿这种行为可以帮助绕过机器人检测器。

实现这一目标的一种方法是等待随机时间,然后单击或导航到Puppeteer中的新网页。例如,此简单功能在五到12秒之间生成随机时间。

page.waitForTimeout在打开新的选项卡页面之前使用生成的时间。

const puppeteer = require('puppeteer'); 

(async () => { 
    const browser = await puppeteer.launch(); 
    const page = await browser.newPage(); 

    // Wait for a random time before navigating to a new web page 
    await page.waitForTimeout((Math.floor(Math.random() * 12) + 5) * 1000) 

    // ... continue as before 
})();

5. Puppeteer-stealth

隐形插件对木偶刮板很有帮助,因为它提供了可与木偶的API相当的API。

让我们看看如何使用PuppeTeer-STEALTH!

来防止检测!

步骤1:安装PuppeTeer-stealth

您可以使用以下命令代码来执行此操作:

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

步骤2:配置Puppeteer-stealth

要配置Puppeteer-stealth,请创建一个名为index.js的新JavaScript文件,并添加以下代码:

const puppeteer = require('puppeteer-extra') 

// Add stealth plugin and use defaults 
const pluginStealth = require('puppeteer-extra-plugin-stealth') 
const {executablePath} = require('puppeteer'); 

// Use stealth 
puppeteer.use(pluginStealth()) 

// Launch pupputeer-stealth 
puppeteer.launch({ headless:false, executablePath: executablePath() }).then(async browser => {

这是上述代码中发生的事情:

首先,我们进口了puppeteerpuppeteer-extra,这是木偶围绕的轻量级包装。然后,我们还导入puppeteer-extra-plugin-stealth,以避免伪造者检测。它与puppeteer.use(pluginStealth())一起使用。

puppeteer保存在executablePath中。这会告知puppeteer-stealth将执行代码的位置。最后,我们启动了Puppeteer,并带有选项headless:false,以查看浏览器中发生的情况。

步骤3:屏幕截图

puppeteer.launch({ headless:false, executablePath: executablePath() }).then(async browser => { 
    // Create a new page 
    const page = await browser.newPage(); 

    // Setting page view 
    await page.setViewport({ width: 1280, height: 720 }); 

    // Go to the website 
    await page.goto('https://nowsecure.nl/'); 

    // Wait for security check 
    await page.waitForTimeout(10000); 

    await page.screenshot({ path: 'image.png', fullPage: true }); 

    await browser.close(); 
});

启动浏览器后,使用await browser.newPage()创建一个新页面,然后设置浏览器视图。指示Puppeteer访问目标网站,并等待十秒钟的安全检查。之后,拍摄了屏幕截图,并关闭了浏览器。

这是结果应该的样子:

NowSecure Bot Detection Bypass

恭喜!您已经阻止了木偶机器人检测。让我们进一步一步并刮擦页面。

步骤4:刮擦页面ð

查找要刮擦的每个元素的选择器,并执行此操作,右键单击元素,然后选择“ Inspect”。这将打开Chrome DevTools,您可以从“元素”选项卡中获取选择器。

Chrome DevTools on NowSecure

复制选择器,并使用每个选择器获取其文本。 querySelector方法可为此目的完美地工作:

    await page.goto('https://nowsecure.nl/'); 
    await page.waitForTimeout(10000); 

    // Get title text 
    title = await page.evaluate(() => { 
        return document.querySelector('body > div.nonhystericalbg > div > header > div > h3').textContent; 
    }); 

    // Get message text 
    msg = await page.evaluate(() => { 
        return document.querySelector('body > div.nonhystericalbg > div > main > h1').textContent; 
     }); 

     // get state text 
    state = await page.evaluate(() => { 
        return document.querySelector('body > div.nonhystericalbg > div > main > p:nth-child(2)').textContent; 
    }); 

    // print out the results 
    console.log(title, '\n', msg, '\n', state); 

    await browser.close(); 
});

脚本使用.textContent方法获取每个元素的文本。可以为每个元素重复相同的过程并保存到变量。
在此处运行代码后,这是输出的样子:

NowSecure Text

繁荣!您已经解决了主要问题,并成功地阻止了Puppeteer机器人检测。这是完整的代码应该是:

const puppeteer = require('puppeteer-extra'); 

// Add stealth plugin and use defaults 
const pluginStealth = require('puppeteer-extra-plugin-stealth'); 
const {executablePath} = require('puppeteer'); 

// Use stealth 
puppeteer.use(pluginStealth()); 

// Launch pupputeer-stealth 
puppeteer.launch({ headless:false, executablePath: executablePath() }).then(async browser => { 
    // Create a new page 
    const page = await browser.newPage(); 

    // Setting page view 
    await page.setViewport({ width: 1280, height: 720 }); 

    // Go to the website 
    await page.goto('https://nowsecure.nl/'); 

    // Wait for security check 
    await page.waitForTimeout(10000); 

    // Get title text 
    title = await page.evaluate(() => { 
        return document.querySelector('body > div.nonhystericalbg > div > header > div > h3').textContent; 
    }); 

    // Get message text 
    msg = await page.evaluate(() => { 
        return document.querySelector('body > div.nonhystericalbg > div > main > h1').textContent; 
    }); 

     // get state text 
    state = await page.evaluate(() => { 
        return document.querySelector('body > div.nonhystericalbg > div > main > p:nth-child(2)').textContent; 
     }); 

    // print out the results 
    console.log(title, '\n', msg, '\n', state); 

    await browser.close(); 
});

木偶传播的局限性

puppeteer-stealth是避免检测机器人检测的好解决方案,但它有局限性:

  • 它无法避免高级反机器人。
  • Puppeteer在无头模式下工作,因此很难扩展和刮擦大量数据。
  • 很难调试无头浏览器,例如Puppeteer。

不幸的是,Puppeteer-stealth失败了具有高级反机器人的网站。例如,我们尝试用它刮擦Okta

// same as before 
puppeteer.launch({ headless:true, executablePath: executablePath() }).then(async browser => { 
    const page = await browser.newPage(); 
    await page.setViewport({ width: 1920, height: 1080 }); 

    // Go to the website 
    await page.goto('https://okta.com/'); 

    // Wait for security check 
    await page.waitForTimeout(10000); 
    await page.screenshot({ path: 'image.png', fullPage: true }); 
    await browser.close(); 
});

这是我们得到的:

Okta Block

我们直接被封锁了!幸运的是,我们有一个可以绕过高级反机器人的解决方案:Zenrows。那是我们避免检测的下一个技巧。

6. Zenrows

ZenRows是一种多合一的Web刮擦工具,它使用单个API调用来处理所有反机器人旁路。它有助于旋转代理,无头浏览器和验证码。

使用Zenrows刮擦Okta,这是我们得到的:

Okta Scraped with ZenRows

结论

有不同的方法可以避免使用Puppeteer检测,我们在本文中讨论了最好和最简单的方法。

您可以使用代理,标题,限制请求或Puppeteer-streems来完成工作,但是有局限性。这些方法的常见问题是,它们在绕过高级反机器人时失败。

ZenRows可以为您处理所有反机器人旁路,从旋转代理和无头浏览器到单个API调用。您可以免费入门。

您发现内容有帮助吗?在TwitterLinkedInFacebook上分享单词并在Twitter上共享。

本文最初发表在Zenrows上:How to Avoid Detection with Puppeteer