오늘은 다른 사이트의 데이터를 가지고 오는 Scrapping 방식과 Crawling 방식을 알아보겠다.
가장 간단하게 두 방식을 구분해보자면 아래와 같다.
한 번 가져온다.
꾸준히 가져온다.
포스트맨, axios로 아래와 같이 받아오기
- 원하는 정보를 뽑은 다음 그것을 저장하여 사용하면 된다. 아래 이미지와 같이 네이버의 코드를 포스트맨에서 get방식으로 html코드를 뽑아올 수 있다. 여기에서 'https://www.naver.com' 은 endpoint가 되는 것이다.
터미널에서 curl로 html코드를 받아오기
curl https://www.naver.com
export const createPreferSiteData = async ({ prefer }) => {
const page = await axios.get(prefer)
let result = {
title: '',
description: '',
image: ''
}
const $ = cheerio.load(page.data) //result랑 result.data랑 크게 달라보이지 않음..
$(`meta`).each((_, el) => {
if($(el).attr("property")?.includes("og:title")) {
result.title = $(el).attr("content")
}
if($(el).attr("property")?.includes("og:description")) {
result.description = $(el).attr("content")
}
if($(el).attr("property")?.includes("og:image")) {
result.image = $(el).attr("content")
}
})
return result
}
const coffeeCrawling = async () => {
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.goto('https://www.starbucks.co.kr/menu/drink_list.do')
await page.waitForTimeout(1000)
let i
for(i=1; i<=32; i++) {
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(6) > ul > li:nth-child(${i}) > dl > dd`,
(el) => el.textContent
)
const img = 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(6) > ul > li:nth-child(${i}) > dl > dt > a > img`,
(el) => el.getAttribute('src')
)
const coffee = new Coffee({
name,
img
})
await coffee.save()
}
if(i === 33) {
console.log(`총 ${i-1}개의 커피 데이터 가져오기 성공`)
}
await browser.close()
}