Node.js로 웹 크롤링하기

Node.js로 웹 크롤링하기

(10개의 수강평)

276명의 수강생
JavascriptNode.js웹 크롤링
55,000원
지식공유자 · 조현영
75회 수업· 총 13시간 36분수업
평생 무제한 시청
수료증 발급 강의
수강 난이도 중급이상
ㅁㄴㅇㄼㅈㄷㄱ 프로필

axios 에러 질문있습니다 ㅁㄴㅇㄼㅈㄷㄱ 15시간 전
혼자 해결해보려고 했는데 너무 안돼서 질문합니다. axios를 사용해서 다음 뉴스기사를 크롤링하고 있는데 이게 url이 적을때는 잘 작동을 하는데 많아지면 계속 아래와 같은 에러가 발생합니다. (동일한 요청을 request로 했을 때는 정상작동합니다) Error: read ECONNRESET  at TLSWrap.onStreamRead (internal/stream_base_commons.js:205:27) 검색해보니 axios로 요청을 한번에 많이 보내면 발생할 수 있다고 하는데 솔직히 정확한 원인과 해결방법을 잘 모르겠습니다.. 처음에는 setInterval로 1분 단위로 나누어서 보내기도 했는데 너무 느리고 맞는 해결법이 아닌것 같더라구요.. 혹시 해결할 수 있는 방법이 있을까요??.. 전체 코드는 아래와 같습니다 const axios = require('axios'); const cheerio = require('cheerio'); let count=0; const findOutNewsLink = async () => {     const categories = ['society', 'politics', 'economic', 'foreign', 'culture', 'digital'];          let urlArray = [];     for(let i=0; i<categories.length; i++) {         for(let day=1; day<=5; day++) {             for(let page=1; page<=20; page++) {                 // await getSome(categories[0], page, day);                 urlArray.push(`https://news.daum.net/breakingnews/${categories[i]}?page=${page}&regDate=202006${pad(day, 2)}`)             }         }     }     getSome(urlArray, categories[0]);     } const getSome = async (urlArray, category) => {     try {         await Promise.all(urlArray.map(async (url) => {             const res = await axios.get(url);             if(res.status === 200) {                 const $ = cheerio.load(res.data);                 const aArr = $('a');                                  let newsArr = [];                                  for(let i=0; i<aArr.length; i++)                      if(aArr[i].attribs.href.includes('https://v.daum.net/v/')) newsArr.push(aArr[i].attribs.href);                 newsArr = Array.from(new Set(newsArr));                 // for(let i=0; i<newsArr.length; i++)                 //     findOutContent(newsArr[i], category);                 findOutContent(newsArr, category);             }         }));     }     catch (err) {         console.error(err);     } } const findOutContent = async (newsArr, category) => {     try {         await Promise.all(newsArr.map( async(newsURL) => {             const res = await axios.get(newsURL);             const $ = cheerio.load(res.data);             const title = $('.tit_view')[0].children[0].data;             let contentArr = $('#harmonyContainer p');             let content = "";             for(let i = 0; i < contentArr.length; i++) {                 if(contentArr[i].children[0] === undefined || contentArr[i].children[0].data === undefined) continue;                 content += contentArr[i].children[0].data + " ";             }                          const newsObject = {                 title,                 content,                 category             }             console.log(count);             count++;         }))     }     catch(err) {         console.error(err);     } } const pad = (n, width, z) => {     z = z || '0';     n = n + '';     return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n; } findOutNewsLink();

1
inflearn1 프로필

제로초님 크롤링 최적화 질문 있습니다. inflearn1 7일 전
아무래도 네이버나  대형 포털은 이미지가 많아서 로딩 시간이 상당히 길어지는 경우가 많습니다.. 화면 전체를 스크린샷 해야하는데 이미지 때문에 시간이 오래걸리네요..(이미지는 있어야합니다)  puppetteer 기능이나 관련 플러그인중에 이미지 로딩을 최적화 할 수 있는 방법이 있을까요? 현재 css와 폰트는 disable 한 상태입니다.

2
inflearn1 프로필

Error: net::ERR_TOO_MANY_REDIRECTS at 에러 복구 불가인가요? inflearn1 17일 전
평소 잘 돌아가던게 프로그램을 서버이전하고 하루 돌렸는데 저 에러가 발생하고 실행할때 마다 저 에러가 계속발생하네요... 웹서버에서 아이피를 차단한거 같은데 해결방법은 없는건가요?

2
지우지 프로필

throw new Error 지우지 18일 전
개별적인 try...catch보다 throw new Error(...)를 쓰면 좋지 않나요?

2
김도영 프로필

크롤러 요청 제한 김도영 1달 전
안녕하세요 제로초님,  puppteer에서 이미지 캡쳐를 요청 하면 새로운 페이지를 만들고 캡쳐후 close 하게끔 간단한 과정을 만들었습니다. 한 3~5개는 괜찮은데, 10개의 page를 한번에 캡쳐하려니, 브라우저 페이지가 먹통이 됩니다.  그래서 요청에 제한을 두려하는데 어떤 키워드로 찾아야 할지 모르겠어요..  HTTP Server 는 graphql-yoga(express) 를 붙혔고 요청이 5개 이상일때는 대기하라 라고 명하고 싶은데.  관련된 미들웨어 혹은 키워드가 있을까요? 

1
inflearn1 프로필

evaluate() 메서드 내에서 어떻게 딜레이를 적용할 수 있나요? inflearn1 1달 전
구글링을 통해 다양한 자료를 봤는데 명확한 답을 얻지 못하여 글을 남깁니다. page.waitFor 과 같은 함수를 evaluate() 함수 내에서 어떻게 구현할 수 있나요?

1
ham 프로필

6-1. 프록시 설명과 태그 분석 강의를 보고 질문드립니다. ham 2달 전
안녕하세요 제로초님 [6-1. 프록시 설명과 태그 분석] 강의를 보고 궁금한 점이 생겨서 질문드립니다. 아래 코드에서 Array.from() 의 역할이 무엇인지 잘 모르겠습니다. ㅠㅠ... Array.from()을 MDN에서 찾아보니 유사 배열 객체(array-like object)나반복 가능한 객체(iterable object)를 얕게 복사해새로운Array 객체를 만든다고 하는데  Array.from() 으로 감싸기 전의 DOM API로 선택한 요소들(document.querySelectorAll('tr > td:first-of-type > .spy14'))을 왜 새롭게 Array 객체로 만드는 걸까 의문이 들어서 질문드립니다.  음 학습하면서 추론해보는 내용인데 혹시 DOM API로 선택한 유사배열 객체를 Array.from() 으로 감싸지 않으면 `map()` 함수를 쓸 수 없기 때문에 감싸는 것인가요? 아니면 혹시 다른 이유가 있는 것인지 궁금합니다. ```javascript Array.from(document.querySelectorAll('tr > td:first-of-type > .spy14')).map(v => v.textContent.replace(/document\.write\(.+\)/, '')); ``` 강의 잘 보고 있습니다. 제로초님 건강하세요

2
trip trip 프로필

콘솔에서 $문제 trip trip 2달 전
세션 2까지 수업을 들은 상태입니다. 네이버에서는 $를 이용하면 검색이 잘 되는데 카카오 페이지에서는 콘솔에서 검색을 할 때 $함수가 존재하지 않는다고 뜹니다. $$과 [0]를 이용하면 찾을 수는 있는데 그냥 경로만 찾으면 저런 것들은 문제가 없는 건가요?

1
kim rea 프로필

순차적으로 5개페이지 한번에 kim rea 2달 전
선생님 저도 이부분에서 막히네요 ㅜㅜ for of 을 써서 순차적으로 엑셀의 링크를 불러와서  크롤링하는데 한번에 5개씩 동시에 작업하고 싶어요 1,2,3,4,5 링크 쭉 가져와서 페이지 5개 한번에 열어서 크롤링하고 저장 6,7,8,9,10  링크 쭉 가져와서 페이지 한번에 열어서 크롤링 후 저장 promise all 을 써야되는걸 아는데 자세히 알수있을까요 ㅜㅜ 순차적으로 몇만개 크롤링하니까 시간이 너무걸리는것 같아서 동시에 처리하고싶어요

1
최현성 프로필

puppeteer 3버전 관련 최현성 2달 전
안녕하세요 제로초님 강의 잘 보고 있습니다 :) 현재 강의에서 쓰신 버전은 1점대 버전인데, 현시점 install 되는 버전은 3점대 버전이네요; 혹시 라이브러리 메소드 사용에 있어서 다른점이 많을까요?

1
Deneb 프로필

return 값 관련해서 Deneb 2달 전
return { score, img } 처럼 return 값이 중괄호로 감싸진 이유가 궁금합니다. 배움이 부족한건지 이런건 또 처음 보네요..

1
김도영 프로필

프록시도 한계가 있나요? 김도영 3달 전
다른 사람이 그 프록시 서버를 써서 특정 서비스에서 해당 IP를 막으면, 그 프록시 서버는 못쓰게 되나요?

1
mine7717 프로필

5개씩 순차적으로 크롤링도 가능한가요 ? mine7717 3달 전
크롤링이 한번에 되던 문제는 덕분에 잘 해결하였습니다. 전체가 179개이다보니 강제로 시간 딜레이를 주게되어 소요시간이 오래걸려서요.. 혹시 await로 순차적으로 하긴 하지만 5개씩 묶어서 할 수 있는 효율적인 방법이 있을까요 ? 아니면 다른 방안을 찾아내어 고정 딜레이가 아닌 waitForSelector 과 같은 것을 이용해야 할까요 ?

2
mine7717 프로필

크롤링 순차적으로 하는방법. mine7717 3달 전
지난번에 친절히 답변해주시고 좋은강의 해주셔서 크롤링을 아주 손쉽게 끝냈습니다. 이번에 DB에서 ID 값을 가지고 와서 크롤링을 돌리는 것을 하고 있습니다. 그런데 실행하니 총 179개의 id 값을 한번에 불러와서 크롬을 수십개 켜면서 작업을 하더라구요..  물론 노트북이 버벅이고 메모리 에러가 발생해서 타임아웃으로 꺼졌지만.. 그래서 강의 부분중에 promiseall 이랑 for of 에 대해 다시 보았는데 이해가 잘 안되서요 결국 이걸 순차적으로 1부터 179까지 실행하려면 for of 를 쓰는건데 async await과 어떻게 연계해야 할지 조언 부탁드립니다. 단순히 강의 내용대로 쓰고 구글링해서 쓰니 for of 자체는 내부의 값을 차례대로 불러오기만 하더라구요 간단히 작성해보면 for( const value of cust_id) { crawler(value); } 이렇게 했는데 아마도 crawler이라는 함수가 끝나면 다음것을 해야할 것 같은데 어떤식으로 해결해야 할까요 ?

3
수빈 프로필

Error: net::ERR_PROXY_CONNECTION_FAILED 수빈 3달 전
제로초님 코드 그대로 따라했는데 아래와 같은 에러가 발생합니다. Error: net::ERR_PROXY_CONNECTION_FAILED at https://search.naver.com/search.naver?sm=top_hty&fbm=1&ie=utf8&query=%EB%82%B4+%EC%95%84%EC%9D%B4%ED%94%BC 프록시 데이터들은 DB에 잘 저장되어어있는데 뭐가 문제일까요?

1
지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스