혼자 해결해보려고 했는데 너무 안돼서 질문합니다.
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}®Date=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