[문자열 웹 크롤링] 오늘의 띠별 운세

2021. 3. 31. 08:05·Python & SQL/Python Practice

오늘은 ①문자열 웹 크롤링 후 ②엑셀 파일에 저장하는 것을 남겨보고자 한다.

 

파이썬에서 엑셀을 제어할 수 있는 라이브러리는 종류가 많은데, 오늘은 openpyxl 을 사용하였다.

크롤링을 할 때, 지난번 구글 및 네이버 이미지 크롤링 때처럼 Selenium 을 사용할 수도 있지만, 오늘은 BeautifulSoup 을 사용하였다. 마지막으로 웹 크롤링에는 간단하게 HTML/CSS 보는 법이 필요하다.

 

 

1) VSCode(Visual Studio Code)를 실행한 후, [ File > Open Folder... > 저장될 폴더 선택 ] 한다. 그리고 그 폴더에 파이썬 파일(파일명.py)을 하나 만든다. (fortune.py 라고 만들어 보겠다.)

 

 

터미널 창을 열고(Ctrl + J), BeautifulSoup 과 openpyxl 라이브러리를 설치해준다.

  • BeautifulSoup 설치 방법 : pip install bs4 + Enter
  • openpyxl 설치 방법 : pip install openpyxl + Enter

 

나의 경우, 이미 설치되어 있다고 나온다. 위와 같이 bs4 와 openpyxl 을 설치하자.

 

2) 크롬(Chrome)에서 데일리 운세 사이트( unse.daily.co.kr/?p=zodiac )로 접속하여 웹 페이지 HTML 구성을 살펴본다( 키보드의 F12 > Elements ). 

그리고 초록색으로 표시한 곳을 클릭하고 웹페이지에 마우스를 움직여보면 영역별로, 구역별로 짜여진 HTML 코드를 확인할 수 있다.

 

 

HTML/CSS 에는 부모, 자식, 형제, 자손 선택자, 자식 선택자, 인접 형제 선택자 등이 있다.

쉽게 말해 상속을 하는데 부모 > 자식 > 자손 이런 식이다.

 

html > body > p

div > h1 > span 

body 은 html 의 자식 요소이고, p 의 부모 요소이다. p 는 html 의 자손 요소이다. 다음 줄도 마찬가지다.

 

같은 부모를 가지고 있는 요소들은 서로 형제 관계에 있다.

형제 관계에 있는 요소 중 바로 뒤에 이어 나오는 요소를 인접해 있다고 한다.

 

영상이 아니라 글로 쓰다보니 설명이 미흡한데, 영역 선택을 해보면 '띠별운세 결과' 부분의 최상위 클래스명은 <selection class="card"> ... </selection> 임을 알 수 있다. 그리고 스크롤을 내려보면, [ 최상위 > 상위 > 하위1 > 하위2 ... ] 이런 구조임을 알 수 있다.

 

 

이쯤에서 코드를 먼저 공개하는 것이 이해가 빠를 것이다. (단, 항상 내가 올리는 코드보다 더 효율적인 코드는 얼마든지 있을 수 있다.)

 

* 라이브러리를 사용하기 위해서는 먼저 import 를 해주어야 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from bs4 import BeautifulSoup   # pip install bs4
import requests     # 웹사이트에 접속
import openpyxl     # pip install openpyxl
 
url = 'https://unse.daily.co.kr/?p=zodiac'
 
res = requests.get(url)
 
soup = BeautifulSoup(res.text, 'html.parser')
 
# 1. 내가 찾고자 하는 데이터를 포함하는 가장 근접한 부모
parent = soup.select_one('#card')
 
# 2. 부모 밑에 있는 자식 요소
children = parent.select('ul')      # select: 여러개의 요소 / select_one: 가장 첫번째 요소
 
wb = openpyxl.Workbook()
 
children = parent.select('ul')      # select: 여러개의 요소 / select_one: 가장 첫번째 요소
for i in children:
    lis = i.select('li')
    for n, li in enumerate(lis):
        if n == 0:
            animal = li.select_one('div > b').get_text()    # 태그 중 텍스트 추출
            total = li.select_one('div > p').get_text()
            print(animal, total)
            print()
            ws = wb.create_sheet(animal)    # animal 이름으로 시트 생성
            ws.append([total])    
        else:
            year = li.select_one('span').get_text()
            luck = li.select_one('p').get_text()
            print(year, luck)
            print()
            ws.append([year, luck])
 
