inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Node.js로 웹 크롤링하기

axios 에러 질문있습니다

2422

감사합니다

작성한 질문수 13

0

혼자 해결해보려고 했는데 너무 안돼서 질문합니다.

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=0i<categories.lengthi++) {
        for(let day=1day<=5day++) {
            for(let page=1page<=20page++) {
                // await getSome(categories[0], page, day);
                urlArray.push(`https://news.daum.net/breakingnews/${categories[i]}?page=${page}&regDate=202006${pad(day2)}`)
            }
        }
    }
    getSome(urlArraycategories[0]);    
}

const getSome = async (urlArraycategory=> {
    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=0i<aArr.lengthi++) 
                    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(newsArrcategory);
            }
        }));
    }
    catch (err) {
        console.error(err);
    }
}

const findOutContent = async (newsArrcategory=> {
    try {
        await Promise.all(newsArr.mapasync(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 = 0i < contentArr.lengthi++) {
                if(contentArr[i].children[0] === undefined || contentArr[i].children[0].data === undefinedcontinue;
                content += contentArr[i].children[0].data + " ";
            }
            
            const newsObject = {
                title,
                content,
                category
            }
            console.log(count);
            count++;
        }))
    }
    catch(err) {
        console.error(err);
    }
}

const pad = (nwidthz=> {
    z = z || '0';
    n = n + '';
    return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}

findOutNewsLink();

puppeteer nodejs javascript 웹-크롤링

답변 1

0

제로초(조현영)

네 이게 원인이 다양한 것은 맞습니다. 기본적으로 한 번에 요청을 너무 많이 보내서 그렇고요.

http://blog.naver.com/PostView.nhn?blogId=yprima&logNo=220199335325&parentCategoryNo=&categoryNo=28&viewDate=&isShowPopularPosts=true&from=search

위처럼 리눅스에서 동시 소켓 개수가 부족해서 그런 것일 수도 있습니다. 다만 이렇게 소켓 개수를 늘리는 건 한 컴퓨터로는 한계가 있고요. 보통 대규모로 크롤링할때는 컴퓨터 여러개(서버 여러 대)를 두어 나눠서 처리합니다. 예를 들어 10대 서버가 있으면 1/10 씩 크롤링 페이지를 나누면 되겠죠. Lambda같은 서버리스 쓰시면 좋습니다.

headless 궁금한게 있어요!

0

413

2

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

0

337

2

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

0

276

2

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

0

269

2

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

0

250

3

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

0

294

3

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

0

150

1

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

0

169

1

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

0

554

1

puppeteer 관련

0

598

2

6-3 proxy-database 관련

1

287

1

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

0

793

1

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

1

488

1

아래 noscript 내용입니다.

0

528

1

크롤링

0

375

1

앱 크롤링

0

1783

1

페이스북 로그인

0

544

1

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

1

461

1

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

0

440

2

대량 요청 처리 방법

0

463

1

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

0

249

1

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

0

363

2

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

0

300

1

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

0

308

1