직원업무검색기

2025-06 AI 실무강의자료.zip
5.87MB
업무에 바로 쓰는 신박한 Ai 활용법 2탄-수정(25.06.27.).pdf
0.44MB

BeautifulSoup vs Selenium: 비교와 선택 기준

비교 항목

BeautifulSoup Selenium
속도 빠름 (HTML 파싱만 수행) 느림 (실제 브라우저를 실행하여 요소를 로드하고 조작)
주요 기능 정적 HTML 파싱 및 데이터 추출 (페이지 내 HTML을 분석하여 데이터 수집) 브라우저 자동화 및 동적 페이지 처리 (실제 웹 브라우저 조작 가능)
동적 페이지 처리 지원하지 않음 (JavaScript를 통해 동적으로 로드되는 요소는 처리 불가) 지원 (브라우저에서 JavaScript를 실행해 동적 콘텐츠를 렌더링 가능)
사용 상황 정적 웹 페이지의 HTML에서 데이터 추출이 필요한 경우. 페이지의 HTML 구조가 복잡하지 않고, 데이터가 로드된 상태일 때 적합 동적 콘텐츠 로딩, 버튼 클릭, 로그인 등 브라우저 내 사용자의 동작이 필요한 경우 적합
메모리 사용량 적음 (텍스트 기반으로 파싱만 수행) 많음 (브라우저 구동 및 UI 요소 제어로 메모리 사용량이 증가)
코딩 난이도 쉬움 (HTML 구조 파싱 및 원하는 데이터 추출) 상대적으로 어려움 (브라우저 제어, 동작 수행, 페이지 상태 확인 등 다양한 기능 필요)

어떤 상황에서 사용해야 하는지

  1. 정적 페이지 크롤링 시:
    BeautifulSoup은 페이지 내의 HTML이 한 번에 로드되는 정적 페이지를 크롤링할 때 빠르고 간편합니다. 페이지에서 데이터가 JavaScript 없이 HTML로 바로 렌더링되어 있는 경우 BeautifulSoup이 적합합니다.
  2. 동적 페이지 크롤링 시:
    Selenium은 JavaScript로 동적으로 로드되는 콘텐츠를 다룰 수 있어, 페이지 내 버튼을 클릭하거나 스크롤을 해야 콘텐츠가 로드되는 경우에 적합합니다. 예를 들어 무한 스크롤을 통해 데이터를 가져와야 하는 경우, Selenium으로 스크롤 동작을 자동화할 수 있습니다.
  3. 속도와 효율이 중요한 경우:
    BeautifulSoup은 속도가 빠르고 가볍습니다. 단순하게 HTML 파싱과 데이터 추출만 필요한 경우 Selenium을 사용하기보다 BeautifulSoup을 활용하는 것이 효율적입니다.
  4. 사용자 상호작용이 필요한 경우:
    Selenium은 실제 웹 브라우저를 구동하므로, 페이지에서 사용자의 동작(클릭, 키 입력 등)이 필요한 경우 효과적입니다.

속도 차이 설명

  • BeautifulSoup은 단순히 HTML 텍스트를 파싱하는 도구이므로 매우 빠르게 작동합니다.
  • Selenium은 실제 브라우저를 구동하여 페이지를 로드하고 JavaScript를 실행하므로 처리 속도가 느립니다. 특히, 페이지의 모든 요소가 로드되고 JavaScript가 실행되는 시간이 필요하여 속도에 영향을 미칩니다.

꿀팁: 페이지를 제대로 가져왔는지 확인하는 방법

특정 텍스트 확인:
페이지에서 특정 문자가 있는지 확인하여 페이지가 제대로 로드되었는지 검증할 수 있습니다.

# 페이지 소스에 "특정문자"가 있는지 확인
if "특정문자" in page_source:
    print("페이지 로딩 성공, 크롤링 시작 가능")
else:
    print("페이지 로딩 실패 또는 로드 지연")

"특정문자" in pageTrue이면 크롤링을 시작할 수 있습니다.


크롤링 시 페이지 소스에 원하는 데이터가 없을 때 대처법

  1. 페이지 소스 확인:
    • Selenium: driver.page_source로 현재 로드된 페이지의 전체 HTML을 확인합니다.
    • BeautifulSoup: soup.prettify()로 HTML을 파싱한 결과를 확인합니다.
      원하는 데이터가 페이지 소스에 없을 경우, 이는 JavaScript로 동적으로 로드되는 경우일 수 있습니다.
  2. iframe 의심:
    • iframe 태그로 인해 콘텐츠가 다른 URL에서 로드될 수 있습니다. 이 경우 해당 iframe의 src URL을 찾아 접근해야 합니다.
  3. 모바일 모드로 시도:
    • 일부 웹사이트는 모바일과 PC에서 다르게 로드되므로, 모바일 버전에서는 데이터가 노출될 수 있습니다.
      ex) m.naver.com

