이전 포스팅 얼럿창 컨트롤하기에 대하여
웹 크롤링 중 갑자기 얼럿창이 노출될 경우 닫지 않고서는
다음 진행이 어렵습니다
그래서 puppeteer는 이벤트 리스너와 같은 기능을 하는 함수를 가지고 있습니다
그 함수는 page.on 이며, 여러 인자 값을 받아 여러가지 이벤트를 핸들링할 수 있습니다
더 상세한 정보를 알고 싶으시면 아래의 글을 참고해주시길 바랍니다
2022.08.31 - [IT_Web/Nodejs] - 웹 크롤링 puppeteer로 alert, prompt, confirm 창 얼럿창 제어 및 컨트롤 하기
웹 크롤링 puppeteer로 alert, prompt, confirm 창 얼럿창 제어 및 컨트롤 하기
이전 포스팅 키보드 코드 입력하기에 대해서 puppeteer로 웹 크롤링할 때 키보드를 입력하는 방법을 알아보았습니다 키보드의 자판만큼이나 코드도 엄청 많았습니다 그래서 그 문서를 Array형 Object
tantangerine.tistory.com
웹 크롤링 puppeteer 활용해서 마우스 조작하기
웹 크롤링에서 마우스를 조작하는 이유는 무엇일까요?
간단한 매크로를 만들거나, 태그를 정말 찾기 어려울 때 어쩔 수 없이 사용하게 될 것입니다
마우스를 조작해야 될 경우가 없는 게 좋겠지만 해야 할 경우가 생길 수 있으니
알아두면 편하겠죠?
그럼 코드를 보면서 그 방법을 알아보도록 하겠습니다
const puppeteer = require('puppeteer');
const callElement = require('./mouseHandleHtml');
const dotenv = require('dotenv'); // npm i dotenv
dotenv.config();
const setCrawler = async (production) => {
const browser = await puppeteer.launch({
headless: production,
args:['--window-size=1920,1080']
});
const page = await browser.newPage();
await page.setViewport({
width: 1080,
height:1080,
})
await page.goto('https://facebook.com');
if (!production) {
await callElement(page)
}
const setTime = async (selector = 'normal', waitTime = 0) => {
const setTime = await page.evaluate(async(waitTime) => {
const timeList = await [3975, 4547, 5231, 6397, 7894, 3394, 4206, 5147, 6932, 7430, 3561, 4896, 5877, 6407, 7133];
let randomTime = await timeList[Math.floor(Math.random() * timeList.length)]
if (waitTime > 0) randomTime = waitTime
await new Promise(r => setTimeout(r, randomTime))
return randomTime
}, waitTime)
console.log(`waitTime[${selector}]: `, setTime)
return setTime
}
return { setTime, page: page, browser: browser }
}
const crawler = async () => {
try {
const production = await process.env.PRODUCTION;
console.log('production', production, typeof(JSON.parse(production)))
const { setTime, page, browser } = await setCrawler(JSON.parse(production));
await setTime('', 2000)
await page.mouse.move(100, 100);
await page.mouse.down()
await setTime('', 2000)
await page.mouse.move(1000, 400);
await setTime('', 2000)
await page.mouse.click(1000, 400);
await setTime('', 2000)
} catch (e) {
console.log(e);
}
}
crawler()
env파일이 아래와 같이 설정되어있다고 합시다
PRODUCTION이 true 될 경우 실 운영 버전으로 개발이 다 끝난 경우에 설정하는 값이라고 합시다
지금은 false로 개발을 진행한다고 설정하고 웹 크롤링 과정을 지켜보며 개발을 하게 됩니다
production 변수에 env인 PRODUCTION을 할당합니다
그 설정된 값을 자료형을 boolean으로 변경하고
setCrawler() 함수에 매개변수 인자 값으로 production을 할당합니다
빨간 테두리에는 할당된 인자 값인 production을 headles를 false로 할당해서
웹 크롤링하는 과정을 화면으로 지켜볼 수 있게 false로 지정합니다
headless 머리가 없다는 뜻으로 false로 머리가 있다는 뜻이 됩니다
그럼 화면을 볼 수 있다는 것이겠지요?
위의 노랑 테두리는
production이 false이면 if문을 안을 실행하게 됩니다
그래서 callElement()에 page 객체를 인자 값으로 호출하게 됩니다
즉, 운영이 아닌 환경설정값으로 마우스를 노출시킬 수 있는 Element를 생성하는 함수를 호출하게 됩니다
운영이라면 if문을 실행하지 않고 지나치게 될 것입니다
callElement는 아래와 같이./mouseHandleHtml 파일에서 함수를 가져오게 되어있습니다
아래의 코드로 정의된 callElement함수는
마우스가 어디에 있는지 화면에서 확인할 수 있는 html, CSS을 생성하게 됩니다
위와 말했듯이 개발에만 생성하게 되고 그 이유는 웹 크롤링하는 과정을 보면서 개발하기 위해서입니다
module.exports = async function callElement(page) {
await page.evaluate(() => {
(() => {
const box = document.createElement('div');
box.classList.add('mouse-helper');
const styleElement = document.createElement('style');
styleElement.innerHTML = `.mouse-helper {
pointer-events: none;
position: absolute;
z-index: 1000000000;
top: 0;
left: 0;
width: 20px;
height: 20px;
background: rgba(0,0,0,.4);
border: 1px solid white;
border-radius: 10px;
margin-left: -10px;
margin-top: -10px;
transition: background .2s, border-radius .2s, border-color .2s;
}
.mouse-helper.button-1 {
transition: none;
background: rgba(0,0,0,0.9);
}
.mouse-helper.button-2 {
transition: none;
border-color: rgba(0,0,255,0.9);
}
.mouse-helper.button-3 {
transition: none;
border-radius: 4px;
}
.mouse-helper.button-4 {
transition: none;
border-color: rgba(255,0,0,0.9);
}
.mouse-helper.button-5 {
transition: none;
border-color: rgba(0,255,0,0.9);
}
`;
document.head.appendChild(styleElement);
document.body.appendChild(box);
document.addEventListener('mousemove', event => {
box.style.left = event.pageX + 'px';
box.style.top = event.pageY + 'px';
updateButtons(event.buttons);
}, true);
document.addEventListener('mousedown', event => {
updateButtons(event.buttons);
box.classList.add('button-' + event.which);
}, true);
document.addEventListener('mouseup', event => {
updateButtons(event.buttons);
box.classList.remove('button-' + event.which);
}, true);
function updateButtons(buttons) {
for (let i = 0; i < 5; i++)
box.classList.toggle('button-' + i, !!(buttons & (1 << i)));
}
})();
});
}
그리고 실질적으로 웹 크롤링을 실행하는 함수를 보시면
웹 크롤링 화면 설정과 필요 기능 함수를 선언하는 setCrawler()가 있습니다
그리고 setTime으로 잠시 대기하여 마우스를 움직이며 드래그하는 모습을 볼 수 있습니다
아래의 이미지를 보시면 드래그를 한 후 그 자리 좌표에서 클릭을 하면
드래그가 없어지는 것을 확인할 수 있습니다
이렇게 웹 크롤링 마우스 조작 법을 알아보았습니다
그렇게 어렵지 않고 함수 기능만 알고 있다면
간편하게 구현할 수 있다는 것을 알게 되었습니다
저는 웹 크롤링을 공부하는 이유는 여러 가지 정보를 아침에 모아서 보려고 합니다
그래서 같이 공부하고 끝이 나면
개인적인 프로젝트를 진행하는 과정도 포스팅을 하도록 하겠습니다
후~ 그럼 오늘도 고생하셨습니다
공부가 힘들고 어렵겠지만 조금만 힘내시면
그 시기는 지나갈 것이라 생각합니다
난중에는 너무 자연스럽게 코딩하는 자신의 모습을 볼 수 있을 것입니다
그럼 그때까지 파이팅 하시고
다음 포스팅도 기대해주세요!
감사합니다
'IT_Web > Nodejs' 카테고리의 다른 글
웹 크롤링 puppeteer로 mysql 및 sequelize 활용하여 DB연동하기 (0) | 2022.09.03 |
---|---|
웹 크롤링 puppeteer 프록시 IP 적용하기 그런데 대체 프록시 란? 뭘까? (1) | 2022.09.02 |
웹 크롤링 puppeteer로 alert, prompt, confirm 창 얼럿창 제어 및 컨트롤 하기 (0) | 2022.08.31 |
웹 크롤링 puppeteer 활용 및 keyboard press 함수로 키보드 코드 입력하기 (0) | 2022.08.30 |
웹 크롤링 로그인, 로그아웃 그리고 waitForResponse 응답대기 활용하기 및 태그찾기, 태그 값 할당 (0) | 2022.08.29 |