axios와 cheerio를 활용한 웹 크롤링
axios - node.js에서 사용 가능한 비동기 통신 라이브러리
js가 기본으로 제공하는 fetch에 비해 기능이 다양하다.
const axios = require("axios");
const url = "https://news.naver.com";
const getHtml = async () => {
try {
return await axios.get(url);
} catch (error) {
console.error(error);
}
};
axios를 import하고 웹크롤링할 url에 대해 get 요청을 보내면 끝
비동기 함수이므로 return await을 사용 해준다
위 함수를 실행시 url의 웹사이트의 코드가 리턴값으로 들어오며
오류 발생시 catch로 예외 처리한다
Axios 라이브러리에서 인코딩 문제 해결법
Node.js로 웹 크롤러를 제작하다가 euc-kr으로 인코딩된 페이지에서는 글자가 깨지는 문제가 발생하여 해결법을 알아보았다. 라이브러리를 설치한 후 import 한다. 먼저 Axios의 responseType을 로 지정한
sulfurbottom.netlify.app
euc-kr로 인코딩된 한국 웹사이트는 글자가 깨져 보일 수 있다.
이 경우엔 해당 글 참고
크롤링 하려는 대상이 속한 태그를 확인한다
내가 크롤링하려는 내용은 "section_headline"이란 클래스명 <div> 안의 <ul>에 존재하였고
<ul>은 여러개의 <li>로 구성되어 있었으며
각 <li>는 "sh_text"란 <div> 안 <a> 태그에 들어있었다
const $ = cheerio.load(data);
const $articleList = $('div.section_headline ul').children("li");
$articleList.each(function(i, elem) {
let title = $(this).find('div.sh_text a').text();
let links = $(this).find('div.sh_text a').attr('href'));
load - html 문자열을 인자로 받아 cheerio 객체를 리턴한다
children - 인자로 받은 셀렉터(li) 태그들을 배열로 반환
find - 인자로 받은 셀렉터 태그 반환
해당 태그의 속성값은 attr(), innerHtml은 text() 함수로 얻을 수 있다
실행 화면
참조한 글
Node.js 에서 웹 크롤링하기
이번에 회사에 입사를 하게 되면서 사내 토이 프로젝트로 뉴스 게시판을 만들기로 하였습니다. 그에 따른 준비로 뉴스 데이터를 가지고 올 웹 크롤러를 Node 기반으로 만들었는데 이 경험을 공유
velog.io
https://velog.io/@_nine/Node.js-Crawling-feat.-Cheerio
[Node.js] Crawling (feat. Cheerio)
Node.js의 Cheerio 모듈을 통해 YES24 웹 사이트의 베스트 셀러 크롤링해보기
velog.io