자바스크립트/Node.js

axios와 cheerio를 활용한 웹 크롤링

길용쓰 2023. 7. 11. 21:35

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로 예외 처리한다

https://sulfurbottom.netlify.app/Javascript/Axios-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EC%97%90%EC%84%9C-%EC%9D%B8%EC%BD%94%EB%94%A9-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0%EB%B2%95/

 

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() 함수로 얻을 수 있다

 

실행 화면

 

 

 

 

 

참조한 글

 

https://velog.io/@yesdoing/Node.js-%EC%97%90%EC%84%9C-%EC%9B%B9-%ED%81%AC%EB%A1%A4%EB%A7%81%ED%95%98%EA%B8%B0-wtjugync1m

 

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