개인 포트폴리오/술렁술렁(전통주 플렛폼)

술렁술렁 프로젝트 - 개인 백엔드 작업, 전통주 데이터 크롤링, DB 데이터 삽입

roalwh 2023. 10. 12. 20:29

전통주 데이터 크롤링 작업 및 DB 데이터 삽입

  • 해외의 경우 술에 관련된 API 가 다수 존재
  • 국내의 경우 각제조사별 술 데이터만 있을 뿐 한곳에 모여있는 데이터가 없음.
  • 프로젝트를 진행하려면 술, 전통주에 대한 데이터가 필요한 상황이 였기 때문에 데이터를 어디서 가져와되는 상황
  • 네이버 백과사전의 전통주에 대한 데이터가 있어 정보를 가져오기 로 결정하였음

1. 데이터 크롤링

1-1.파이썬을 이용한 데이터 크롤링

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd



# 담아 둘 배열
links = []
titles1 = []
titles2 = []
contents = []
parts = []
alcs = []
prices = []
materials = []
manufacturers = []
addrs = []
imgs = []
stores = []


for i in range(0,59):
# 크롤링할 주소
    page = requests.get("https://terms.naver.com/list.naver?cid=58637&categoryId=58637&page=%d" % i)
    soup = bs(page.text, "html.parser")
    # 가져올 항목
    for j in range(1,16):  
        link = soup.select('#content > div.list_wrap > ul > li:nth-child(%d) > div.info_area > div.subject > strong > a:nth-child(1)' % j )
        title1 = soup.select('#content > div.list_wrap > ul > li:nth-child(%d) > div.info_area > div.subject > strong > a:nth-child(1)' % j )
        title2 = soup.select('#content > div.list_wrap > ul > li:nth-child(%d) > div.info_area > div:nth-child(3) > div > span:nth-child(1) > em' % j )
        content = soup.select('#content > div.list_wrap > ul > li:nth-child(%d) > div.info_area > p' % j )
        part = soup.select('#content > div.list_wrap > ul > li:nth-child(%d) > div.info_area > div:nth-child(3) > div > span:nth-child(2) > em' % j )
        alc = soup.select('#content > div.list_wrap > ul > li:nth-child(%d) > div.info_area > div:nth-child(3) > div > span:nth-child(3) > em' % j )
        price = soup.select('#content > div.list_wrap > ul > li:nth-child(%d) > div.info_area > div:nth-child(3) > div > span:nth-child(5) > em' % j )
        material = soup.select('#content > div.list_wrap > ul > li:nth-child(%d) > div.info_area > div:nth-child(3) > div > span:nth-child(6) > em' % j )
        manufacturer = soup.select('#content > div.list_wrap > ul > li:nth-child(%d) > div.info_area > div:nth-child(3) > div > span:nth-child(7) > em' % j )
        addr = soup.select('#content > div.list_wrap > ul > li:nth-child(%d) > div.info_area > div:nth-child(3) > div > span:nth-child(9) > em' % j )
        store = soup.select('#content > div.list_wrap > ul > li:nth-child(%d) > div.info_area > div:nth-child(3) > div > span:nth-child(11) > em' % j )

        # 가져온값 배열에 입력

        if len(link)==0:
            links.append(' ')
        else:
            for index, element in enumerate(link, j-1):
                links.append(element.attrs['href'])


        if len(title1)==0:
            titles1.append(' ')
        else:
            for index, element in enumerate(title1, j-1):
                titles1.append(element.text)


        if len(title2)==0:
            titles2.append(' ')
        else:
            for index, element in enumerate(title2, j-1):
                titles2.append(element.text)

        if len(content)==0:
            contents.append(' ')
        else:
            for index, element in enumerate(content, j-1):
                contents.append(element.text)

        if len(part)==0:
            parts.append(' ')
        else:
            for index, element in enumerate(part, j-1):
                parts.append(element.text)

        if len(alc)==0:
            alcs.append(' ')
        else:
            for index, element in enumerate(alc, j-1):
                alcs.append(element.text)

        if len(price)==0:
            prices.append(' ')
        else:
            for index, element in enumerate(price, j-1):
                prices.append(element.text)

        if len(material)==0:
            materials.append(' ')
        else:
            for index, element in enumerate(material, j-1):
                materials.append(element.text)

        if len(manufacturer)==0:
            manufacturers.append(' ')
        else:
            for index, element in enumerate(manufacturer, j-1):
                manufacturers.append(element.text)

        if len(addr)==0:
            addrs.append(' ')
        else:
            for index, element in enumerate(addr, j-1):
                addrs.append(element.text)

        if len(store)==0:
            stores.append(' ')
        else:
            for index, element in enumerate(store, j-1):
                stores.append(element.text)
    print("%d 페이지" % i)


# 엑셀 컬럼 지정
df = pd.DataFrame()
df['links'] = links
df['titles1'] = titles1
df['titles2'] = titles2
df['contents'] = contents
df['parts'] = parts
df['alcs'] = alcs
df['prices'] = prices
df['materials'] = materials
df['manufacturers'] = manufacturers
df['addrs'] = addrs
df['stores'] = stores

# 엑셀 익스포트
df.to_excel('./library_drink.xlsx', sheet_name='Sheet1')
  • BeautifulSoup , pandas 라이브러리를 이용하여 크롤링을 진행하였음
  • 진행 후 엑셀로 익스포트를 진행하여 데이터 리스트를 가져왔으며 해당 데이터를 가공하여 DB에 등록 하였음

1-2.결과물

2. DB 쿼리 생성 및 DB 데이터 밀어넣기

2-1. DB 쿼리 생성

  • 엑셀 시트를 컬럼별로 정리하여 쿼리문을 생성하였음
  • DB 툴을 이용하여 데이터를 밀어 넣은 뒤
  • 서버에서 직접 mysql 명령어를 사용하여 백업을 진행, 기본 베이스가될 sql 파일을 생성함