Python

Python 웹 스크래핑

thebasics 2024. 11. 21. 17:00

목차

  1. 웹 스크래핑이란?
  2. 웹 스크래핑을 위한 라이브러리 소개
    • requests 모듈
    • BeautifulSoup 모듈
  3. 웹 스크래핑 기본 사용법
    • 웹 페이지 요청 및 응답 처리
    • HTML 파싱 및 데이터 추출
  4. 고급 웹 스크래핑 기법
    • 다중 페이지 스크래핑
    • 데이터 저장 및 분석
  5. 예시 코드
  6. 결론
  7. 관련 자료 및 추가 학습 자료

1. 웹 스크래핑이란?

웹 스크래핑은 웹 페이지에서 원하는 데이터를 자동으로 추출하는 기술입니다. 이를 통해 다양한 웹 사이트에서 정보를 수집하고 분석할 수 있습니다. Python에서는 requestsBeautifulSoup 모듈을 사용하여 웹 스크래핑을 쉽게 구현할 수 있습니다. requests 모듈은 HTTP 요청을 보내고 응답을 받는 데 사용되며, BeautifulSoup은 HTML 문서를 파싱하고 원하는 데이터를 추출하는 데 사용됩니다.


2. 웹 스크래핑을 위한 라이브러리 소개

requests 모듈

requests 모듈은 간단하고 사용하기 쉬운 HTTP 라이브러리로, 웹 서버와 통신하기 위한 다양한 기능을 제공합니다. GET, POST 등 다양한 HTTP 요청을 보내고, 서버로부터 응답을 받을 수 있습니다.

  • 설치 방법:
    pip install requests

BeautifulSoup 모듈

BeautifulSoup은 HTML 및 XML 문서를 파싱하고, 문서에서 데이터를 쉽게 추출할 수 있도록 도와주는 라이브러리입니다. lxml이나 html.parser와 같은 파서(parser)를 사용하여 HTML 구조를 탐색하고 원하는 데이터를 추출할 수 있습니다.

  • 설치 방법:
    pip install beautifulsoup4

3. 웹 스크래핑 기본 사용법

웹 페이지 요청 및 응답 처리

웹 스크래핑의 첫 번째 단계는 웹 페이지에 요청을 보내고, 응답을 받아오는 것입니다. requests 모듈을 사용하여 이 작업을 수행할 수 있습니다.

  • 예시: 웹 페이지 요청:

    import requests
    
    url = 'https://example.com'
    response = requests.get(url)
    
    if response.status_code == 200:
        print("요청 성공!")
        print(response.text)  # 응답 내용 출력
    else:
        print("요청 실패:", response.status_code)
    • requests.get()을 사용하여 웹 페이지에 GET 요청을 보내고, 응답 객체를 반환받습니다. response.status_code를 통해 요청의 성공 여부를 확인할 수 있습니다.

HTML 파싱 및 데이터 추출

웹 페이지의 HTML 문서에서 원하는 데이터를 추출하려면 BeautifulSoup을 사용하여 문서를 파싱해야 합니다.

  • 예시: HTML 파싱 및 데이터 추출:

    from bs4 import BeautifulSoup
    
    html_doc = """
    <html>
        <head><title>Example Page</title></head>
        <body>
            <h1>Hello, World!</h1>
            <p class="description">This is a simple web page.</p>
            <a href="https://example.com">Visit Example</a>
        </body>
    </html>
    """
    soup = BeautifulSoup(html_doc, 'html.parser')
    
    # 제목 추출
    title = soup.title.string
    print("Title:", title)
    
    # 첫 번째 <h1> 태그 추출
    heading = soup.h1.string
    print("Heading:", heading)
    
    # 클래스가 'description'인 <p> 태그 추출
    description = soup.find('p', class_='description').string
    print("Description:", description)
    
    # 모든 <a> 태그의 href 속성 추출
    links = soup.find_all('a')
    for link in links:
        print("Link:", link.get('href'))
    • BeautifulSoup 객체를 생성하고, find()find_all() 메서드를 사용하여 원하는 태그와 속성을 찾습니다. string 속성을 사용하여 태그의 텍스트를 추출할 수 있습니다.