이러한 방법을 통해 페이지의 데이터를 정확하게 크롤링할 수 있는지 확인하고 문제를 해결할 수 있습니다.

출처 : https://www.youtube.com/watch?v=qhy8I4ChCuw&t=18s

목차

  1. 준비 사항
  2. Selenium으로 웹 브라우저 제어하기
  3. 웹 페이지 로드 및 요소 대기
  4. 요소 선택과 자동화
  5. 데이터 추출 및 활용
  6. 전체 코드 제시
  7. 결론

1. 준비 사항

Selenium을 사용하기 위해 다음과 같은 모듈을 설치해야 합니다.

pip install selenium

2. Selenium으로 웹 브라우저 제어하기

먼저 Selenium으로 웹 브라우저를 실행하고 자동화 작업을 수행할 준비를 합니다.

from selenium import webdriver

# 크롬 드라이버 실행
driver = webdriver.Chrome()

# 접속할 URL 설정
url = "http://naver.com"

# URL 접속하기
driver.get(url)

3. 웹 페이지 로드 및 요소 대기

웹 페이지의 요소가 로드될 때까지 기다리는 작업은 WebDriverWait을 통해 수행할 수 있습니다.

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 특정 요소가 로드될 때까지 대기 (최대 10초)
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "query"))
)

위 코드는 IDquery인 요소가 최대 10초 동안 나타날 때까지 기다립니다.


4. 요소 선택과 자동화

HTML 페이지에서 다양한 방법으로 요소를 찾고 동작을 자동화할 수 있습니다.

# 클래스 이름으로 검색창 찾기
driver.find_element(By.CLASS_NAME, "search_input").send_keys("class ")

# ID로 검색창 찾기
driver.find_element(By.ID, "query").send_keys("id ")

# name 속성으로 검색창 찾기
driver.find_element(By.NAME, "query").send_keys("query ")

# CSS 셀렉터로 검색창 찾기 (가장 많이 사용되는 방법)
driver.find_element(By.CSS_SELECTOR, "[title='검색어를 입력해 주세요.']").send_keys("title ")

# 링크 텍스트로 특정 링크 클릭하기
driver.find_element(By.LINK_TEXT, "쇼핑투데이").click()
driver.find_element(By.LINK_TEXT, "경제").click()

# 부분적인 링크 텍스트로 특정 링크 클릭하기
driver.find_element(By.PARTIAL_LINK_TEXT, "핑투데").click()
  • By.CLASS_NAME: 클래스 이름을 이용해 요소를 찾습니다.
  • By.ID: ID를 이용해 요소를 찾습니다.
  • By.NAME: name 속성을 통해 요소를 찾습니다.
  • By.CSS_SELECTOR: CSS Selector를 이용해 원하는 요소를 찾습니다. 가장 일반적으로 사용되는 방법입니다.
  • By.LINK_TEXT, By.PARTIAL_LINK_TEXT: 링크 텍스트 전체 혹은 일부를 이용해 링크 요소를 찾고 클릭할 수 있습니다.

5. 데이터 추출 및 활용

특정 영역에 있는 여러 요소를 찾아 데이터를 추출하고 활용할 수 있습니다.

# CSS 셀렉터로 여러 요소 찾기
for element in driver.find_elements(By.CSS_SELECTOR, "#shortcutArea .shortcut_item .link_service"):
    # 각 요소의 HTML 코드 출력
    print(element.get_attribute("outerHTML"))
    print()

find_elements를 사용하면 해당 조건에 맞는 모든 요소를 리스트로 반환합니다.


6. 전체 코드 제시

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 크롬 드라이버 실행
driver = webdriver.Chrome()

# 접속할 URL 설정
url = "http://naver.com"

# URL 접속하기
driver.get(url)

# 특정 요소가 로드될 때까지 대기 (최대 10초)
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "query"))
)

# HTML 요소 선택 및 자동화 작업 수행
driver.find_element(By.CLASS_NAME, "search_input").send_keys("class ")
driver.find_element(By.ID, "query").send_keys("id ")
driver.find_element(By.NAME, "query").send_keys("query ")
driver.find_element(By.CSS_SELECTOR, "[title='검색어를 입력해 주세요.']").send_keys("title ")
driver.find_element(By.LINK_TEXT, "쇼핑투데이").click()
driver.find_element(By.LINK_TEXT, "경제").click()
driver.find_element(By.PARTIAL_LINK_TEXT, "핑투데").click()

