개발일기장

Node.JS puppeteer 병렬 웹 크롤링 (수정중) 본문

node.js

Node.JS puppeteer 병렬 웹 크롤링 (수정중)

게슬 2022. 12. 12. 23:39
728x90

https://tlqckd0.tistory.com/49

 

Node.JS 웹 크롤링으로 Promise.all 성능 비교 (수정: 이거 다 틀렸음)

※ 위에내용 다 틀렸고 밑에 고친거 있음. 쭉 내리면 됨 https://tlqckd0.tistory.com/48 NodeJS로 웹 크롤링 하기. puppeteer, cheerio, 동적 크롤링 1. 왜 puppeteer를 사용하는지 https://www.npmjs.com/package/puppeteer puppet

tlqckd0.tistory.com

여기서는 병렬 작업이 안되는 것으로 알았는데

https://stackoverflow.com/questions/60748768/puppeteer-parallel-scraping-via-multiple-pages

 

Puppeteer parallel scraping via multiple pages

I wanted to scrape multiple urls simultaneously, so I used p-queue to implement a Promise-queue. For example, see the code below, uses 1 browser and multiple pages to do this job. const queue = ...

stackoverflow.com

또 요런 놈이 있어서 수정을 하고 있는 중임

 

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
Comments