<table>로 된 표 — 1단계용
TABLE
구글 시트를 새로 열고 A1 칸에 아래 수식을 그대로 붙여넣으세요. 잠시 뒤 생산 현황 표가 통째로 들어옵니다.
주소 — 어느 페이지에서 /
"table" — 표를 (목록이면 "list") /
1 — 그 페이지의 몇 번째 표인지.2, 3으로 바꿔 가며 찾습니다.
이제 같은 수식의 주소만 부품 카탈로그로 바꿔서 넣어 보세요.
#N/A 가 뜹니다. 실패한 게 아니라,
그 페이지에는 <table>이 없기 때문입니다.
요즘 웹페이지 대부분이 이렇습니다. 그래서 2단계가 필요합니다.
가져올 페이지와 항목을 고르면 수식이 만들어집니다. 복사해서 시트에 붙여넣으세요. 직접 타이핑할 필요는 없습니다 — 먼저 되는 걸 보고, 원리는 그다음에 봅니다.
수식 안의 //div[@class='cc-name'] 같은 부분이 "페이지에서 무엇을 집을지"를
가리킵니다. 페이지를 만든 사람이 각 항목에 붙여 둔 이름표(class)를 쓰는 것입니다.
| 페이지 | 항목 | 이름표(class) | XPath |
|---|
class="..."가 이름표입니다.
위 표는 우리 연습 페이지의 이름표를 미리 정리해 둔 것이니, 먼저 표로 성공한 뒤에 직접 찾아보세요.
IMPORTXML은 편하지만 느리고, 가끔 로딩 중...에서 멈춥니다.
아래 코드를 시트에 한 번 심어두면 내 전용 수식이 생깁니다.
코드는 강사가 한 번 붙여넣는 것이고, 교육생은 수식만 씁니다.
function myFunction() {}를 모두 지우기=긁기(...) 수식 사용/**
* DataForge — 구글 시트 크롤링 도우미
* =긁기("주소", "이름표") 웹페이지에서 값 가져오기
* =API표("주소", "배열이름") JSON API를 표로 가져오기
*/
function 긁기(url, 이름표) {
if (!url || !이름표) return [['주소와 이름표를 모두 넣어주세요']];
var res = UrlFetchApp.fetch(url, {
muteHttpExceptions: true,
followRedirects: true
});
if (res.getResponseCode() !== 200) {
return [['가져오지 못했습니다 (응답코드 ' + res.getResponseCode() + ')']];
}
var html = res.getContentText(); // 옛 한글 사이트면 getContentText('EUC-KR')
var 패턴 = new RegExp('class\\s*=\\s*"[^"]*\\b' + 이름표 + '\\b[^"]*"[^>]*>', 'i');
var 조각 = html.split(패턴);
var 결과 = [];
for (var i = 1; i < 조각.length; i++) {
var t = 조각[i].split(/<\/[a-z]/i)[0]; // 첫 닫는 태그 앞까지만
t = t.replace(/<[^>]*>/g, ' '); // 남은 태그 제거
t = 정리(t);
if (t) 결과.push([t]);
}
return 결과.length ? 결과 : [['찾지 못했습니다 — 이름표를 확인하세요']];
}
function API표(url, 배열이름) {
var res = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
var data = JSON.parse(res.getContentText());
var arr = 배열이름 ? data[배열이름] : data;
if (!Array.isArray(arr) || arr.length === 0) return [['배열을 찾지 못했습니다']];
var 열이름 = Object.keys(arr[0]);
var 표 = [열이름];
for (var i = 0; i < arr.length; i++) {
var 행 = [];
for (var j = 0; j < 열이름.length; j++) 행.push(arr[i][열이름[j]]);
표.push(행);
}
return 표;
}
function 정리(s) {
return s.replace(/ /g, ' ')
.replace(/</g, '<').replace(/>/g, '>')
.replace(/"/g, '"').replace(/�?39;/g, "'")
.replace(/&/g, '&')
.replace(/\s+/g, ' ')
.trim();
}
| 수식 | 결과 |
|---|---|
=긁기("https://dataforge.ai.kr/factory_lab/catalog/", "cc-name") |
제품명 12개 |
=긁기("https://dataforge.ai.kr/factory_lab/catalog/", "cc-price") |
가격 12개 |
=긁기("https://dataforge.ai.kr/factory_lab/news/", "ni-title") |
뉴스 제목 10개 |
크롤링은 남의 집 창문으로 들여다보는 것에 가깝습니다. 그런데 어떤 사이트는 현관문을 열어두고 "데이터 필요하면 여기서 가져가세요" 하고 알려줍니다. 그게 API입니다. 화면이 아니라 데이터를 직접 주기 때문에 훨씬 정확하고, 사이트 디자인이 바뀌어도 안 깨집니다.
센서 API 주소를 브라우저에서 그냥 열어보세요. 화면 대신 데이터가 그대로 보입니다. 이걸 시트로 가져오면:
sensor_code · name · location · value · unit · status …
크롤링에서는 이름표를 하나하나 찾아야 했던 걸, API는 처음부터 이름을 달아서 줍니다.robots.txt를 확인합니다. 주소 뒤에 /robots.txt를 붙이면
그 사이트가 "여기는 긁지 말아 달라"고 적어둔 문서가 나옵니다.