# 특정 영역의 모든 요소 찾기 및 출력
for element in driver.find_elements(By.CSS_SELECTOR, "#shortcutArea .shortcut_item .link_service"):
    print(element.get_attribute("outerHTML"))
    print()

7. 결론

Selenium을 통해 웹 브라우저 제어 및 데이터 추출 작업을 수행해 보았습니다.

  • WebDriverWait를 통해 요소가 로드될 때까지 기다리는 작업을 수행하며, 이는 페이지가 동적으로 로드될 때 유용합니다.
  • 다양한 요소 선택 방법을 통해 원하는 HTML 요소를 찾고 자동화 작업을 수행할 수 있습니다.
  • 추출한 데이터는 콘솔에 출력하거나 다른 파일 형태로 저장해 활용할 수 있습니다.

이번 실습을 통해 Selenium의 기본적인 사용법을 익히고, 웹 페이지를 자동화하는 방법을 배웠습니다.

저번 시간에 파이썬 크롤링(beautifulsoup)을 했는데 이번에는 동적 페이지도 긁어오는 셀리니움을 활용한

크롤링을 해보고, 시간이 되면 판다스도 잠시 해보겠습니다.

 

- 일 시 : 10월 8일(화) 19시

- 장 소 : 구 당리동사(1층) 정보화교육장

- 내 용 :

   파이썬 크롤링(셀레니움)  + 판다스

- 참고사이트

https://www.youtube.com/watch?v=qhy8I4ChCuw

 

출처 : https://www.youtube.com/watch?v=HJcrD7Ukli4&t=33s

목차

  1. 준비 사항
  2. HTML 코드 작성
  3. Python 코드 작성
  4. CSS Selector 사용법
  5. Python으로 긁어온 데이터 엑셀에 저장

1. 준비 사항

모듈 설치

BeautifulSoup과 엑셀 저장을 위해 아래 두 가지 모듈을 설치해야 합니다.

pip install beautifulsoup4 openpyxl

2. HTML 코드 작성

BeautifulSoup을 활용해 데이터를 추출할 HTML 파일을 작성합니다. 이 예제에서는 CSS Selector를 설명하기 위한 간단한 페이지를 만듭니다.

HTML 파일 (index.html)

<!DOCTYPE html>
<html lang="ko">
<head>
    <style>
        body {background-color: black;}
        h1 {color: white;}
        ul {list-style: none;}
        .apple {color: pink;}
        .grape {color: purple;}
        .mango {color: yellow;}
        .banana {font-size: 30px;}
        .greenapple {color: green;}
    </style>
</head>
<body>
    <h1>CSS Selector</h1>
    <div id="site">
        <ul>
            <li><a class="apple" href="https://naver.com">네이버</a></li>
            <li><a class="grape" href="https://google.com">구글</a></li>
            <li><a class="mango" href="https://youtube.com">유튜브</a></li>
            <li><a class="greenapple" href="https://openai.com">OpenAI</a></li>
            <li><a class="greenapple" href="https://python.org">Python</a></li>
        </ul>
        <p class="apple">css selector를 설명하기 위한 페이지</p>
        <p class="apple banana">여기에는 두개의 클래스가 사용</p>
    </div>
</body>
</html>

이 HTML 코드는 CSS 스타일을 적용한 다양한 요소와 클래스를 포함하고 있어, 추후 BeautifulSoup을 사용해 CSS Selector로 데이터를 추출할 수 있습니다.


3. Python 코드 작성

BeautifulSoup을 활용한 CSS Selector 연습

이제 Python을 통해 HTML 파일을 읽어 들여, CSS Selector로 원하는 데이터를 추출하는 코드를 작성해 보겠습니다.

from bs4 import BeautifulSoup

# HTML 파일 경로 설정
url = r'D:/myStudy/beautifulsoupProject/index.html'

# HTML 파일 열기
html = open(url, encoding='utf-8')

# BeautifulSoup 객체 생성
soup = BeautifulSoup(html, 'html.parser')

#====[ select_one : 첫 번째 요소 선택 ]====
# h1 태그 선택
print(soup.select_one("h1"))

# ul 태그 선택
print(soup.select_one("ul"))

# id를 통해 선택 (#site)
print(soup.select_one("#site"))

# class를 통해 선택 (.apple)
print(soup.select_one(".apple"))

