node.js
Node.JS puppeteer 병렬 웹 크롤링 (수정중)
게슬
2022. 12. 12. 23:39
728x90
https://tlqckd0.tistory.com/49
여기서는 병렬 작업이 안되는 것으로 알았는데
https://stackoverflow.com/questions/60748768/puppeteer-parallel-scraping-via-multiple-pages
또 요런 놈이 있어서 수정을 하고 있는 중임
1. browser promise만들기
const parallel_browser = puppeteer.launch();
//3. 각각의 POST에 들어가서 댓글 가지고 오기.
const tmp_list = [];
for (let i = 0; i < post_list_length; i++) {
try {
tmp_list.push(
temp({
parallel_browser,
post_data_list,
idx: i,
latest_post_code,
})
);
} catch (err) {
continue;
}
}
await Promise.all(tmp_list);
2. 비동기 함수 만들기
async function temp({
parallel_browser,
post_data_list,
idx,
latest_post_code,
}) {
const new_browser = await parallel_browser;
const page = await new_browser.newPage();
const post_href = process.env.ROOT_HREF + post_data_list[idx].href;
console.log(post_href);
post_data_list[idx].post_code = href_to_post_code(post_data_list[idx].href);
if (post_data_list[idx].post_code === latest_post_code) {
console.log('중복 확인... ');
duplication_point = idx;
post_data_list[idx].comment = [];
return;
}
const comment_obj = get_comment_object();
try {
await Promise.all([
page.goto(post_href),
page.waitForNavigation({
waitUntil: 'networkidle2',
timeout: 10000,
}),
]);
const content = await page.content();
post_data_list[idx].comment = crawler({
crawl_object: comment_obj,
content,
});
await page.close();
} catch (err) {
post_data_list[idx].comment = [];
console.error(err);
}
}
일단 이렇게 구성하니깐 돌아가긴 하는데 정확성 검증은 내일 하는걸로..
아무튼 뭔가 해결된거같아서 기분좋다
근대 Promise.all을 할때 순차적으로 배열을 처리할 때 중간에 끊는 방법은 없을까
728x90