inflearn logo
강의

講義

知識共有

12時間で終わるPythonを活用したクロール

収集の進捗状況をチェックするtqdmライブラリの活用

09차 네이버 영화 리뷰 수집 실습 관련 질문

31

n03192297081jhle2370

投稿した質問数 2

0

최근 네이버 영화 웹 구조가 변경된 것 같습니다. 관람평이 실습처럼 iframe으로 적용되어 있지 않은 것 같구요.

혹시 현재기준('26.8.21) 영화 오디세이 관람평 기준으로

Q1) 관람평의 정확한 URL을 알수 있을까요?

Q2) BeautifulSoup 라이브러리 활용하여 텍스트 축출 시 soup.select()에서 수집해야할 태그(selector)를 알려줄 수 있을까요?


혼자서 해볼려고 여러번 시도했느네 계속 공란만 축출되서요.


해당 URL은 다음과 같습니다.

오디세이 관람평 : 네이버 검색

python 웹-크롤링

回答 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

이정훈님, 네이버 영화 검색 결과의 관람평이 공란으로 추출되는 것은 대부분 관람평 데이터가 HTML에 처음부터 포함되어 있지 않고 자바스크립트로 동적으로 렌더링되기 때문입니다.

Q1) 관람평의 정확한 URL

이정훈님께서 제공해 주신 주소는 영화 관람평 자체의 URL이라기보다 네이버 검색 결과 URL입니다.

오디세이 관람평 네이버 검색 결과

네이버는 검색 결과에서 영화 관람평을 자바스크립트로 불러오기 때문에, 과거처럼 iframe 주소를 직접 찾아서 요청하는 방식이 현재는 정상적으로 동작하지 않을 수 있습니다.

또한 네이버의 영화 상세 페이지와 관람평 영역은 개편에 따라 URL과 HTML 클래스가 변경될 수 있으므로, 특정 URL이나 soup.select() 선택자를 고정해서 사용하는 방식은 유지보수가 어렵습니다.

Q2) soup.select()에서 사용할 선택자

현재 페이지에서 requestsBeautifulSoup만 사용하면 브라우저에 표시되는 관람평이 HTML에 존재하지 않아 다음처럼 빈 결과가 나올 수 있습니다.

import requests
from bs4 import BeautifulSoup

url = "네이버 검색 결과 URL"

response = requests.get(
    url,
    headers={
        "User-Agent": (
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
            "AppleWebKit/537.36 Chrome/131.0.0.0 Safari/537.36"
        )
    }
)

soup = BeautifulSoup(response.text, "html.parser")

print(len(soup.select("span")))

이 경우 soup가 읽은 HTML은 브라우저가 자바스크립트를 실행하기 전의 초기 문서이므로, 관람평 텍스트가 포함되지 않을 수 있습니다.

따라서 현재 네이버 검색 결과에서는 BeautifulSoup만 사용하는 것보다 Selenium 또는 Playwright로 브라우저를 실행한 뒤, 렌더링이 완료된 HTML을 BeautifulSoup으로 분석하는 방식이 적합합니다.

Selenium을 이용한 기본 예시

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
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

url = "https://search.naver.com/search.naver?where=nexearch&query=오디세이 관람평"

options = Options()
options.add_argument("--headless")
options.add_argument("--window-size=1920,1080")
options.add_argument(
    "--user-agent=Mozilla/5.0 "
    "(Windows NT 10.0; Win64; x64) "
    "AppleWebKit/537.36 Chrome/131.0.0.0 Safari/537.36"
)

driver = webdriver.Chrome(options=options)

try:
    driver.get(url)

    wait = WebDriverWait(driver, 10)

    # 관람평 영역의 텍스트가 화면에 나타날 때까지 대기합니다.
    wait.until(
        EC.presence_of_element_located(
            (By.XPATH, "//*[contains(text(), '관람평')]")
        )
    )

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

    # 우선 관람평 관련 영역을 찾은 뒤 내부 텍스트를 확인합니다.
    review_sections = soup.find_all(
        string=lambda text: text and "관람평" in text
    )

    for section in review_sections:
        parent = section.parent
        print(parent.get_text(" ", strip=True))

finally:
    driver.quit()

실제 선택자를 찾는 방법

네이버의 클래스명은 변경될 수 있으므로 다음 순서로 확인하는 것이 가장 정확합니다.

  1. 크롬에서 관람평 페이지를 엽니다.
  2. 관람평 문장 위에서 마우스 오른쪽 버튼을 클릭합니다.
  3. 검사를 선택합니다.
  4. 개발자 도구에서 관람평 텍스트를 감싸고 있는 태그를 확인합니다.
  5. 해당 태그에서 Copy selector를 선택합니다.
  6. 복사한 선택자를 Selenium 또는 BeautifulSoup에서 테스트합니다.

예를 들어 개발자 도구에서 다음과 같은 구조를 확인했다면,

<div class="review_area">
    <p class="review_text">영화에 대한 관람평입니다.</p>
</div>

다음과 같이 사용할 수 있습니다.

reviews = soup.select("div.review_area p.review_text")

for review in reviews:
    print(review.get_text(" ", strip=True))

다만 위의 review_area, review_text는 예시이며, 현재 네이버 페이지의 실제 클래스명과 다를 수 있습니다.

핵심 정리

  • 제공해 주신 주소는 관람평 데이터 주소가 아니라 네이버 검색 결과 주소입니다.
  • 현재 네이버 관람평은 자바스크립트로 동적 생성될 가능성이 높습니다.
  • requests + BeautifulSoup만 사용하면 공란이 추출될 수 있습니다.
  • Selenium이나 Playwright로 페이지를 렌더링한 후 driver.page_source를 BeautifulSoup으로 분석해야 합니다.
  • 네이버의 클래스명은 변경될 수 있으므로 soup.select() 선택자는 개발자 도구에서 현재 HTML을 기준으로 다시 확인해야 합니다.
  • 네이버의 이용약관과 robots 정책을 확인하고, 과도한 요청이나 대량 수집은 피해서 실습하시기 바랍니다.

3.1.강화학습 기본 알고리즘-마르코프 결정과정

0

2

1

매수 실행 시점 관련

0

7

0

영상 다운로드는 안되나요?

0

13

0

수강자료 다운로드 관련 문의

0

21

2

Opus/Sonnet 버전 관련 문의

1

21

2

"run_nvidia_gpu.bat" 실행후

0

15

1

섹션2 질문이요

1

21

2

섹션 2

0

17

1

naver 글자 수집 오류 건

0

39

1

교육자료가 너무 오래되어서 지시한대로 진행하려 해도 안됩니다.

0

70

1

reg.get("http://www.naver.com")

0

91

2

VS로 수강 중인 수강생

0

69

1

네이버 페이지 데이터 수집 실습에서 a.nav가 안되요ㅠ

0

105

1

궁금증

0

116

1

Beautifulsoup실습도중 발생한 문제

0

176

1

selenium 버전이 4.x 대가 되면서 메서드가 달라졌고, 크롬드라이버 다운도 방식이 달라졌습니다(24.09.07 기준)

1

309

1

수업중 따라하기 오류 ㅠㅠ

0

280

2

req.get("http://www.naver.com) 입력후 "Response[200]" 이라고 나오지 않네요 ㅠㅠ

0

215

1

인스타 그램 크롤링 할때

0

966

1

질문

0

342

1

셀레니움 변경사항 입니다.

0

292

0

동영상안에

0

266

0

코스피거래상위종목 수집 강의에서 nth-child 결과 질문입니다

0

665

1

질문이 있습니다.

0

320

1