본문 바로가기
개발/개발 필기

네이버 API 검색 결과에서 언론사 이름 추출하기

by nicksoon 2024. 11. 6.
반응형

네이버 API로 뉴스를 검색할 때, 각 뉴스 항목에는 originallink라는 링크만 포함되어 있어 어느 언론사에서 제공한 뉴스인지 식별하기 어렵습니다. 언론사별로 고유한 originallink의 도메인명을 통해 언론사 이름을 확인할 수 있도록 함수를 구현해보았습니다.

이를 위해 먼저, 주요 언론사 사이트의 도메인과 한글 이름을 매핑한 배열을 정의한 후, 해당 링크에 포함된 도메인명을 기반으로 언론사 이름을 확인하도록 했습니다.

 

1. 언론사 정보 매핑 배열

우선, 대표적인 언론사 몇 곳의 도메인명과 한글 이름을 매핑한 배열을 만듭니다. 이 배열을 기반으로, originallink에 포함된 도메인명을 찾아 해당 언론사의 한글 이름을 반환할 수 있습니다.

const site = [
        {site : "insight" , kor:"인사이트"}
        ,{site :"topstarnews" , kor : "톱스타뉴스"}
        ,{site :"yna" , kor: "연합뉴스"}
        ,{site :"hankookilbo", kor : "한국일보"}
        ,{site:"mbn" , kor: "mbn뉴스"}
        ,{site:"joynews24" , kor: "아이뉴스24"}
        ,{site:"edaily" , kor: "이데일리"}
        ,{site:"seoul" , kor: "서울신문"}
        ,{site:"sedaily" , kor: "서울경제"}
        ,{site:"biz.chosun", kor : "조선일보"}
        ,{site:"mk" , kor: "매일경제"}
        ,{site:"news.sbs" , kor: "sbs뉴스"}
        ,{site:"hankyung", kor : "한경"}
        ,{site:"news1" , kor: "뉴스1"}
        ,{site:"tvchosun", kor : "tv조선뉴스"}
        ,{site:"nocutnews" , kor: "노컷뉴스"}
        ,{site:"imaeil" , kor: "매일신문"}
        ,{site:"munhwa" , kor: "문화일보"}
        ,{site:"newsis" , kor: "뉴시스"}
        ,{site:"segye" , kor: "세계일보"}
        ,{site:"gukjenews" , kor: "국제뉴스"}
        ,{site:"fnnews" , kor: "파이낸셜뉴스"}
        ,{site:"busan" , kor: "부산일보"}
        ,{site:"asiae" , kor: "아이사경제"}
        ,{site:"news.mt" , kor: "머니투데이"}
        ,{site:"dt" , kor: "디지털타임스"}
        ,{site:"christiantoday" , kor: "크리스천투데이"}
        ,{site:"economist" , kor: "이코노미스트"}
        ,{site:"kmib" , kor: "국민일보"}
        ,{site:"inews24" , kor: "아이뉴스24"}
        ,{site:"moneys" , kor: "머니스"}
        ,{site:"news.tf" , kor: "더팩트"}
        ,{site:"sports.khan" , kor: "스포츠경향"}
        ,{site:"dailian" , kor: "데일리안"}
        ,{site:"isplus" , kor: "일간스포츠"}
        ,{site:"starnewskorea" , kor: "스타뉴스"}
        ,{site:"wikitree" , kor: "엔터"}
        ,{site:"news.kbs" , kor: "kbs뉴스"}
        ,{site:"daejonilbo" , kor: "대전일보"}
        ,{site:"heraldcorp" , kor: "헤럴드경제"}
        ,{site:"joongang" , kor: "중앙일보"}
        ,{site:"xportsnews" , kor: "엑스포츠뉴스"}
        ,{site:"tvreport" , kor: "티비리포트"}
        ,{site:"heraldpop" , kor: "헤럴드팝"}
        ,{site:"newsen" , kor: "뉴스엔"}
        ,{site:"osen" , kor: "오센"}
        ,{site:"yonhapnewstv" , kor: "연합뉴스tv"}
        ,{site:"mydaily" , kor: "마이데일리"}
        ,{site:"ytn" , kor: "ytn"}
        ,{site:"mediapen" , kor: "미디어펜"}
        ,{site:"stoo" , kor: "스포츠투데이"}
        ,{site:"sisajournal" , kor: "시사저널"}
        ,{site:"news.jtbc" , kor: "jtbc뉴스"}
        ,{site:"etoday" , kor: "이투데이"}
        ,{site:"marketnews" , kor: "마켓뉴스"}
        ,{site:"woman.chosun" , kor: "여성조선"}
        ,{site:"newspim" , kor: "뉴스핌"}
        ,{site:"goodkyung" , kor: "굿모닝걍제"}
        ,{site:"siminilbo" , kor: "시민일보"}
        ,{site:"ggilbo" , kor: "금강일보"}
        ,{site:"sports.chosun" , kor: "스포츠조선"}
        ,{site:"kihoilbo" , kor: "기호일보"}
        ,{site:"dealsite" , kor: "딜사이트"}
        ,{site:"mediatoday" , kor: "미디어오늘"}
        ,{site:"lawtimes" , kor: "법률신문"}
        ,{site:"fpn119" , kor: "소방방재신문"}
        ,{site:"nbntv" , kor: "nbn"}
        ,{site:"veritas-a" , kor: "베리타스알파"}
        ,{site:"veritas-a" , kor: "베리타스알파"}
        ,{site:"kpinews" , kor: "킵뉴스"}
        ,{site:"newscj" , kor: "천지일보"}
        ,{site:"kyeonggi" , kor: "경기일보"}
        ,{site:"khan" , kor: "경향신문"}
        ,{site:"sports.donga" , kor: "스포츠동아"}
        ,{site:"ebn" , kor: "ebn사업경제"}
        ,{site:"journalist" , kor: "한국기자협회"}
        ,{site:"getnews" , kor: "글로벌경제신문"}
        ,{site:"mediaus" , kor: "미디어스"}
        ,{site:"www.ekn" , kor: "에너지경제"}
        ,{site:"donga" , kor: "동아일보"}
        ,{site:"m-economynews" , kor: "이코노미뉴스"}
        ,{site:"hani" , kor: "한겨레"}
        ,{site:"pinpointnews" , kor: "핀포인트뉴스"}
        ,{site:"boannews" , kor: "보안뉴스"}
        ,{site:"etnews" , kor: "전자신문"}
        ,{site:"jjan" , kor: "전북일보"}
        ,{site:"ajunews" , kor: "아주경제"}
        ,{site:"ohmynews" , kor: "오마이포토"}
        ,{site:"lecturernews" , kor: "한국강사신문"}
        ,{site:"news.ebs" , kor: "ebs뉴스"}
        ,{site:"pointdaily" , kor: "포인트데일리"}
        ,{site:"joongboo" , kor: "중부일보"}
        ,{site:"asiatoday" , kor: "아이아투데이"}
        ,{site:"suwonilbo" , kor: "수원일보"}
        ,{site:"kukinews" , kor: "쿠키뉴스"}
        ,{site:"newdaily" , kor: "뉴데일리"}
        ,{site:"g1tv" , kor: "g1방송"}
        ,{site:"hellodd" , kor: "헬로디디"}
        ,{site:"inews365" , kor: "충북일보"}
        ,{site:"pennmike" , kor: "펭n마이크"}
        ,{site:"kyongbuk" , kor: "경북일보"}
        ,{site:"idaegu" , kor: "대구일보"}
        ,{site:"yeongnam" , kor: "영남일보"}
        ,{site:"discoverynews" , kor: "디스커버리뉴스"}
        ,{site:"kado" , kor: "강원도민일보"}
        ,{site:"breaknews" , kor: "브레이크뉴스"}
        ,{site:"sports.hankooki" , kor: "스포츠한국"}
        ,{site:"mhns" , kor: "문화뉴스"}
        ,{site:"cbci" , kor: "cbc뉴스"}
        ,{site:"newsculture" , kor: "뉴스컬처"}
        ,{site:"stardailynews" , kor: "스타데일리뉴스"}
        ,{site:"celuvmedia" , kor: "셀럽미디어"}
        ,{site:"slist.kr" , kor: "싱글리스트"}
        ,{site:"enews.imbc" , kor: "imbc연예"}
        ,{site:"bntnews" , kor: "bntnews"}
        ,{site:"gpkorea" , kor: "지피코리아"}
        ,{site:"tvdaily" , kor: "타브이데일리"}
    ];

 

 

