본문 바로가기
Python

Python - 엑셀파일과 크롤링

by DGK 2021. 11. 1.

 

인프런 파이썬 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

크롤링 & 엑셀파일(Python)

크롤링으로 추출한 데이터를 엑셀파일의 생성·저장 및 읽기의 방법과 접목시켜 다양한 기능을 구현하고자 한다.

 

엑셀파일 생성하기

import openpyxl

excel_file = openpyxl.Workbook()

 

우선, 엑셀파일을 읽고 저장할 수 있는 openpyxl 라이브러리를 임포트 한다.

그리고 openpyxl 라이브러리의 Workbook() 함수를 활용하여, 엑셀파일을 생성한 후 변수 excel_file에 할당한다.

 

excel_sheet = excel_file.active

excel_sheet.title = '리포트'

 

이렇게 변수 excel_file에 엑셀 파일이 생성되면, 디폴트 sheet가 생성되고 생성된 엑셀파일이 들어가있는 변수명을

사용해서 해당 sheet(디폴트 sheet)를 선택할 수 있다. (ex. excel_sheet = excel_file.active)

참고로, 엑셀 파일의 다른 sheet을 선택하려면 excel_sheet = excel_file["sheet 이름"]의 코드를 사용하면 된다.

 

또한, 우리가 선택한 디폴트 sheet의 이름을 변경하기 위해서는 위의 예시처럼 변수명.title = 'sheet 이름'의 코드를

사용해서 해당 sheet의 이름을 변경할 수 있다. (ex. excel_sheet.title = 'sheet 이름')

 

excel_sheet.append(['data1', 'data2', 'data3'])

 

append() 함수를 사용하여, 선택한 엑셀 sheet 안에 원하는 데이터를 넣을 수 있다.

append() 함수의 인자로 들어온 데이터는 해당 엑셀 sheet의 각 행(가로)으로 채워진다.

 

excel_file.save('tmp.xlsx')

 

위의 코드는 앞서 생성하고, 데이터를 넣은 엑셀파일을 저장한다.

save() 함수의 인자로 파일명을 넣어주면된다.

참고로, 주피터노트북으로 위의 코드를 실행할 경우에는 주피터노트북이 실행되는 폴더에 엑셀파일(tmp.xlsx)이

생성 및 저장된다.

 

excel_file.close()

 

프로그램에서 파일을 처리할 때는 마지막에 반드시 파일을 닫아야한다.(리소스 낭비 방지)

즉, 파일을 오픈하거나 생성하면 마지막에는 파일을 닫아줘야 한다.

 

 

엑셀파일 생성하기(전체 코드)

import openpyxl

excel_file = openpyxl.Workbook()
excel_sheet = excel_file.active
excel_sheet.title = '리포트'
excel_sheet.append(['data1', 'data2', 'data3'])

excel_file.save('tmp.xlsx')
excel_file.close()

 

 

엑셀파일을 만드는 함수 작성하기

import openpyxl

def write_excel_template(filename, sheetname, listdata):
    excel_file = openpyxl.Workbook()
    excel_sheet = excel_file.active
    excel_sheet.column_dimensions['A'].width = 100
    excel_sheet.column_dimensions['B'].width = 20
    
    if sheetname != '':
        excel_sheet.title = sheetname
    
    for item in listdata:
        excel_sheet.append(item)
    excel_file.save(filename)
    excel_file.close()

 

엑셀 파일을 생성하여 데이터를 추가한 후, 저장하고 파일을 닫는 모든 과정을 담은 함수 코드이다.

참고로, 함수의 인자인 listdata는 이중 리스트 형태이다.(리스트 안에 리스트가 있는 경우)

그 이유는 전체 리스트의 요소가 엑셀 sheet의 각 행(가로)으로 저장되기 때문이다.

 

또한, 데이터 크기가 클 경우를 대비하여 변수명.column_dimensions['셀의 이름'].with = 원하는 크기(숫자)의 코드로

sheet에서 셀의 크기를 조정할 수 있다. (ex. excel_sheet.column_dimensions['A'].width = 100)

 

 

크롤링 후, 엑셀파일 만들기(함수 활용)

import requests
from bs4 import BeautifulSoup

product_lists = list()

for page_num in range(10):
    if page_num == 0:
        res = requests.get('https://davelee-fun.github.io/')
    else:
        res = requests.get('https://davelee-fun.github.io/page' + str(page_num + 1))
    soup = BeautifulSoup(res.content, 'html.parser')

    data = soup.select('div.card')
    for item in data:
        product_name = item.select_one('div.card-body h4.card-text')
        product_date = item.select_one('div.wrapfooter span.post-date')
        product_info = [product_name.get_text().strip(), product_date.get_text()]
        product_lists.append(product_info)

 

