Python으로 데이터 가져오기 기초
먼저 파이썬으로 웹툰 데이터를 가져오려면 Chrome driver를 최신버전으로 다운로드 해야합니다. 다운로드를 다 하셨다면 임포트를 하러 가보겠습니다.
라이브러리 임포트
라이브러리를 임포트하는 이유는 코드에서 해당 라이브러리의 기능을 사용하기 위함입니다. 각 라이브러리는 특정한 기능을 제공하며, 이러한 기능을 사용하기 위해서는 해당 라이브러리를 불러와야 합니다.
1
2
3
4
5
6
7
8
9
10
11
| from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.chrome.options import Options as ChromeOptions
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import time
import json
from datetime import datetime
|
- selenium: 웹 페이지를 제어하고 데이터를 가져오기 위한 라이브러리입니다.
- BeautifulSoup: HTML 및 XML 문서를 구문 분석하기 위한 라이브러리입니다.
- json: 데이터를 JSON 형식으로 저장하기 위한 라이브러리입니다.
- datetime: 현재 날짜 및 시간을 가져오기 위한 라이브러리입니다.
변수 설정:
1
2
3
| # 현재 날짜 가져오기
current_date = datetime.now().strftime("%Y-%m-%d")
filename = f"bufftoon_{current_date}.json"
|
- current_date: 현재 날짜를 YYYY-MM-DD 형식의 문자열로 저장합니다.
- filename: 데이터를 저장할 JSON 파일의 이름을 설정합니다.
웹 드라이버 설정:
Selenium을 사용하여 Chrome 웹 드라이버를 설치하고 브라우저를 시작합니다.
1
2
3
4
5
| # 웹 드라이브 설치
options = ChromeOptions()
service = ChromeService(executable_path=ChromeDriverManager().install())
browser = webdriver.Chrome(service=service, options=options)
browser.get("https://bufftoon.plaync.com/tag/ranking?currentType=webtoon")
|
페이지 로드 대기: 페이지가 완전히 로드될 때까지 기다립니다. 스크롤 다운 함수 및 스크롤 작업
1
2
3
4
| # 페이지가 완전히 로드될 때까지 대기
WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "width-box"))
)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| # 천천히 스크롤 다운
scroll_pause_time = 1 # 1초 대기
pixels_to_scroll = 200 # 한 번에 스크롤할 픽셀 수
max_time_limit = 40 # 전체 작업 시간 제한 (60초)
start_time = time.time() # 작업 시작 시간
def scroll_down():
"""현재 위치에서 지정된 픽셀 수만큼 아래로 스크롤"""
browser.execute_script(f"window.scrollBy(0, {pixels_to_scroll});")
while (time.time() - start_time) < max_time_limit:
scroll_down()
time.sleep(scroll_pause_time)
new_height = browser.execute_script("return document.body.scrollHeight")
if new_height == browser.execute_script("return window.pageYOffset + window.innerHeight"):
break # 페이지 끝에 도달
html_source_updated = browser.page_source
soup = BeautifulSoup(html_source_updated, 'html.parser')
|
- scroll_down(): 현재 위치에서 지정된 픽셀 수만큼 아래로 스크롤합니다.
- while 루프를 사용하여 페이지를 스크롤하고, 지정된 시간 제한 내에 작업을 완료합니다.
HTML 파싱 및 데이터 추출:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 데이터 추출
webtoon_data = []
items = soup.select(".split-item")
for item in items:
rank = item.select_one(".rank").text.strip() if item.select_one(".rank") else "Rank not found"
title = item.select_one(".title .text").text.strip() if item.select_one(".title .text") else "Title not found"
image_tag = item.select_one("img")
image_url = image_tag['src'] if image_tag and 'src' in image_tag.attrs else "Image URL not found"
webtoon_data.append({
"rank": rank,
"title": title,
"imageURL": image_url
})
|
- BeautifulSoup을 사용하여 HTML 페이지를 구문 분석하고, 필요한 데이터를 추출합니다.
데이터 저장
추출한 데이터를 JSON 형식으로 저장합니다.
1
2
3
4
| # 데이터를 JSON 파일로 저장
with open(filename, 'w', encoding='utf-8') as f:
json.dump(webtoon_data, f, ensure_ascii=False, indent=4)
|
1
2
| # 브라우저 종료
browser.quit()
|
브라우저 종료: 작업이 완료되면 브라우저를 종료합니다. 이러한 코드는 웹 스크래핑을 수행하여 웹 페이지에서 정보를 수집하고, 이를 JSON 파일로 저장하는 과정을 자동화합니다.