2. 언론사 이름 확인 함수 getKoreanNameByLink

originallink를 입력받아 언론사 이름을 반환하는 함수를 구현합니다. 우선 site 배열을 순회하며 originallink에 도메인이 포함된 경우 해당 언론사 이름을 반환하고, 배열에 포함되지 않은 도메인일 경우 도메인 이름을 추출해 반환합니다.

이 과정에서 불필요한 서브도메인이나 확장자 (예: www, co, kr 등)를 제거하여 깔끔한 도메인명만 남기도록 정규식을 사용해 가공합니다.

function getKoreanNameByLink(originallink) {
    const site = [
        { site: "insight", kor: "인사이트" },
        { site: "topstarnews", kor: "톱스타뉴스" },
        { site: "yna", kor: "연합뉴스" },
        { site: "hankookilbo", kor: "한국일보" }
        // 필요한 언론사 추가
    ];
    
    // site 배열을 순회하며 originallink에 site 값이 포함되어 있는지 확인
    for (const entry of site) {
        if (originallink.includes(entry.site)) {
            return entry.kor; // 포함되어 있으면 kor 값을 반환
        }
    }
    
    // site 배열에 없는 경우 도메인 이름 추출 후 불필요한 부분 제거
    const url = new URL(originallink);
    let hostname = url.hostname;
    hostname = hostname
        .replace(/^(www|news)\./, '')  // www. 또는 news.로 시작하는 부분 제거
        .replace(/\.(co|kr|com|net|org|jp)$/g, '');  // 최상위 도메인 제거

    return hostname; // 정리된 도메인명 반환
}

 

 

3. 네이버 API 뉴스 데이터에서 언론사 이름 가져오기

네이버 API로 받아온 뉴스 데이터를 순회하면서 각 뉴스 항목의 originallinkgetKoreanNameByLink 함수에 전달해 언론사 이름을 얻어옵니다.

아래와 같이 루프를 통해 뉴스 항목의 originallink에 따라 언론사 이름을 콘솔에 출력할 수 있습니다.

// 네이버 api에서 뉴스 받아오는 코드

for (let i = 0; i < news.items.length; i++) {
    const item = news.items[i];
    const korName = getKoreanNameByLink(item.originallink);
    console.log(korName); // 각 뉴스의 언론사 이름 출력
}

 

 

마무리

위와 같이 구현한 코드를 통해, 네이버 API 검색 결과의 originallink를 기반으로 언론사 이름을 추출할 수 있습니다. 매핑되지 않은 언론사의 경우, 도메인명만 간략히 반환하도록 했으며, 이 방법으로 다양한 언론사의 링크를 효율적으로 처리할 수 있습니다.

언론사 사이트가 많기 때문에 배열에 일일이 추가하는 것이 번거롭지만, 주요 언론사부터 하나씩 추가해나가면 특정 언론사의 뉴스임을 보다 직관적으로 파악할 수 있습니다.

반응형