4. 고급 웹 스크래핑 기법

다중 페이지 스크래핑

일부 웹 사이트는 여러 페이지에 걸쳐 데이터를 제공하며, 이러한 경우 각 페이지를 순회하면서 데이터를 추출해야 합니다.

  • 예시: 다중 페이지 스크래핑:

    import requests
    from bs4 import BeautifulSoup
    
    base_url = 'https://example.com/page/'
    all_data = []
    
    for page_num in range(1, 4):  # 1페이지부터 3페이지까지 스크래핑
        url = f"{base_url}{page_num}"
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'html.parser')
    
        # 각 페이지에서 데이터 추출
        items = soup.find_all('div', class_='item')
        for item in items:
            title = item.find('h2').string
            all_data.append(title)
    
    print("Extracted Data:", all_data)
    • 각 페이지의 URL을 구성하고 순회하면서 데이터를 추출합니다.

데이터 저장 및 분석

추출한 데이터를 CSV 파일이나 JSON 파일로 저장하여 나중에 분석하거나 사용할 수 있습니다.

  • 예시: 데이터 저장 (CSV 파일):

    import csv
    
    # 추출한 데이터 리스트
    data = [
        {"title": "Item 1", "price": "$10"},
        {"title": "Item 2", "price": "$20"}
    ]
    
    with open('data.csv', 'w', newline='') as csvfile:
        fieldnames = ['title', 'price']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    
        writer.writeheader()
        for item in data:
            writer.writerow(item)
    • csv.DictWriter를 사용하여 데이터를 CSV 파일로 저장합니다.

5. 예시 코드

간단한 웹 스크래핑 예시

import requests
from bs4 import BeautifulSoup

url = 'https://news.ycombinator.com/'
response = requests.get(url)

soup = BeautifulSoup(response.text, 'html.parser')
titles = soup.find_all('a', class_='storylink')

for idx, title in enumerate(titles):
    print(f"{idx + 1}: {title.string}")
  • 이 코드는 Hacker News의 제목을 추출하여 출력합니다.

이미지 다운로드 예시

import requests
from bs4 import BeautifulSoup
import os

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

# 이미지 태그 찾기
images = soup.find_all('img')

# 이미지 다운로드 및 저장
for img in images:
    img_url = img['src']
    img_data = requests.get(img_url).content
    img_name = os.path.basename(img_url)
    with open(img_name, 'wb') as img_file:
        img_file.write(img_data)
        print(f"{img_name} 다운로드 완료")
  • 이 코드는 웹 페이지에서 이미지 태그를 찾아 이미지를 다운로드합니다.

6. 결론

웹 스크래핑은 웹 페이지에서 데이터를 자동으로 추출하는 강력한 기술입니다. Python에서는 requests 모듈을 사용하여 웹 페이지에 요청을 보내고, BeautifulSoup을 통해 HTML 문서를 파싱하여 원하는 데이터를 추출할 수 있습니다. 이러한 기술을 사용하면 다양한 웹 사이트에서 데이터를 수집하고 분석할 수 있으며, 이를 통해 정보 수집, 데이터 분석, 자동화 작업 등을 효율적으로 수행할 수 있습니다. 그러나 웹 스크래핑을 수행할 때는 대상 웹 사이트의 이용 약관을 준수하고, 과도한 요청을 피하여 서버에 부담을 주지 않도록 주의해야 합니다.


7. 관련 자료 및 추가 학습 자료


이 글에서는 Python에서 requestsBeautifulSoup를 사용하여 웹 스크래핑을 수행하는 방법을 살펴보았습니다. 웹 페이지에서 데이터를 추출하고 분석하는 데 이 기술을 활용하여 효율적인 데이터 수집 및 분석 작업을 수행해 보세요.

반응형