요즘 웹 사이트들은 안티 봇 시스템을 사용하여 헤드리스 브라우저를 감지 할 수 있다.
감지를 조금이나마 피하는 방법을 정리해보자.
1. 프록시 사용
- args에 매개변수로 proxy를 추가할 수 있다.
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
})();
2. 헤더 설정
- 사용자 지정 헤더를 추가할 수 있다. (user-agent...)
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
})();
3. 제한 요청
- 안티 봇은 전송 된 요청 수를 통해 활동을 감지할 수 있기 때문에 요청 수를 제한한다.
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
})();
4. 사용자와 비슷하게 시간 제한
- 새 웹 페이지를 클릭하거나 이동하기 전에 사람이 사용하는 것과 비슷하게 임의의 시간을 설정한다.
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 플러그인 사용
npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealth
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();
});
참고
- https://www.zenrows.com/blog/puppeteer-avoid-detection#headers
'JavaScript&TypeScript' 카테고리의 다른 글
JavaScript 배열 자르기 (0) | 2023.03.29 |
---|---|
JavaScript 배열 중간에 요소 추가 및 삭제 (0) | 2023.03.29 |
JavaScript로 GCS에 파일 업로드 및 다운로드 (0) | 2023.03.17 |
Nest.js 사용법 (0) | 2022.09.27 |
TypeScript 프레임워크 비교 (0) | 2022.09.27 |