URL 메타 정보 긁어오기
특정 URL의 타이틀, 이미지, 설명 정보를 간단히 긁어오는 웹스크래핑 소스를 작성해 보았다.
import cheerio from 'cheerio'
export function _getHostname(url) {
let start = url.indexOf('://') + 3
let end = url.indexOf('/', start)
return url.slice(start, end)
}
export function _getProtocol(url) {
let end = url.indexOf('://') + 3
return url.slice(0, end)
}
export function _bodyScrap(url) {
return ($) => {
// 글제목
let title = $('meta[property=\'og:title\']').attr('content')
if(!title){
title = $('head title').text()
if(!title){
throw Error('This link has no title')
}
}
// 글이미지
let image = $('meta[property=\'og:image\']').attr('content')
if(!image){
image = $('img').attr('src')
//이미지 세팅
if(image && image.indexOf('http') === 0){
// http 로 시작하면 그냥 사용
}else if(image && image[0] === '/'){
// image 경로가 / 로 시작한다면
//let urlObj = new URL(url);
image = _getProtocol(url) + _getHostname(url) + image
}else{
image = ''
}
}
// 글요약본
let desc = $('meta[property=\'og:description\']').attr('content')
if(!desc){
desc = ''
}
return {
title,
image,
desc,
}
}
}
export async function getUrlMeta(url){
const meta = await fetch(url)
.then((res) => res.text())
.then(cheerio.load)
.then(_bodyScrap(url))
return meta
}
브라우져에서 사용할 경우에는 CORS 문제로 url의 응답을 가져오는데 제한이 있을 수 있다. 그럴 경우에는 URL의 응답을 받을 수 있는 접근 가능한 별도의 서버 엔드포인트를 이용해야 한다.
ex) https://www.scraperapi.com
출력 결과 예시
https://news.v.daum.net/v/20190907150817348 에 대한 결과
{
"title": "여야, 조국 두고 \"의혹해소·개혁매진\" vs \"자진사퇴·지명철회\"",
"image": "https://img1.daumcdn.net/thumb/S1200x630/?fname=https://t1.daumcdn.net/news/201909/07/yonhap/20190907150817591lmhm.jpg",
"desc": "(서울=연합뉴스) 설승은 이슬기 기자 = 여야는 7일 국회 인사청문회를 마친 조국 법무부 장관 후보자의 적격성 여부를 놓고 극명한 입장차를 보였다. 여당인 더불어민주당과 정의당은 조 후보자가 적격하다는 입장인 반면 자유한국당과 바른미래당, 민주평화당은 청문회에서 부적격함이 드러났다며 자진사퇴나 지명철회를 요구하고 있다. 우선 민주당은 인사청문회를 통해 조"
}
Ref.
https://github.com/min9nim/webscrap/blob/master/src/com/webscrap.js
Comments