프로그래밍 언어/Python

파이썬 입문자를 위한 웹 스크래핑, BeautifulSoup, Requests 라이브러리 - Python 기초 #15

eco7T 2024. 5. 27. 09:34
반응형

이번 글은 파이썬 입문자 눈높이에 맞게 웹 스크래핑을 수행하는 방법에 대해 설명하겠습니다. 웹 스크래핑은 웹사이트에서 데이터를 자동으로 수집하고 분석하는 기술로, 수작업으로 데이터를 수집하는 번거로움을 줄이고 데이터를 효율적으로 추출할 수 있도록 돕습니다.

파이썬 입문자를 위한 웹 스크래핑
파이썬 입문자를 위한 웹 스크래핑

 

웹 스크래핑이란

웹 스크래핑(Web Scraping)은 웹사이트의 데이터를 추출하여 분석하거나 저장하는 기술입니다. 이를 통해 수작업으로 일일이 데이터를 수집하지 않고, 자동으로 데이터를 모을 수 있습니다.

 

설치 파이썬으로 웹 스크래핑을 하려면 몇 가지 라이브러리를 설치해야 합니다. 주로 사용하는 라이브러리는 `requests`와 `BeautifulSoup`입니다.

pip install requests pip install beautifulsoup4


기본적인 웹 스크래핑 과정

  1. 웹 스크래핑의 기본 과정은 다음과 같습니다
  2. 웹 페이지 요청(Request)
  3. 웹 페이지 데이터 가져오기(Response)
  4. HTML 파싱(Parsing)
  5. 데이터 추출(Extraction)

웹 스크래핑 예제

뉴스 헤드라인 추출 여기서는 특정 뉴스 웹사이트에서 헤드라인을 추출하는 간단한 예제를 통해 웹 스크래핑을 설명하겠습니다.

 

1) 웹 페이지 요청 및 HTML 가져오기

import requests url = 'https://news.ycombinator.com/' response = requests.get(url) # 응답이 성공적인지 확인 if response.status_code == 200: html = response.text else: print('Failed to retrieve the webpage')

 

2) HTML 파싱 및 데이터 추출

  • `BeautifulSoup` 설치 방법
pip install beautifulsoup4
  • `BeautifulSoup` 라이브러리는 HTML/XML 파일에서 데이터를 파싱(구문 분석)하는 데 사용됩니다.
import requests from bs4 import BeautifulSoup # 타겟 URL url = "https://www.example.com" # requests를 사용하여 웹 페이지 가져오기 response = requests.get(url) # BeautifulSoup 객체 생성 soup = BeautifulSoup(response.content, "html.parser") # 원하는 데이터 추출 title = soup.find("h1").text print(title)
  • `requests.get(url)`을 통해 웹 페이지의 HTML 코드를 가져옵니다.
  • `BeautifulSoup` 객체를 만들어 HTML 코드를 파싱합니다.
  • `find("h1")`을 사용하여 `h1` 태그를 찾고, `.text`로 태그 내 텍스트를 추출합니다.

 

다양한 추출 방법

1) 특정 태그 찾기

# <a> 태그 모두 찾기 links = soup.find_all("a") # 첫 번째 <a> 태그 찾기 first_link = soup.find("a")


2) 속성으로 찾기

# id가 "logo"인 요소 찾기 logo = soup.find(id="logo") # class가 "article"인 모든 요소 찾기 articles = soup.find_all(class_="article")


3) CSS 셀렉터로 찾기

# div 태그 중 class가 "content"인 요소 찾기 content = soup.select_one("div.content") # class가 "article"인 모든 요소 찾기 articles = soup.select(".article")


4) 데이터 정제하기 스크래핑한 데이터는 추가 정제 작업이 필요할 수 있습니다.

# 공백 제거 text = text.strip() # 특수문자 제거 import re cleaned_text = re.sub(r'[?|$|.|!|,|)|(]', r'', text)

 

실제 예시 코드

import requests from bs4 import BeautifulSoup # 타겟 URL url = "https://movie.naver.com/movie/sdb/rank/rmovie.nhn" # requests를 사용하여 웹 페이지 가져오기 response = requests.get(url) # BeautifulSoup 객체 생성 soup = BeautifulSoup(response.content, "html.parser") # 영화 랭킹 데이터 추출 movies = soup.select(".tit3 > a") # 결과 출력 for movie in movies: title = movie.text link = movie["href"] print(f"영화 제목: {title}") print(f"영화 링크: https://movie.naver.com{link}") print("-" * 30)

 

위 코드는 네이버 영화 랭킹 페이지에서 영화 제목과 링크를 추출합니다. select(".tit3 > a")는 CSS 선택자를 사용하여 'tit3' 클래스 내부의 'a' 태그를 선택합니다. 이 'a' 태그들이 영화 제목과 링크를 가지고 있습니다.

 

그 다음 for 반복문을 사용하여 선택된 각 'a' 태그에 대해 영화 제목과 링크를 추출합니다. 영화 제목은 movie.text로 가져오고, 링크는 movie["href"]를 통해 'href' 속성 값을 얻습니다. 링크 앞에 "https://movie.naver.com"을 붙여서 완전한 URL을 만듭니다.

 

마지막으로 print 함수를 사용하여 추출한 영화 제목과 링크를 출력합니다. 가독성을 위해 - 문자로 각 영화 정보를 구분했습니다.

 

이 코드를 실행하면 네이버 영화 랭킹에 있는 영화들의 제목과 링크가 출력됩니다. 웹 페이지의 HTML 구조를 잘 파악하고 적절한 CSS 선택자를 사용하는 것이 스크래핑에 핵심적입니다."

 

웹 스크래핑 윤리와 법적 문제

웹 스크래핑을 할 때는 사이트의 `robots.txt` 파일을 확인하고, 사이트의 서비스 약관을 준수해야 합니다. 또한, 너무 빈번하게 요청을 보내는 것은 서버에 부담을 줄 수 있으므로 주의해야 합니다.

 

이 가이드북에서는 파이썬을 사용한 웹 스크래핑의 기본 개념과 간단한 예제를 다루었습니다. 웹 스크래핑을 통해 다양한 데이터를 자동으로 수집하고 분석할 수 있습니다.

반응형