wb.save('fortune.xlsx')
Colored by Color Scripter
cs

 

 

엑셀에 띠별로 각기 다른 시트에 저장하는 코드를 사용했는데, 그 부분은 아래를 참고하면 된다.

 

< openpyxl 샘플 코드 > : Google 에 openpyxl 이라고 검색하면 나온다.

from openpyxl import Workbook
wb = Workbook()

# grab the active worksheet
ws = wb.active

# Data can be assigned directly to cells
ws['A1'] = 42

# Rows can also be appended
ws.append([1, 2, 3])

# Python types will automatically be converted
import datetime
ws['A2'] = datetime.datetime.now()

# Save the file
wb.save("sample.xlsx")

 

우선 파이썬 결과창을 보면 이렇게 문자열이 잘 크롤링 된 것을 볼 수 있다.

옆 폴더에 보면, 엑셀 파일도 잘 생성 되었다. (fortune.xlsx)

 

 

엑셀 파일은 파이썬 안에서는 열 수 없고, 탐색기에서 열어주면 된다. 결과창은 다음과 같다.

첫번째 시트는 기본값이다. 띠별로 시트가 잘 생성되었고, 시트별로 '띠별 총운 + 생년별 운세' 가 제대로 담긴 것을 볼 수 있다.

 

 

이렇게 웹 페이지의 정보들을 내가 원하는 정해진 형태로 모은 다음, 분석을 할 수 있을 것이다.

오늘 해본 것은 매우 단순한 것이지만, 공개된 공공데이터 등으로 응용을 해본다면 의미있는 일을 할 수 있을 것이다.

 

'Python & SQL > Python Practice' 카테고리의 다른 글

파이썬 실행 파일 만들기 (convert .py to .exe)  (2) 2021.04.06
기상청 공공데이터로 내 생일 기온 변화 그래프 그리기(feat. 주피터 노트북)  (0) 2021.03.31
파이썬 자연 언어 처리(Natural Language Processing, NLP) 맛보기  (0) 2021.03.29
파이썬 네이버 이미지 크롤링(Python Naver Image Crawling)  (0) 2021.03.24
파이썬 구글 이미지 크롤링(Python Google Image Crawling)  (0) 2021.03.23
'Python & SQL/Python Practice' 카테고리의 다른 글
  • 파이썬 실행 파일 만들기 (convert .py to .exe)
  • 기상청 공공데이터로 내 생일 기온 변화 그래프 그리기(feat. 주피터 노트북)
  • 파이썬 자연 언어 처리(Natural Language Processing, NLP) 맛보기
  • 파이썬 네이버 이미지 크롤링(Python Naver Image Crawling)
J. Son
J. Son
Petit à petit l'oiseau fait son nid.
  • J. Son
    Steady Study Log
    J. Son
  • 전체
    오늘
    어제
    • 분류 전체보기 (170) N
      • Python & SQL (63)
        • Python Basics (21)
        • Python Problems (23)
        • Python Practice (11)
        • MySQL (1)
        • Git & GitHub (7)
      • ML & DL (7) N
      • Projects (5)
        • Project Portfolio (5)
      • AI Camp (4)
        • Camp Reflection (4)
      • Concept Notes (6)
        • Statistics & Stata (4)
        • Mathematics (2)
      • Archive (84)
        • Java (24)
        • R (1)
        • Languages (49)
        • Miscellaneous (10)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

    • GitHub
    • WikiDocs
  • 공지사항

  • 인기 글

  • 태그

    점프투파이썬 연습문제
    어린왕자 프랑스어
    파이썬 문제
    machine learning
    passe compose
    복합과거
    python problem
    프로젝트 오일러
    초보자를 위한 파이썬 300제
    점프투파이썬 연습문제 풀이
    객체
    프랑스어 공부
    불어 공부
    파이썬 크롤링
    MySQL
    Stata
    python streamlit
    share.streamlit.io
    Le Petit Prince
    불어 관계대명사
    머신러닝
    자바
    streamlit
    맥 git
    파이썬 streamlit
    어린왕자 불어
    파이썬
    GIT
    Python
    Github
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
J. Son
[문자열 웹 크롤링] 오늘의 띠별 운세
상단으로

티스토리툴바