기존 웹사이트에서는 JSON 대신 XML(eXtensible Markup Language)을 이용하여 가져왔었다.
//XML:확장 가능한 마크업 언어로 이런 식이이었다.
<name> 철수</name>
<title>제목</title>
//JSON
{
name:"철수",
title:"제목"
}
특정 사이트에 가서 한 번만 스크랩해서 가져온다.디스코드에서 특정사이트를 입력하면 헤드 태그 안의 메타태그에서 og태그를 찾고 스크랩핑해서
이런 형태로 치어리오를 사용해서 가져온 것이다.
스크래핑 실습
치어리오를 다운받고, OG태그를 잘라내기 위한 소스코드를 작성한다.
import axios from "axios";
import cheerio from 'cheerio'
async function createBoardAPI(mydata) {
// 3. 게시글에서 url찾아서 스크래핑
const targetURL = mydata.contents.split(" ").filter( el => el.startsWith("http"))[0]
// 1. 스크래핑
const aaa = await axios.get(targetURL)
// 2. OG골라내기
const $ = cheerio.load(aaa.data)
//each는 cheerio문법으로
$("meta").each((_, el) => {
if ($(el).attr('property')) {
const key = $(el).attr('property').split(":")[1]
const value = $(el).attr('content')
console.log(key, value)
}
})
}
const frontendData = {
title: ":안녕하세요",
contents: "여기 정말 좋은 거 같아요! 한번 꼭 놀러오세요! 여기는 https://www.naver.com 이에요!!"
}
createBoardAPI(frontendData);
다른 사이트에 있는 정보를 주기적으로 여러 번 가져온다. 실제로 브라우저에 접속을 해서 데이터를 가져온다. 최근 DATA에 대한 가치가 많이 높아졌다. 이로 인해 여러 사건들이 발생했다. 그 중 한가지인 여기어때 크롤링 사건을 소개한다.
여기어때 크롤링 사건 위 링크를 통해 접속해보면 여기어때가 야놀자의 DATA를 맘대로 이용하여 벌어진 사건인데 크롤링을 할 때에는 이를 허용한 사이트에서만 해야하고 너무 자주 많이 정보를 가져가면 서버에서 차단 당할 수 있으니 조심하자.
robots.txt파일을 통해 크롤링이 가능한 부분을 확인할 수 있다.
import puppeteer from 'puppeteer'
//iframe은 셀렉터를 복사해도 다른 사이트라 적용이 안 된다.
//
async function startCrawling() {
const browser = await puppeteer.launch({
headless: false, // false 일 경우 실행 시 웹사이트 확인 가능
args: ['--no-sandbox', '--disable-setuid-sandbox'],
}); const page = await browser.newPage()
await page.setViewport({ width: 1280, height: 720 })
await page.goto("https://finance.naver.com/item/sise.naver?code=005930")
await page.waitForTimeout(1300)
const framePage = await page.frames().find(el => el.url("/item/sise_day.naver?code=005930"))
for (let i = 3; i <= 7; i++) {
await page.waitForTimeout(500)
// iframe 안에 바디 안에 테이블이 있어 접속한 사이트에서는 찾을 수 없다.
// const price = await page.$eval("body > table.type2 > tbody > tr:nth-child(3) > td:nth-child(2)", el=>el.textContent)
const date = await framePage.$eval(`body > table.type2 > tbody > tr:nth-child(${i}) > td:nth-child(1) > span`, el => el.textContent)
const price = await framePage.$eval(`body > table.type2 > tbody > tr:nth-child(${i}) > td:nth-child(2)`, el => el.textContent)
console.log(`날짜: ${date} 가격: ${price}`)
}
//browser닫기
await browser.close()
}
startCrawling()
네이버 주식에서 삼성전자의 정보를 가져오는 소스코드인데 중간중간 시간지연을 주었다. 또한 iframe을 사용하는 곳이라면 따로 처리를 해주어야한다. 왜냐하면 접속한 사이트를 기준으로 데이터를 찾는 것인데 iframe은 다른 브라우저를 띄우는 것이므로 찾을 수 가 없기 때문이다.
오늘은 스크랩팽과 크롤링을 해보았다. 내가 원하는 정보를 시간과 장소의 제약없이 컴퓨터가 대신 가져올 수 있다는 점이 매력적인 것 같다. 그러나 다른 사람에게 민폐를 끼치지 않게 잘 사용해야할 것 같다.