• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

axios 에러 질문있습니다

20.07.09 23:08 작성 조회수 1.93k

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();

답변 1

답변을 작성해보세요.

0

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

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

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