웹 사이트에서 원하는 정보를 추출하는것
스크래핑을 수행하려면 먼저 필요한 정보를 찾기위한 크롤링 비슷한 작업을 선행해야한다.
즉
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)과 같은 일정주기로 반복을 시키는경우가 많아 사용한뒤 종료시점을 정하지않으면 유휴상태로 메모리를 너무 많이 잡아먹기때문에 생각하면서 해야할것같다
스크래핑은 "어떤것을" "정확한 무슨데이터를" 가져올것인지를 정하지못하면 하느니만도 못한것같다.