크롤링으로 추출한 데이터를 각 변수(product_name, product_date)에 넣고 해당 변수를 요소로하는 리스트를 

변수 product_info에 할당한 것이다.

(ex. product_info = [product_name.get_text().strip(), product_date.get_text()])

 

또한, 변수 product_info에 들어있는 리스트를 앞서 선언한 빈 리스트(변수 product_lists)에 할당함으로써

이중 리스트의 형태를 만든 것이다.

 

write_excel_template('tmp2.xlsx', '상품정보', product_lists)

 

위의 코드는 엑셀 파일을 만들고, 데이터를 추가 및 저장한 후 파일을 닫는 함수를 실행한다.

 

 

엑셀파일의 데이터 읽어오기

import openpyxl

 

우선, 엑셀파일을 읽고 저장할 수 있는 openpyxl 라이브러리를 임포트한다.

 

excel_file = openpyxl.load_workbook('tmp2.xlsx')

 

openpyxl.load_workbook('파일명')의 코드를 사용해서 원하는 엑셀 파일을 읽어온다.(오픈)

참고로, 주피터노트북에서 엑셀파일을 오픈하려면 주피터노트북이 실행되고 있는 폴더 안에 해당 엑셀파일이

존재해야 한다.

 

excel_sheet = excel_file["상품정보"]

print(excel_file.sheetnames)

 

excel_sheet = excel_file["sheet 이름"]의 코드를 사용해서, 해당 엑셀파일의 sheet을 변수에 할당하고 가져온다.

참고로, 엑셀 파일의 sheet 이름을 확인하려면 excel_file.sheetnames 코드를 사용하면 된다. (리스트 형태로 리턴됨)

 

for item in excel_sheet.rows:
    print(item[0].value, item[1].value)

 

위에서 가져온 sheet의 데이터를 읽어오는 코드이다.

excel_sheet.rows의 코드는 엑셀 sheet의 열(row)에 들어있는 데이터를 하나씩 item에 전달하는 것을 의미한다.

이후, item에 들어간 데이터들의 인덱스 번호를 사용해서 데이터를 리턴한다.

 

또한, 열(row)은 sheet의 각 셀을 의미하기 때문에 셀 안에 있는 데이터를 가져오기 위해서는 인덱스 번호 뒤에

반드시 value를 붙여줘야 한다. (ex. item[0].value, item[1].value)

 

