개발일기장
Node.JS puppeteer 병렬 웹 크롤링 (수정중) 본문
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
'node.js' 카테고리의 다른 글
const result = await Promise.allSettled() 관련해서 대충 (1) | 2024.01.03 |
---|---|
영화 상영 스케줄 크롤링 peppeteer, cheerio (0) | 2023.12.02 |
ExpressJS에 inversify적용해서 객체 주입받기. (0) | 2022.08.04 |
expressJS 를 class형식으로 실행 (0) | 2022.07.28 |
Node.js. Mysql2 Transaction작업 + template만들기 (jdbc방식) (0) | 2022.05.27 |
Comments