#====[ select : 여러 요소를 리스트로 반환 ]====
# class로 선택된 모든 요소 가져오기
print(soup.select(".apple"))

# html 태그 + class로 접근 (a.apple)
print(soup.select("a.apple"))

# p 태그 내 apple 클래스를 가진 요소
print(soup.select("p.apple"))

# 자손 접근: 띄어쓰기로 자손 선택 (#site 내의 li 요소)
print(soup.select("#site li"))

# 자식 접근: 바로 아래 자식 요소만 선택 (#site > li)
print(soup.select("#site > li"))

# 자손 접근 + class (자손 중 apple class)
print(soup.select("#site .apple"))

# a 태그의 apple class 만 찾기
print(soup.select("a[class=apple]"))

# a 태그면서 class가 'app'로 시작하는 요소 찾기
print(soup.select("a[class^=app]"))

# a 태그면서 class에 'app'이 포함된 요소 찾기
print(soup.select("a[class*=app]"))

# 클래스가 apple로 정확히 일치하는 요소 찾기
print(soup.select("[class=apple]"))

# href 속성이 .org로 끝나는 링크 찾기
print(soup.select("a[href$='.org']"))

# 두 개의 클래스를 가진 요소 찾기 (띄어쓰기 주의)
print(soup.select(".apple.banana"))

이 코드는 BeautifulSoup의 다양한 CSS Selector를 활용하여 HTML 요소를 선택하는 방법을 보여줍니다. 각 코드 블록을 실행하면서 출력 결과를 확인해 보세요.


4. CSS Selector 사용법 (보강된 내용)

CSS Selector 종류와 설명

  1. 태그로 선택: soup.select_one("h1")

    • HTML에서 특정 태그를 선택합니다. 위 코드에서는 첫 번째 h1 태그를 선택해 출력합니다.
  2. id로 선택: soup.select_one("#site")

    • id 값이 site인 요소를 선택합니다. id 선택자는 #을 사용하여 특정 id를 가진 요소를 찾아냅니다.
  3. class로 선택: soup.select_one(".apple")

    • class 값이 apple인 요소 중 첫 번째 요소를 선택합니다. class 선택자는 .을 사용합니다.
  4. 태그와 클래스 조합으로 선택: soup.select("a.apple")

    • a 태그 중에서 class가 apple인 요소만 선택합니다.
  5. 자손 접근: soup.select("#site li")

    • id가 site인 요소 내에 있는 모든 li 자손 요소를 선택합니다. 자손 선택은 부모와 자손 요소 사이에 띄어쓰기로 나타냅니다.
  6. 자식 접근: soup.select("#site > li")

    • id가 site인 요소 바로 아래 자식에 해당하는 li 태그들만 선택합니다. 자식 선택은 >을 사용해 표시합니다.
  7. 속성 선택: soup.select("[class=apple]")

    • class 속성이 정확하게 apple로 설정된 모든 요소를 선택합니다. 속성 선택자는 대괄호 [ ]를 사용해 속성과 값을 지정합니다.
  8. 속성 값으로 선택 (특정 문자열로 시작하는 속성): soup.select("a[class^=app]")

    • class 속성이 app으로 시작하는 모든 a 태그를 선택합니다. 이때 ^=는 "시작하는 값"을 의미합니다.
  9. 속성 값으로 선택 (특정 문자열을 포함하는 속성): soup.select("a[class*=app]")

    • class 속성에 app이 포함된 모든 a 태그를 선택합니다. *=는 "포함하는 값"을 의미합니다.
  10. 속성 값으로 선택 (특정 문자열로 끝나는 속성): soup.select("a[href$='.org']")

    • href 속성이 .org로 끝나는 모든 a 태그를 선택합니다. $=는 "끝나는 값"을 의미합니다.
  11. 여러 클래스 선택: soup.select(".apple.banana")

    • applebanana라는 두 개의 클래스를 동시에 가진 요소를 선택합니다. 클래스 사이에는 띄어쓰기가 아닌 .으로 연결합니다.
  12. 단어로 일치하는 속성 선택: soup.select("[class~=apple]")

    • class 속성 내에 정확히 apple이라는 단어가 포함된 요소를 선택합니다. 공백으로 구분된 여러 class 값 중에서 apple이 정확히 포함된 경우를 찾습니다.
  13. 자손 접근 + 클래스 선택: soup.select("#site .apple")

    • id가 site인 요소 내에서 class가 apple인 자손 요소를 모두 선택합니다.
  14. 자식 접근 + 클래스 선택: soup.select("#site > .apple")

    • id가 site인 요소 바로 아래에 위치한 자식 중에서 class가 apple인 요소를 선택합니다.