```

결과:

 

상품명: 보몽드 순면스퀘어 솔리드 누빔매트커버, 다크블루 05 Jun 2020

상품명: 슈에뜨룸 선인장 리플 침구 세트, 베이지 05 Jun 2020

상품명: 선우랜드 레인보우 2단 문걸이용 옷걸이 _중형, 화이트, 상세페이지참조 05 Jun 2020

상품명: 보드래 헬로우 누빔 매트리스커버, 핑크 05 Jun 2020

상품명: 보드래 퍼펙트 누빔 매트리스커버, 차콜 05 Jun 2020

상품명: 피아블 클래식 방수 매트리스커버, 화이트 05 Jun 2020

상품명: 더자리 에코항균 마이크로 매트리스커버, 밀키차콜그레이 05 Jun 2020

상품명: 더자리 프레쉬 퓨어 매트리스 커버, 퓨어 차콜그레이 05 Jun 2020

상품명: 몽쉐어 알러스킨 항균 매트리스 커버, 카키그레이 05 Jun 2020

상품명: 쿠팡 브랜드 - 코멧 홈 40수 트윌 순면 100% 홑겹 매트리스커버, 그레이 05 Jun 2020

상품명: 패브릭아트 항균 마이크로 원단 매트리스 커버, 아이보리 05 Jun 2020

상품명: 바숨 순면 누빔 침대 매트리스커버, 차콜 05 Jun 2020

상품명: WEMAX 다용도 문옷걸이, 화이트, 1개 05 Jun 2020

상품명: 타카타카 프리미엄 나노 화이바 누빔 매트리스 커버, 젠틀핑핑 05 Jun 2020

상품명: 보몽드 순면스퀘어 누빔매트커버, 다크그레이 05 Jun 2020

상품명: 보드래 국내산 순면 60수 누빔 매트리스커버, 그레이 05 Jun 2020

상품명: 보드래 퍼펙트 누빔 매트리스커버, 베이지핑크 05 Jun 2020

상품명: 쿠팡 브랜드 - 코멧 홈 40수 순면 누빔 매트리스커버, 챠콜 05 Jun 2020

상품명: 바숨 순면 누빔 침대 매트리스커버, 화이트 05 Jun 2020

상품명: 프랑떼 항균 방수 매트리스커버, 화이트 05 Jun 2020

상품명: 보몽드 순면스퀘어 솔리드 누빔매트커버, 다크블루 05 Jun 2020

상품명: 네이쳐리빙 피아블 클래식 방수 매트리스커버, 그레이 05 Jun 2020

상품명: 쿠팡 브랜드 - 코멧 홈 순면 매트리스커버, 베이지 05 Jun 2020

상품명: 타카타카 프리미엄 나노 화이바 누빔 매트리스 커버, 프렌치불독 05 Jun 2020

상품명: 더자리 에코항균 마이크로 매트리스커버, 밀키그레이 05 Jun 2020

상품명: 보몽드 순면스퀘어 누빔매트커버, 화이트 05 Jun 2020

상품명: 피아블 클래식 방수 매트리스커버, 화이트 05 Jun 2020

상품명: 쿠팡 브랜드 - 코멧 홈 순면 매트리스커버, 차콜그레이 05 Jun 2020

상품명: 쉬즈홈 모던그리드 순면 여름이불 베개커버 패드세트, 핑크 05 Jun 2020

상품명: 스코홈 빅리플 여름 차렵이불패드 3종 세트, 마린그레이 05 Jun 2020

상품명: 아망떼 시어서커 리플 홑이불 패드세트, 웨이크 05 Jun 2020

상품명: 마이센스 무더운 여름엔 시어서커 여름이불 패드 베개 이불세트 30종, 시어서커_파스텔그레이 05 Jun 2020

상품명: 믹스앤매치 로라 프릴 시어서커 침구세트, 그레이 05 Jun 2020

상품명: 에피소드1 샤베트 프릴 시어서커 여름이불패드세트, 그레이 05 Jun 2020

상품명: 슈에뜨룸 선인장 리플 침구 세트, 베이지 05 Jun 2020

상품명: 아망떼 시어서커 리플 홑이불 패드세트, 허브티 05 Jun 2020

상품명: 지베딩 아이스베어 시어서커 여름침구 풀세트, 민트그레이 05 Jun 2020

상품명: 쁘리엘르 테스 시어서커 여름이불 패드세트, 그레이 05 Jun 2020

상품명: 쉬즈홈 시어서커 홑이불 + 토퍼 + 베개커버 세트, 나나 옐로우 05 Jun 2020

상품명: 아망떼 시어서커 리플 퀼팅 이불패드세트, 리엔나 05 Jun 2020

상품명: 바자르 트로피컬 인견 여름 이불세트 인견이불 + 베개커버 2p + 인견패드, 그린 05 Jun 2020

상품명: 바자르 라이닝 혼방 인견 여름 이불베개세트 + 패드 Q, 쿨 네이비 05 Jun 2020

상품명: 슈에뜨룸 비숑 피치스킨 침구세트, 그레이 05 Jun 2020

상품명: 스코홈 시어서커 여름 이불 패드 3종 세트, 차콜 05 Jun 2020

상품명: 스코홈 어번시리즈 순면 차렵이불 누빔 매트커버세트 S 차콜 05 Jun 2020

상품명: 쉬즈홈 루즈 시어서커 차렵이불 패드세트, 그레이 05 Jun 2020

상품명: 예가로드 메리엘 시어서커 누비이불 패드세트, 블루 05 Jun 2020

상품명: 에피소드1 샤베트 프릴 시어서커 여름이불패드세트, 화이트 05 Jun 2020

상품명: 쉬즈홈 플루 시어서커 차렵이불 패드세트, 그린 05 Jun 2020

상품명: 메종 레이스 차렵 이불 세트, 블루 05 Jun 2020

상품명: 믹스앤매치 로라 프릴 시어서커 침구세트, 그린 05 Jun 2020

상품명: 슈에뜨룸 발그레 피치 리플 침구 세트, 혼합 색상 05 Jun 2020

상품명: 보몽드 메종 레이스 차렵이불 3종 세트, 민트 05 Jun 2020

상품명: 슈에뜨룸 체크 피치스킨 침구세트, 모카 05 Jun 2020

상품명: 메리엘 시어서커 에어리플 이불세트, 그레이 05 Jun 2020

상품명: 슈에뜨룸 빠삐용 시어서커 침구세트, 네이비 05 Jun 2020

상품명: 믹스앤매치 에이프릴 리플 누비이불 패드세트, 화이트 05 Jun 2020

상품명: 쉬즈홈 시어서커 홑이불 토퍼세트, 루즈 그레이 05 Jun 2020

상품명: 이코디 5단 엔틱 도어 행거, 브라운, 1개 05 Jun 2020

상품명: 선우랜드 우드볼 도어훅 4구, 실버, 1개 05 Jun 2020

상품명: 리은상점 다용도 도어훅 문걸이 행거 모자걸이 머플러 목도리 걸이, 화이트, 5개 05 Jun 2020

상품명: 퍼니스코 다용도걸이 모자걸이 가방걸이 도어훅 도어행거 문걸이, 엔틱브라운, 1세트 05 Jun 2020

상품명: 스텐 도어후크 옷걸이/도어훅 문옷걸이 행거 바지걸이, 혼합 색상, 1개 05 Jun 2020

상품명: 디비플러스 키펙스 컬러 폭조절 오버 도어훅, 블랙, 1개 05 Jun 2020

상품명: 리빙스토리 1+1 문에 거는 문 옷걸이 음자리 도어후크 방문 행거, 음자리도어후크-로즈골드, 2개 05 Jun 2020

상품명: 나이스후크 도어행거 2개 세트 (문행거), 블랙+화이트 05 Jun 2020

상품명: 리빙파이 도어훅 옷걸이 행거 7구, 블랙, 1개 05 Jun 2020

상품명: 선우랜드 우드볼 도어훅 10구, 실버, 1개 05 Jun 2020

상품명: 웰렉스 도어행거 MH1060 신형 본사직발송 미니건조대 도어옷걸이 도어훅, 고동색, 1개 05 Jun 2020

상품명: 엔비 엔틱 7구 도어훅 옷걸이, 도어훅 1+1, 1+1 05 Jun 2020

상품명: 코시나 무타공 문걸이 후크선반 1단, 화이트, 1개 05 Jun 2020

상품명: 코시나 무타공 올스텐 문걸이행거, 혼합 색상, 1개 05 Jun 2020

상품명: [아트박스 POOM/이케아] ENUDDEN 도어 행거, 본품, 수량 05 Jun 2020

상품명: 비스비바 우드 폴 다용도걸이 3구, 혼합 색상, 1개 05 Jun 2020

상품명: 숲속애 웨이브 도어후크 5구, 블랙, 1개 05 Jun 2020

상품명: 펀타스틱 다용도 문틀걸이, 화이트, 1개 05 Jun 2020

상품명: 선우랜드 우드볼 도어훅 4구, 화이트, 1개 05 Jun 2020

상품명: 네이쳐리빙 어반모카 와이어 도어훅 옷걸이 6구, 단일 색상, 1개 05 Jun 2020

상품명: 까사마루 블랑 접이식 문걸이 건조대, 1개 05 Jun 2020

상품명: 선우랜드 우드볼 도어훅 6구, 실버, 1개 05 Jun 2020

상품명: 이케아 ENUDDEN 문걸이 행거 402.516.66, 화이트, 1개 05 Jun 2020

상품명: 선우랜드 우드볼 도어훅 10구, 화이트, 1개 05 Jun 2020

상품명: 코멧 홈 우드볼 도어행거, 6구, 혼합색상 05 Jun 2020

상품명: 선우랜드 레인보우 2단 문걸이용 옷걸이 _중형, 화이트, 상세페이지참조 05 Jun 2020

상품명: 코시나 무타공 문걸이 후크선반 2단, 화이트, 1개 05 Jun 2020

상품명: 스파이더락 도어후크 8구, 화이트, 1개 05 Jun 2020

상품명: 선우랜드 우드볼 도어훅 6구, 화이트, 1개 05 Jun 2020

상품명: 코멧 홈 우드볼 도어행거, 10구, 혼합색상 05 Jun 2020

상품명: 보드래 헬로우 누빔 매트리스커버, 핑크 05 Jun 2020

상품명: 보몽드 순면스퀘어 솔리드 누빔매트커버, 아이보리 05 Jun 2020

상품명: 더자리 에코항균 마이크로 매트리스커버, 밀키핑크 05 Jun 2020

상품명: 타카타카 프리미엄 나노 화이바 누빔 매트리스 커버, 미스밍고 05 Jun 2020

상품명: 네이쳐리빙 피아블 클래식 방수 매트리스커버, 그레이 05 Jun 2020

상품명: 프로텍트어베드 베이직 매트리스 방수커버, 그레이 05 Jun 2020

 

```

 

excel_file.close()

 

엑셀 파일을 읽어왔으면, 반드시 마지막에는 파일을 닫아야한다.(엑셀 파일 생성과정과 동일)

 

 

엑셀파일의 데이터 읽어오기(전체 코드)

import openpyxl

excel_file = openpyxl.load_workbook('tmp2.xlsx')
excel_sheet = excel_file.active

for row in excel_sheet.rows:
    print(row[0].value, row[1].value)

excel_file.close()

 

```

결과 :

 

위의 결과와 동일

 

```

 

 

 

 

댓글