Resolved
Written on
·
388
0
안녕하세요. puppeteer 크롤링 수업 진행 중 코드를 동일하게 했는데도 오류가 나서 질문을 남깁니다. 강의는 25분경입니다. 제 전체 코드는 아래와 같습니다.
import puppeteer from "puppeteer";
async function startCrawling() {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.setViewport({width: 720, height: 480});
await page.goto("https://finance.naver.com/item/sise.naver?code=005930");
await new Promise((page) => setTimeout(page, 1000)); // 브라우저 로딩 대기
for (let i = 0; i < page.frames().length; i++)
console.log(page.frames()[i].url().includes("/item/sise_day.naver?code=005930"));
const framePage = await page.frames().find((el) => {el.url().includes("/item/sise_day.naver?code=005930")});
for (let i = 3; i <= 7; i++) {
const date = await framePage.$eval(
`body > table.type2 > tbody > tr:nth-child(${i}) > td:nth-child(1) > span`,
el => el.textContent);
const price = await framePage.$eval(`body > table.type2 > tbody > tr:nth-child(${i}) > td:nth-child(2) > span`,
el => el.textContent);
console.log(`날짜: ${date}, 가격: ${price}`);
}
await browser.close();
};
startCrawling();
위 코드 실행 시 framePage가 undefined로 정의되어 $eval 함수가 실행이 되지 않습니다.
그래서 혹시 frame 중에 일치하는 것이 없어서인가 싶어서 아래 코드로 콘솔에 찍어보았습니다만, true가 나오는 걸로 보아 문제가 없어야 하는것이 맞았습니다.
for (let i = 0; i < page.frames().length; i++)
console.log(page.frames()[i].url().includes("/item/sise_day.naver?code=005930"));
/* 결과 값은
false
false
...(중략)...
true
false
false
*/
왜 undefined가 나오는지 알 수 있을까요?
Answer 1
1
안녕하세요. ZZAMBA님
const framePage = await page.frames().find((el) => {
el.url().includes('/item/sise_day.naver?code=005930');
});
화살표 함수 사용 시, 중괄호를 사용하였는데 return 값이 반환되지 않아 다음 로직들이 실행되지 않은 것으로 확인됩니다.
추가적으로 궁금한 점이 있으시다면 아래 링크를 참고해 학습해 보시길 바랍니다. 감사합니다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Functions/Arrow_functions
감사합니다. 다음 질문부터는 코드 확인을 제대로 한 뒤에 질문글을 올리겠습니다.