이로써 다양한 CSS Selector 사용법을 통해 HTML 요소를 세밀하게 선택할 수 있는 방법을 배웠습니다.


5. Python으로 긁어온 데이터 엑셀에 저장

BeautifulSoup으로 추출한 데이터를 엑셀 파일로 저장하는 방법을 소개합니다.

Python 코드 (엑셀에 데이터 저장)

import openpyxl

# 샘플 리스트 데이터
data = [
    ["이름", "나이", "직업"],
    ["홍길동", 30, "개발자"],
    ["김철수", 25, "디자이너"],
    ["이영희", 35, "매니저"]
]

# 새 워크북 생성
wb = openpyxl.Workbook()

# 활성화된 시트 선택
ws = wb.active

# 데이터를 시트에 입력
for row in data:
    ws.append(row)

# 엑셀 파일 저장
wb.save("sample_data.xlsx")

print("엑셀 파일이 생성되었습니다.")

위 코드는 샘플 데이터를 엑셀 파일로 저장하는 예제입니다. 이 코드를 실행하면 sample_data.xlsx 파일이 생성됩니다.


결론

이 강의를 통해 BeautifulSoup과 CSS Selector를 사용하여 HTML 파일에서 데이터를 추출하는 방법과, 추출한 데이터를 엑셀 파일로 저장하는 과정을 배웠습니다. 각 코드를 따라하며 결과를 확인해 보세요!

추석연휴 잘 보내셨나요? 이번 수업은

파이썬을 이용해서 한글(hwp) 자동화에 앞서 파이썬을 이용한 데이터 크롤링을 먼저 학습을 하겠습니다.

약간 맛보기로 웹에서 강아지사진 다운로드 하는 법을 배웠는데, 

이번에는 인터넷에서 내가 원하는 사이트의 정보를 뽑아내는 기법을 배워보겠습니다.

크롤링을 잘하면 인터넷의 데이터를 내 입맛대로 자동으로 긁어올 수 있는 능력이 생깁니다. 

추후에 긁어온 데이터를 엑셀에 출력하거나 한글에 출력하거나 할 수 있겠지요..

데이터를 주무르기 위해 가장 강력한 프레임웍인 판다스도 배워보겠습니다. 

 

- 일 시 : 9월 24일(화) 19시

- 장 소 : 구 당리동사(1층) 정보화교육장

- 내 용 :

   파이썬 크롤링, 판다스 데이터프레임 입문

   파이썬 + 한글(hwp) 자동화 + AI = 보고서 자동생성, 공문 자동기안(예고)

- 참고사이트 (예습 복습이 필요하신분은 아래 영상을 학습하세요..)

https://www.youtube.com/watch?v=HJcrD7Ukli4

 

'스터디일정' 카테고리의 다른 글

10.8.(화) 스터디 합니다.  (0) 2024.10.04
2024.9.10.(화) 스터디 합니다.  (0) 2024.09.06
2024.8.27.(화) 스터디 합니다.  (0) 2024.08.23
2024.8.13(화). 휴강 합니다.  (0) 2024.08.09
2024-07-30(화) 스터디 합니다.  (0) 2024.07.29

날이 선선한게  공부하기 딱 좋은 계절입니다.

저번 시간에 이어 AI 챗봇 만들기를 할 예정입니다.

다음 단계는 드디어 파이썬 AI를 활용한 공문 자동생성을 구현해 보려고 합니다.

추후 파이썬 마무리 단계로 온나라 자동 컨트롤하는 것으로 파이썬 스터디가 종료될 예정입니다.

 

* 준비물 : 구글 아이디 패스워드 숙지 (구글 gemini API 사용하려면 구글 접속해야 합니다..)

 

- 일 시 : 9월 10일(화) 19시

- 장 소 : 구 당리동사(1층) 정보화교육장

- 내 용 :

   파이썬 가상환경 설치, 모듈 개념 이해(복습)

   파이썬 + AI = 챗봇 만들기(실습)

   파이썬 + 한글(hwp) 자동화 + AI = 보고서 자동생성, 공문 자동기안(예고)

 

'스터디일정' 카테고리의 다른 글

10.8.(화) 스터디 합니다.  (0) 2024.10.04
2024.09.24.(화) 스터디 합니다.  (0) 2024.09.20
2024.8.27.(화) 스터디 합니다.  (0) 2024.08.23
2024.8.13(화). 휴강 합니다.  (0) 2024.08.09
2024-07-30(화) 스터디 합니다.  (0) 2024.07.29

+ Recent posts