오늘도 새로운 에러를 만났다.
promise pending은 비동기함수가 처리 되지않고있는 상태라는것만 알고있는데 뭐가 문제인걸까?
Promise는 3가지의 상태로 나뉜다.
-pending(대기): 이행되지도 거부되지도 않은 상태
-fulfilled(이행): 성공
-rejected(거부): 실패
왜..왜 작동하지 않는거냐..
const puppeteer = require("puppeteer");
const cheerio = require("cheerio");
let screenShotList = {
tag: "",
title: "",
influencer: "",
};
const crawl = async (keyword) => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
const ndhs_searchWord = "";
await page.goto(
"https://search.naver.com/search.naver?where=influencer&sm=tab_jum&query="
);
await page.click("#nx_search_form > fieldset > div.greenbox");
await page.evaluate((searchWord) => {
document.querySelector("#nx_query").value = searchWord;
}, ndhs_searchWord);
await page.click("#nx_search_form > fieldset > button");
if (
page.url() ===
`https://search.naver.com/search.naver?where=influencer&sm=tab_jum&query=${encodeURI(
keyword
)}`
) {
const data = await page.data();
const $ = cheerio.load(data);
const list = $(
"#wrap #container #content #main_pack #_inf_content_root div div div.challeng_wrap ul"
).children("li");
console.log(list);
list.each((i, elem) => {
ulList[i] = {
tag: $(this).find("div.more_box a span.name ").text(),
title: $(this)
.find("div.keyword_box_wrap div.detail_box div.dsc_area a.name_link")
.text(),
influencer: $(this)
.find(
"div.keyword_box_wrap div.user_box div.user_box_inner div.user_info_bx div.user_area a"
)
.text(),
};
console.log(ulList[i]);
});
} else {
console.log("failed");
}
await browser.close();
};
console.log(crawl("샌드위치"));
crawl();
module.exports = { crawl };
이유는 crawl()함수가 Promise를 반환하지 않기때문이였다.
const crawl = async (keyword) => {
return new Promise(async (resolve, reject) => {
try {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
const ndhs_searchWord = "";
await page.goto(
"https://search.naver.com/search.naver?where=influencer&sm=tab_jum&query="
);
await page.click("#nx_search_form > fieldset > div.greenbox");
await page.evaluate((searchWord) => {
document.querySelector("#nx_query").value = searchWord;
}, ndhs_searchWord);
await page.click("#nx_search_form > fieldset > button");
if (
page.url() ===
`https://search.naver.com/search.naver?where=influencer&sm=tab_jum&query=${encodeURI(
keyword
)}`
) {
const data = await page.content();
const $ = cheerio.load(data);
const list = $(
"#wrap #container #content #main_pack #_inf_content_root div div div.challeng_wrap ul"
).children("li");
const ulList = [];
list.each((i, elem) => {
ulList[i] = {
tag: $(elem).find("div.more_box a span.name").text(),
title: $(elem)
.find(
"div.keyword_box_wrap div.detail_box div.dsc_area a.name_link"
)
.text(),
influencer: $(elem)
.find(
"div.keyword_box_wrap div.user_box div.user_box_inner div.user_info_bx div.user_area a"
)
.text(),
};
console.log(ulList[i]);
});
resolve(ulList);
} else {
reject("failed");
}
await browser.close();
} catch (error) {
reject(error);
}
});
};
crawl("샌드위치")
.then((result) => console.log(result))
.catch((error) => console.error(error));