• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

html 변경됌

20.01.21 11:51 작성 조회수 130

1

네이버 영화 평점 사이트가 변경되었는 지 td가 3개네요

별점은 em태그안에 있네요 나중에 들으시는 분들 당황하지 마시고 html 잘 살펴보세요

               

답변 1

답변을 작성해보세요.

0

네 감사합니다. 강의 하단에 수정된 코드를 첨부해놨습니다. 크롤링 프로그램을 만드는 사람들은 항상 웹사이트들이 페이지를 업데이트하고 리뉴얼을 자주 할 수 있다는 전제를 갖고 프로그램을 만들어야 합니다. 그래서 실제 실무에서도 페이지 크롤링이 실패하면 슬랙이나 텔레그램 같은 외부 메신저 프로그램을 통해 알림을 받게끔 코드를 짜기도 합니다.

아래는 수정된 코드의 내용입니다.

import requests
from bs4 import BeautifulSoup

def get_movie_point(start, end=1):
    results = []
    for i in range(start, end+1):
        url = 'https://movie.naver.com/movie/point/af/list.nhn?&page={}'.format(i)
        r = requests.get(url)
        bs = BeautifulSoup(r.text, "lxml")
        trs = bs.select("table.list_netizen > tbody > tr")
        for tr in trs:  #다수의 평점
            # 번호
            number = tr.select_one("td.ac.num").text
            # 작성자
            writer = tr.select_one("td.num > a.author").text
            
            # td 의 title 클래스를 구합니다.
            tr_data = tr.select_one("td.title")

            # td class="title" 자식중 최초 a 태그안에 제목만 추출
            title = tr_data.select_one("a").text

            # td class="title" 자식중 div 태그 자식중 em 태그에 점수 추출
            point = tr_data.select_one("div.list_netizen_score > em").text

            # td class="title" 태그에서 a, div, br 태그 제거
            # extract() 함수는 태그와 태그의 내용까지 모두 제거합니다.
            [x.extract() for x in tr_data.select("a")]
            [x.extract() for x in tr_data.select("div")]
            [x.extract() for x in tr_data.select("br")]

            # 위에서 태그를 모두 제거한 tr_data에서 내용만 추출
            content = tr_data.text.strip()
            results.append({
                "number": number,
                "movie": title,
                "point": point,
                "writer": writer,
                "contents": content,
            })
    return results

print(get_movie_point(1,1))