구글, 웹툰, 야놀자 크롤링

현서·2025년 7월 16일

파이썬 웹서비스

목록 보기
3/7
post-thumbnail

구글 검색

# 구글 검색
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get('https://www.google.com')
search = driver.find_element("name", "q")
search.send_keys("날씨")
time.sleep(1)
search.send_keys(Keys.RETURN) # 엔터 키 입력 (검색 실행)

time.sleep(5)

네이버 웹툰 댓글 크롤링

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup

driver = webdriver.Chrome()
driver.get('https://comic.naver.com/webtoon/detail?titleId=834369&no=31&week=tue')
soup = BeautifulSoup(driver.page_source, "html.parser")
time.sleep(2)

print('** 베스트 댓글 **')
xpath = '/html/body/div[1]/div[5]/div/div/div[4]/div[1]/div[3]/div/section/ul/li'
best_comment_elements = driver.find_elements(By.XPATH, xpath)

for li in best_comment_elements:
    try:
        comment_p = li.find_element(By.XPATH, './div/div[2]/div/p')
        comment_text = comment_p.text.strip()
        print(comment_text)
        print('-' * 30)
    except Exception as e:
        print(e)

driver.find_element('xpath', '//*[@id="wcc_root"]/section/div[4]/button[2]').click()
time.sleep(2)

soup = BeautifulSoup(driver.page_source, "html.parser")
print('** 전체 댓글 **')
xpath = '/html/body/div[1]/div[5]/div/div/div[4]/div[1]/div[3]/div/section/ul/li'
total_comment_elements = driver.find_elements(By.XPATH, xpath)

for li in total_comment_elements:
    try:
        comment_p = li.find_element(By.XPATH, './div/div[2]/div/p')
        comment_text = comment_p.text.strip()
        print(comment_text)
        print('-' * 30)
    except Exception as e:
        print(e)

야놀자 크롤링

import time
from selenium import webdriver
from bs4 import BeautifulSoup

def crawl_yanolja_reviews(name, url):
    review_list = []
    driver = webdriver.Chrome()
    driver.get(url)
    time.sleep(2)

    scroll_count = 3
    for i in range(scroll_count):
        driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
        time.sleep(2)

    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')

    review_containers = soup.select('#__next > section > div > div.css-1js0bc8 > div')
    # print(review_containers)
    review_date = soup.select('#__next > section > div > div.css-1js0bc8 > div > div > div > div.css-1toaz2b > div > div.css-1ivchjf > p') 

    for i in range(len(review_containers)):
        review_text = review_containers[i].find('p', class_='content-text').text
        # print(review_text)
        # print('-' * 30)
        date = review_date[i].text
        review_empty_stars = review_containers[i].find_all('path',{'fill-rule':'evenodd'})
        stars = 5 - len(review_empty_stars)
        # print(review_empty_stars)
        # print('-'*30)
        review_dict = {
            'review': review_text,
            'stars' : stars,
            'date' : date
        }
        review_list.append(review_dict)
    return review_list

total_review = crawl_yanolja_reviews('파라다이스 호텔 부산', 'https://nol.yanolja.com/reviews/domestic/3001112')
print(total_review)
항목soup.select()driver.find_elements()
도구BeautifulSoupSelenium
대상HTML 코드실제 웹페이지 화면
자바스크립트 실행❌ 안 됨✅ 됨
속도빠름느림 (브라우저 켜야 해서)
쓰는 방법CSS 선택자 (.a > b)XPath (/html/body/...)

📄 soup.select()
웹페이지 코드만 가져와서 그 안에서 글자를 뽑는 것이다.
(마치 책을 보고 필요한 내용을 찾는 느낌)

🌐 driver.find_elements()
실제로 웹사이트를 켜고, 거기서 버튼 누르거나 글자 복사하는 것처럼 행동한다.
(진짜 사람이 브라우저 켜고 보는 화면에서 찾는 느낌)

이미지 크롤링

from selenium import webdriver
from urllib.request import Request, urlopen

driver = webdriver.Chrome()
url = 'https://pixabay.com/ko/images/search/강아지/'
driver.get(url)

image_xpath = '/html/body/div[1]/div[1]/div/div[2]/div[3]/div/div/div[1]/div[1]/div/a/img'
image_url = driver.find_element('xpath', image_xpath).get_attribute('src')
print('image_url: ', image_url)

image_byte = Request(image_url, headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'})

f = open('red_dot_dog.jpg', 'wb') # 바이너리 쓰기 모드로 파일 열기
f.write(urlopen(image_byte).read()) # 이미지 데이터 저장
f.close() # 파일 닫기

'wb' 모드란?
'w' → 쓰기 모드 (파일에 데이터를 새로 씀, 기존 내용은 지워짐)
'b' → 바이너리 모드 (텍스트가 아니라, 0과 1로 된 데이터를 다룸)
파일에 바이너리 데이터를 새로 쓰겠다는 의미

이렇게 'red_dot_dog.jpg' 파일이 생성되고, 열면 강아지 사진을 확인할 수 있다.

🖼️ 이미지 가져올 때 Selenium을 쓰는 이유

1. 이미지가 "나중에" 나타나기 때문이다.
많은 웹사이트는 이미지를 처음부터 보여주지 않으며,
스크롤하면 이미지가 천천히 로딩되거나
자바스크립트가 실행되고 나서 이미지를 만들어서 넣어준다.

2. 스크롤해서 이미지를 더 불러와야 할 때
soup은 스크롤 같은 걸 못하지만
Selenium은 스크롤도 되고, 클릭도 되고, 사람처럼 행동할 수 있다.

3. 이미지 URL이 복잡하게 숨겨져 있을 때
어떤 사이트는 이미지 src 속성 대신 data-src, style 안에 숨겨놓기도 한다. Selenium은 이런 것도 렌더링 후 DOM 구조에서 쉽게 가져올 수 있다.

profile
The light shines in the darkness.

0개의 댓글