웹 사이트에서 원하는 정보를 추출하는것
스크래핑
을 수행하려면 먼저 필요한 정보를 찾기위한 크롤링
비슷한 작업을 선행해야한다.
즉
HTTP
통신을 통해 웹의 내용을 추출하여 원하는 형태로 가공하는것을 의미한다.
크롤링
도 일종의 스크래핑
일정 규칙으로 웹페이징에 들어가 필요한 정보를 찾는것
크롤러
는 크롤링을하는 프로그램을 의미하고
크롤링
은 여러 사이트의 페이지(html,xml등등..)을 수집해서 분류하는 하는 것을 의미한다.
즉, 일정수준의 스크래핑
이 동반돼야 가능하다
지속적으로 혼자 동작이 가능하면
크롤링
아니면스크래핑
JS(Node.js)에서 스크래핑을 위한 라이브러리로는
Cheerio
가 있다.
yarn add cheerio
import cheerio from "cheerio"
Jquery
로 만들어진 라이브러리 답게 선택자도$
를 사용한다.
$(selector, [context], [root])
// context와 root는 생략이 가능하다.
예시
<div id="ddiv" class="ddivclass">
Hello
</div>
$("#ddiv").text()
// Hello
$("#ddiv").attr("class")
// ddivclass
const url = "http://naver.com"
const $ = cheerio.load(url);
const obj = {};
$("meta").each((_, el) => {
if ($(el).attr("property")) {
const KEY = $(el).attr("property").split(":")[1];
const VALUE = $(el).attr("content");
if (KEY !== "url") {
obj[KEY] = VALUE;
}
}
});
네이버의 url을 불러서
meta가 들어간걸 찾은뒤 각 element를 조회하면서 객체안에 원하는 값을 집어넣는다
구글에서 만든 크로미움 제어 API
만약 스크래핑도 한다면
cheerio
와 같이 쓰는경우가 많다
yarn add puppetter
import puppeteer from "puppeteer"
import puppeteer from "puppeteer";
const browser = await puppeteer.launch({ headless: false });
// 브라우저가 직접 켜진다
const page = await browser.newPage();
// 새페이지를 만든다
await page.goto("https://www.starbucks.co.kr/menu/drink_list.do");
const name = await page.$eval(
`#container > div.content > div.product_result_wrap.product_result_wrap01 > div > dl > dd:nth-child(2) > div.product_list > dl > dd:nth-child(8) > ul > li:nth-child(1) > dl > dd`,
(el) => el.textContent
);
// 해당하는 html요소를 긁어와 저장한다.
console.log(name)
// 콘솔로 읽는다
await browser.close();
// 킨 브라우저를 끈다
크롤링같은 경우에는 (setInterval
, node-schedule
)과 같은 일정주기로 반복을 시키는경우가 많아 사용한뒤 종료시점을 정하지않으면 유휴상태로 메모리를 너무 많이 잡아먹기때문에 생각하면서 해야할것같다
스크래핑은 "어떤것을" "정확한 무슨데이터를" 가져올것인지를 정하지못하면 하느니만도 못한것같다.