这些天,网站使用可以检测刮擦器的反机器人系统。确保无缝刮擦过程的最佳方法是使用适当的掩蔽方法,例如无头浏览器。
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时,这是网页的屏幕截图:
您可以从结果中看到,我们没有通过支票,也无法阻止在网页上检测到木偶的检测。
避免使用木偶探测的六个技巧
确保平滑爬行过程的最佳方法之一是避免木偶机器人检测。这是防止木偶检测和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为您处理旋转代理和无头浏览器。
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 => {
这是上述代码中发生的事情:
首先,我们进口了puppeteer
和puppeteer-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访问目标网站,并等待十秒钟的安全检查。之后,拍摄了屏幕截图,并关闭了浏览器。
这是结果应该的样子:
恭喜!您已经阻止了木偶机器人检测。让我们进一步一步并刮擦页面。
步骤4:刮擦页面ð
查找要刮擦的每个元素的选择器,并执行此操作,右键单击元素,然后选择“ Inspect”。这将打开Chrome DevTools,您可以从“元素”选项卡中获取选择器。
复制选择器,并使用每个选择器获取其文本。 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
方法获取每个元素的文本。可以为每个元素重复相同的过程并保存到变量。
在此处运行代码后,这是输出的样子:
繁荣!您已经解决了主要问题,并成功地阻止了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();
});
这是我们得到的:
我们直接被封锁了!幸运的是,我们有一个可以绕过高级反机器人的解决方案:Zenrows。那是我们避免检测的下一个技巧。
6. Zenrows
ZenRows是一种多合一的Web刮擦工具,它使用单个API调用来处理所有反机器人旁路。它有助于旋转代理,无头浏览器和验证码。
使用Zenrows刮擦Okta,这是我们得到的:
结论
有不同的方法可以避免使用Puppeteer检测,我们在本文中讨论了最好和最简单的方法。
您可以使用代理,标题,限制请求或Puppeteer-streems来完成工作,但是有局限性。这些方法的常见问题是,它们在绕过高级反机器人时失败。
ZenRows可以为您处理所有反机器人旁路,从旋转代理和无头浏览器到单个API调用。您可以免费入门。
您发现内容有帮助吗?在Twitter,LinkedIn和Facebook上分享单词并在Twitter上共享。
本文最初发表在Zenrows上:How to Avoid Detection with Puppeteer