JavaScript&TypeScript

Puppeteer 감시 방지

hjkang

요즘 웹 사이트들은 안티 봇 시스템을 사용하여 헤드리스 브라우저를 감지 할 수 있다.

감지를 조금이나마 피하는 방법을 정리해보자.

 

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