더북(TheBook)
thebook.io
길벗에서 제공하는 IT도서 열람 서비스인 `TheBook`이라는 사이트가 있다.
이렇게 주제별로 나눠져 있어, 한 페이지씩 넘기면서 책의 일부를 열람할 수 있다. 그런데 이전 페이지와 연결되는 경우 이전으로 다시 돌아가야 하는 불편함이 있다. 그래서 이 웹사이트를 크롤링해서, 내용을 html로 직접 가져온뒤 다시 웹페이지로 렌더링 해주는 서비스를 만들어 보려한다.
TheBook의 URL은 아래와 같다.
https://thebook.io/080212/ch01-01/
thebook.io 다음에 오는 URL은 책의 id이다. 그 다음 오는 URL은 책의 각 주제와 소주제를 의미한다.
URL에 책의 id만 입력하여 접속하면, 이렇게 '목차' 부분이 로드 된다. 목차에는 아래와 같이
각 주제와 소주제로 연결되는 링크가 a태그의 href 속성에 존재한다. 이 부분을 크롤링하여 모든 URL를 모아 둔 뒤, for문으로 다시 이 URL의 책 내용을 크롤링 할 예정이다.
npm init -y
으로 node 프로젝트를 하나 생성한다. 루트 디렉터리에 fetching.js 파일을 하나 생성한다.
https://www.npmjs.com/package/axios
axios
Promise based HTTP client for the browser and node.js
www.npmjs.com
axios 는 클라이언트에서 손쉽게 웹 서버에 요청을 보낼 수 있도록 도와주는 모듈이다. 또한 Promise를 반환하기 때문에, data fetching 이후의 동작을 쉽게 정의할 수 있다. (동기적 프로그래밍이 쉽다.) 이 모듈을 사용해서 TheBook 웹페이지의 책 내용을 로드하려 한다.
먼저 위에서 언급했던 목차를 크롤링 해보자.
html을 로드하기 위해서는 일단 TheBook.io 서비스에 get요청을 보내야 한다.
npm install axios
터미널에서 npm으로 axios 패키지를 설치한다.
/fetching.js
const axios = require('axios');
axios.get(`https://thebook.io/080212`)
.then(dataa => {
console.log(dataa);
});
axios.get 메서드에 get 요청을 보낼 주소를 입력하면, 프로미스가 반환되고, 따라서 then 메서드를 사용할 수 있다. then 메서드에 인수로 들어가는 함수의 파라미터로, get 요청에 대한 response가 전달된다.
이와 같이 response 객체의 data 프로퍼티에 웹 서버에서 반환하는 html이 담겨 있다.
이 html 에서 직접 문자열을 검색해서 '목차'에 해당하는 부분을 찾을 수도 있겠지만, 복잡하고 어려운 작업이다. 이를 훨씬 쉽게 해결해주는 모듈이 있는데, 바로 cheerio 이다.
cheerio
Fast, flexible, and lean implementation of core jQuery designed specifically for the server.
cheerio.js.org
cheerio 모듈은 html을 로드하여 jQuery 처럼 사용할 수 있게 해준다.
npm install cheerio
/fetching.js
const axios = require('axios');
const cheerio = require('cheerio');
let $href = [];
axios.get(`https://thebook.io/080212`)
.then(dataa => {
const $ = cheerio.load(dataa.data);
$('section.book-toc>ul>li>a').each((index, item)=>{$href.push(item.attribs.href)});
});
cheerio.load(dataa.data) 로 html을 로드하면 이제 html을 파싱해서 사용할 수 있다.
Thebook의 html 에서 section.book-toc 태그 아래에 목차가 들어있는 것을 확인할 수 있다. 따라서 section.book-toc>ul>li>a 이렇게 하위의 태그들을 선택하고, 이는 배열이기 때문에 .each 메서드를 사용해서 href 속성의 값을 $href 배열에 저장한다.
$href 배열을 보면 아래와 같이 책 주제와 소주제에 대한 URL이 담겨 있는 것을 확인할 수 있다.
이제 이 URL에 대해 axios로 다시 요청을 보내서 책의 내용을 그대로 크롤링 해야한다.
'tech documents > node' 카테고리의 다른 글
mongoose 특정 db와 collection 연결 (0) | 2022.03.01 |
---|---|
npm command 윈도우에서 폴더 삭제 (0) | 2022.02.26 |
[Cheerio],[Axios] 모듈을 사용한 웹 크롤링 - 3 (0) | 2020.04.03 |
[Cheerio],[Axios] 모듈을 사용한 웹 크롤링 - 2 (0) | 2020.04.01 |
댓글