day09

Antipiebse·2022년 3월 26일
0

TIL

목록 보기
8/17

다른 사이트에 있는 정보를 가져오는 방법?

기존 웹사이트에서는 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은 다른 브라우저를 띄우는 것이므로 찾을 수 가 없기 때문이다.


마치며

오늘은 스크랩팽과 크롤링을 해보았다. 내가 원하는 정보를 시간과 장소의 제약없이 컴퓨터가 대신 가져올 수 있다는 점이 매력적인 것 같다. 그러나 다른 사람에게 민폐를 끼치지 않게 잘 사용해야할 것 같다.

profile
백엔드 주니어 개발자

0개의 댓글