본문 바로가기

개발관련

파이썬 웹 크롤링 강좌

728x90
반응형

2024.12.20 - [개발관련] - 파이썬 강좌 9 - 객체지향

 

파이썬 강좌 9 - 객체지향

2024.12.20 - [개발관련] - 파이썬 강좌 8 - 모듈과 패키지 파이썬 강좌 8 - 모듈과 패키지2024.12.20 - [개발관련] - 파이썬 강좌 7 - 예외처리 파이썬 강좌 7 - 예외처리2024.12.20 - [개발관련] - 파이썬 강좌

woowonwoo.tistory.com

 

파이썬 웹 크롤링 강좌

웹 크롤링(Web Crawling)은 웹 페이지에서 데이터를 자동으로 추출하는 기술입니다.
이 강좌에서는 파이썬을 사용해 웹 크롤링의 기본적인 개념과 실습을 다룹니다.


1. 웹 크롤링에 필요한 라이브러리

웹 크롤링을 위해 주로 사용되는 파이썬 라이브러리는 다음과 같습니다.

라이브러리설명

requests 웹 페이지의 HTML 소스를 가져오는 데 사용됩니다.
BeautifulSoup HTML, XML 데이터를 파싱하여 분석할 수 있습니다.
lxml 빠르고 효율적인 HTML/XML 파싱 라이브러리입니다.
selenium 동적 웹 페이지 크롤링에 사용됩니다.

필수 라이브러리 설치

pip install requests beautifulsoup4 lxml selenium

2. 웹 크롤링 기본

2.1 HTTP 요청 보내기

requests 라이브러리를 사용해 웹 페이지 소스를 가져옵니다.

import requests

url = "https://example.com"
response = requests.get(url)
print(response.text)  # HTML 소스 출력

2.2 HTML 파싱하기

BeautifulSoup을 사용해 HTML을 구조적으로 분석합니다.

from bs4 import BeautifulSoup

html = "<html><body><h1>Hello, World!</h1></body></html>"
soup = BeautifulSoup(html, "html.parser")

print(soup.h1.text)  # 출력: Hello, World!

2.3 실습: 웹 페이지에서 제목 가져오기

import requests
from bs4 import BeautifulSoup

url = "https://example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

title = soup.title.text
print(f"웹 페이지 제목: {title}")

 


3. HTML 구조 탐색

BeautifulSoup은 HTML 요소를 쉽게 탐색할 수 있는 다양한 메서드를 제공합니다.

메서드설명

find 첫 번째로 매칭되는 요소를 반환합니다.
find_all 매칭되는 모든 요소를 리스트로 반환합니다.
select CSS 선택자로 요소를 찾습니다.
select_one CSS 선택자로 첫 번째 매칭 요소를 반환합니다.

3.1 find와 find_all

html = """
<html>
  <body>
    <div class="item">Item 1</div>
    <div class="item">Item 2</div>
  </body>
</html>
"""
soup = BeautifulSoup(html, "html.parser")

# 첫 번째 div 요소
print(soup.find("div").text)  # 출력: Item 1

# 모든 div 요소
for div in soup.find_all("div"):
    print(div.text)

3.2 select와 select_one

html = """
<html>
  <body>
    <div id="main">
      <p class="text">Hello</p>
      <p class="text">World</p>
    </div>
  </body>
</html>
"""
soup = BeautifulSoup(html, "html.parser")

# CSS 선택자로 탐색
print(soup.select_one("#main .text").text)  # 출력: Hello
print([p.text for p in soup.select(".text")])  # 출력: ['Hello', 'World']

4. 실습: 특정 데이터 크롤링

4.1 뉴스 제목 크롤링

아래는 뉴스 웹사이트에서 제목을 크롤링하는 예제입니다.

import requests
from bs4 import BeautifulSoup

url = "https://news.ycombinator.com/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

# 뉴스 제목 추출
titles = soup.select(".storylink")
for idx, title in enumerate(titles):
    print(f"{idx + 1}. {title.text}")

5. 동적 웹 페이지 크롤링

동적 웹 페이지는 JavaScript를 통해 데이터를 로드합니다.
이 경우 selenium을 사용하여 데이터를 가져올 수 있습니다.

5.1 Selenium 설치 및 사용

  1. 웹 드라이버 다운로드 (예: ChromeDriver).
    ChromeDriver 다운로드 링크
  2. selenium 설치:
     
pip install selenium

5.2 Selenium 기본 사용법

from selenium import webdriver
from selenium.webdriver.common.by import By

# ChromeDriver 경로 설정
driver = webdriver.Chrome(executable_path="chromedriver_path")
driver.get("https://example.com")

# 요소 찾기
title = driver.find_element(By.TAG_NAME, "h1").text
print(f"페이지 제목: {title}")

# 브라우저 닫기
driver.quit()

5.3 실습: Google 검색 자동화

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome(executable_path="chromedriver_path")
driver.get("https://www.google.com")

search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("파이썬 웹 크롤링")
search_box.send_keys(Keys.RETURN)

# 검색 결과 출력
results = driver.find_elements(By.CSS_SELECTOR, ".tF2Cxc")
for result in results[:5]:
    print(result.text)

driver.quit()

6. 크롤링 시 주의사항

  1. robots.txt 확인
    크롤링 전에 웹 사이트의 robots.txt 파일을 확인하여 허용 여부를 확인하세요.
    예: https://example.com/robots.txt
  2. 지나친 요청 금지
    웹 서버에 과도한 요청을 보내는 것은 금지됩니다. 적절한 딜레이를 추가하세요.
import time
time.sleep(1)  # 1초 대기

 

 

3.법적 문제
크롤링한 데이터를 상업적으로 사용하려면 해당 웹사이트의 이용 약관을 확인하세요.


7. 연습 문제

  1. 영화 리뷰 크롤링
    특정 영화 리뷰 사이트에서 리뷰 제목과 별점을 크롤링해보세요.
  2. 동적 페이지 크롤링
    Selenium을 사용해 특정 전자상거래 사이트에서 상품 이름과 가격을 크롤링하세요.
  3. 크롤링한 데이터 저장
    크롤링한 데이터를 CSV 파일로 저장해보세요.
import csv

with open("data.csv", "w", newline="") as file:
    writer = csv.writer(file)
    writer.writerow(["제목", "URL"])  # 헤더 작성
    writer.writerow(["예제 제목", "https://example.com"])  # 데이터 작성

8. 요약

  1. 기본 크롤링: requests와 BeautifulSoup으로 정적 웹 페이지 데이터 추출.
  2. 동적 크롤링: selenium을 사용하여 JavaScript 기반 데이터 추출.
  3. 데이터 저장 및 활용: 크롤링 데이터를 CSV, JSON 등 다양한 형식으로 저장.
  4. 주의사항: 크롤링 대상 웹사이트의 정책을 준수.

다음 단계로는 크롤링 데이터를 활용해 데이터 분석 또는 시각화를 진행해볼 수 있습니다. 😊

728x90
반응형