inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Node.js로 웹 크롤링하기

9-6: 보너스: Q&A

for of와 Promise.allSettled 질문

409

집중하기 매우 어려움

작성한 질문수 8

0

exports.test = async () => {
  const work = xlsx.readFile(path.join(__dirname, "youtuber.xlsx"));
  const workData = work.Sheets.url;
  const result = xlsx.utils.sheet_to_json(workData);
  let array = [];
  for (const [i, e] of result.entries()) {
    array.push(e)
  }

  try {
    const browser = await puppeteer.launch({
      headless: false,
      args: ["--window-size:1920,1080"],
    });
    await Promise.allSettled(array.map(async (e) => {
      try {
        const page = await browser.newPage();
        await page.setUserAgent(agent);
        await page.setViewport({
          width: 1080,
          height: 1080,
        });
        await page.goto(e.url, {
          waitUntil: "networkidle2",
        });
        await page.waitForSelector("#channel-header-container img");
        const result = await page.evaluate(() => {
          const channelName = document.querySelector("#text-container yt-formatted-string").textContent;
          const image = document.querySelector("#channel-header-container img").getAttribute("src");
          const subscriber = document.querySelector("#meta yt-formatted-string[id=subscriber-count]").textContent;
          const activity = document.querySelector("#items ytd-grid-video-renderer:first-child #metadata-line span:nth-child(2)").textContent;
          return {
            channelName,
            image,
            subscriber,
            activity,
          }
        });
        console.log(result);
      } catch (err) {
        console.log(err);
      }
    }));
  } catch (err) {
    console.error(err);
  }
}

for of 반복문은 처음과 끝의 코드가 종료가 돼야 다음 반복문을 돌고 Promise.allSettled는 모든 작업을 동시에 처리해서 둘의 차이는 순서 보장되냐 안되냐의 차이로 배웠습니다. 

 

위 코드는 Promise.allSettled로 동시에 10개의 사이트에 접속하여 태그들을 긁고 리턴하는 함수입니다.

 

태그의 textContent는 모두 긁는데 img 태그의 src 값은 array.map에 가장 처음(0) 사이트만 긁어옵니다.

 

waitForSelector를 사용하여 기다렸는데도 비동기라서 그런지 원인을 잘 모르겠습니다.(for of 문은 됩니다)

puppeteer nodejs Promise.allSettled javascript forof 웹-크롤링

답변 1

1

제로초(조현영)

evaluate 안에서 콘솔로그 찍어서 브라우저에서 태그 확인해보세요.

headless 궁금한게 있어요!

0

414

2

6강 프록시 서버 테스트 관련하여

0

339

2

페이스북 로그인 로그아웃 자동화관련

0

277

2

3-2 axios로 이미지 저장하기에서 axios 관련 오류..

0

269

2

3-1 이미지 다운로드 준비하기 에서 선택자 구성 질문

0

250

3

2-4 csv 출력하기에서 오류 발생

0

294

3

try-puppeteer.appspot.com 을 사용할 수 없나요?

0

151

1

크롬 확장프로그램 관련 질문드립니다.

0

169

1

크롤링 자바스크립트 exe파일

0

555

1

puppeteer 관련

0

599

2

6-3 proxy-database 관련

1

288

1

크롤링을 여러개 돌리려면 어떠한 방법을 선택하는게 좋을까요?

0

794

1

네이버 영화 평점 크롤링 (axis cheerio)

1

489

1

아래 noscript 내용입니다.

0

528

1

크롤링

0

377

1

앱 크롤링

0

1783

1

페이스북 로그인

0

544

1

2019년도 영상이라 error가 나는 걸까요? 2-4. csv에 출력하기에서 error

1

461

1

안녕하세요! for of와 Promise.all 차이점에 관해서 질문드려요!

0

440

2

대량 요청 처리 방법

0

464

1

구글 패스워드 자동입력시 오류

0

250

1

반복크롤링 할 때 아래 질문주신분 하고 약간 형태가 달라요

0

366

2

인스타그램 돔의 value 값으로 쿼리셀렉터 찾을 수 있나요?

0

300

1

페이스북 로그인시 돔이 생성 안되는 문제

0

310

1