본문 바로가기
인공지능/LLM 서비스

크롤링

by hyunji00pj 2025. 1. 12.

크롤링

 

크롤링(Crawling)이란 웹 크롤러(Web Crawler) 또는 스크레이퍼(Scraper)라고 불리는 프로그램이나 스크립트를 사용하여 인터넷상의 웹 페이지에서 데이터를 자동으로 수집하는 과정을 말합니다. 주로 검색 엔진이 웹사이트를 탐색하고 색인(Index)에 추가하기 위해 사용하는 기술이며, 특정 주제나 데이터를 수집해 분석하는 데에도 활용됩니다. 크롤링은 HTML, CSS, JavaScript로 구성된 웹페이지 구조를 파싱(Parsing)하여 원하는 정보를 추출하고, 이를 활용 가능한 데이터 형식으로 저장합니다. 크롤링 시에는 웹사이트의 이용 약관과 로봇 배제 표준(Robots.txt)을 준수하여 법적, 윤리적 문제를 방지해야 합니다.

 

 

robots.txt 규칙 준수

  • 대부분의 웹사이트는 robots.txt 파일을 제공하여 크롤링 허용 여부를 명시합니다.
  • Disallow 규칙이 적용된 URL에는 접근하지 않아야 합니다.

멜론 차트 크롤링

 

  • 주소
  • 1~100위 까지 곡명, 가수 크롤링
  • 1위. HOME SWEET HOME (feat. 태양, 대성) - G-DRAGON
import requests
from bs4 import BeautifulSoup

 

  • requests: HTTP 요청을 통해 웹 페이지의 HTML을 가져옵니다.
  • BeautifulSoup: HTML을 파싱하여 특정 정보를 추출합니다.

HTTP 요청 보내기

req = requests.get('https://www.melon.com/chart/index.htm')
print(req)

 

 

  • requests.get()를 사용해 멜론 차트 페이지의 HTML을 가져옵니다.
  • print(req)는 HTTP 응답 객체를 출력하며, 200은 요청이 성공했음을 의미합니다.
  • 만약 403 Forbidden 에러가 발생한다면, 브라우저에서 직접 접속한 것처럼 보이도록 User-Agent 헤더를 추가해야 합니다.

User-Agent 추가

header = {'user-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
req = requests.get('https://www.melon.com/chart/index.htm', headers=header)
print(req)

 

 

  • User-Agent는 웹사이트가 요청을 보낸 클라이언트를 식별할 수 있도록 돕는 HTTP 헤더입니다.
  • 브라우저에서 접속한 것처럼 보이게 설정하면 차단을 피할 수 있습니다.

BeautifulSoup을 사용해 HTML 파싱

soup = BeautifulSoup(req.text)

 

 

  • req.text는 가져온 HTML 소스코드입니다.
  • BeautifulSoup은 HTML 문서를 파싱하여 탐색하기 쉽게 만들어줍니다.

노래 제목 추출

div_title = soup.findAll('div', {'class':'ellipsis rank01'})

 

 

  • findAll은 HTML 문서에서 class='ellipsis rank01'인 div 태그를 모두 찾습니다.
  • div_title에는 노래 제목을 포함하는 모든 div 태그가 리스트로 저장됩니다.

노래 제목 추출

 

div_artist = soup.findAll('div', {'class':'ellipsis rank02'})
  • findAll로 class='ellipsis rank02'인 태그를 가져와 아티스트 정보를 추출합니다.

텍스트 데이터 정리

for div in div_artist:
    span = div.find('span')  # div 안에서 첫 번째 span 태그 찾기
    if span:
        print(span.text.strip())

 

  • 각 div 태그에서 첫 번째 span 태그를 찾아 텍스트를 추출합니다.
  • text.strip()은 텍스트 앞뒤의 공백을 제거합니다.
  • 노래 제목과 아티스트 정보 모두 같은 방식으로 처리됩니다.

 

순위와 함께 출력

for i,(t,a) in enumerate(zip(div_title, div_artist), 1):
    title = t.text.strip()
    artist = a.text.strip().split('\n')[0]
    print('{0:3d}위, {1:s} - {2:s}'.format(i, title, artist))
  • enumerate를 사용해 순위를 매깁니다.
  • zip(div_title, div_artist)는 제목과 아티스트를 한 쌍으로 묶습니다.
  • split('\n')[0]은 아티스트 이름이 여러 줄로 구성된 경우 첫 번째 줄만 가져옵니다.
  • 출력 형식을 {0:3d}위, {1:s} - {2:s}로 설정해 순위와 제목-아티스트를 깔끔하게 보여줍니다.

출력 결과

1위,HOME SWEET HOME (feat. 태양, 대성) - G-DRAGONG-DRAGON
  2위,APT. - 로제 (ROSÉ), Bruno Mars로제 (ROSÉ), Bruno Mars
  3위,Whiplash - aespaaespa
  4위,POWER - G-DRAGONG-DRAGON
  5위,나는 반딧불 - 황가람황가람
  6위,HAPPY - DAY6 (데이식스)DAY6 (데이식스)
  7위,UP (KARINA Solo) - aespaaespa
  8위,첫 눈 - EXOEXO
  9위,내 이름 맑음 - QWERQWER
 10위,내게 사랑이 뭐냐고 물어본다면 - 로이킴로이킴
 11위,Mantra - 제니 (JENNIE)제니 (JENNIE)
 12위,Welcome to the Show - DAY6 (데이식스)DAY6 (데이식스)
 13위,Supernova - aespaaespa
 14위,소나기 - 이클립스 (ECLIPSE)이클립스 (ECLIPSE)
 15위,사랑은 늘 도망가 - 임영웅임영웅
 16위,한 페이지가 될 수 있게 - DAY6 (데이식스)DAY6 (데이식스)
 17위,Pump Up The Volume! - PLAVEPLAVE
 18위,너와의 모든 지금 - 재쓰비 (JAESSBEE)재쓰비 (JAESSBEE)
 19위,어떻게 이별까지 사랑하겠어, 널 사랑하는 거지 - AKMU (악뮤)AKMU (악뮤)
 20위,WAY 4 LUV - PLAVEPLAVE
 21위,우리들의 블루스 - 임영웅임영웅
 22위,천상연 - 이창섭이창섭
 23위,온기 - 임영웅임영웅
 24위,Drowning - WOODZWOODZ
 25위,슬픈 초대장 - 순순희(지환)순순희(지환)
 26위,Home - 임영웅임영웅
 27위,예뻤어 - DAY6 (데이식스)DAY6 (데이식스)
 28위,모래 알갱이 - 임영웅임영웅
 29위,다시 만날 수 있을까 - 임영웅임영웅
 30위,우리 영화 - PLAVEPLAVE
 31위,Supersonic - 프로미스나인프로미스나인
 32위,고민중독 - QWERQWER
 33위,이제 나만 믿어요 - 임영웅임영웅
 .
 .
 .

 

'인공지능 > LLM 서비스' 카테고리의 다른 글

Gradio  (0) 2025.01.12
프롬프트 엔지니어링  (0) 2025.01.12
생성형 AI에 대해서 - GPT API  (0) 2025.01.12
예스 24, 교보문고 크롤링(mongoDB,Excel 저장)  (0) 2025.01.12
셀레니움 - 요기요 리뷰 크롤링  (0) 2025.01.12