• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

BeautifulSoup 으로 네이버 영화 평점 크롤링하기

20.05.19 14:52 작성 조회수 158

1

import requests

from bs4 import BeautifulSoup

url = "https://movie.naver.com/movie/point/af/list.nhn?&page=1"

r = requests.get(url)

bs = BeautifulSoup(r.text, "lxml")

tables = bs.select("table.list_netizen > tbody > tr")

for tr in tables:

    tds = tr.select("td")

    if len(tds) != 5:

        continue

        

    point = int(tds[2].text)

    movie = tds[3].select("a[href]")[0].text

    writer = tds[4].select("a")[0].text

    

    print(movie, point, writer)

예상 결과값

극한직업 10 youm****
나의 특별한 형제 10 youm****
뺑반 9 elfs****
퓨리 10 rkdt****
어벤져스: 엔드게임 9 cfdl****
왓칭 1 grem****
가버나움 10 good****
나의 특별한 형제 10 sona****
어벤져스: 엔드게임 10 kore****
캡틴 마블 1 cgc0****

해당 코드로 run을하면, 예제 주신것과 같이 Print가 되어야하는데... print가 안되네요 혹시나해서 공유해주신 jupyter code도 실행해 봤지만, 동일한 문제가 발생합니다. jupyter,vscode 모두에서 이런 현상이 발생하는데, 혹시 제가 놓친 부분이 있을까요?

답변 3

·

답변을 작성해보세요.

1

강의를 보시면 영상 나오는 하단에 수정된 코드가 있습니다. 2020년 1월부로 사이트의 내용이 변경되어 수정된 부분입니다.

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))

0

고민해보시고 연습해보시고 스스로 해결하시려는 모습이 훌륭하십니다~!!!

0

me628님의 프로필

me628

질문자

2020.05.19

답변 감사합니다, 

혹시나해서 개발 도구를 확인해서 확인해보니 tds len가 5->3이 되어있고,  point, movie, writer의 index값이 변경되있어서 수정하니 아래 코드와 결과처럼 해결했습니다. 

url = "https://movie.naver.com/movie/point/af/list.nhn?&page=1"

r = requests.get(url)

bs = BeautifulSoup(r.text, "lxml")

tables = bs.select("table.list_netizen > tbody > tr")

for tr in tables:

    tds = tr.select("td")

    if len(tds) != 3:

        continue

        

    point = tds[1].select("div[class]")[0].text

    movie = tds[1].select("a[href]")[0].text

    writer = tds[2].select("a")[0].text

    

    print(movie, point, writer)

    

코드 결과값

해피 해피 브레드 
별점 - 총 10점 중10
 star****
가장 보통의 연애 
별점 - 총 10점 중6
 andy****
애프터 
별점 - 총 10점 중10
 riri****
건축학개론 
별점 - 총 10점 중1
 leee****
어스 
별점 - 총 10점 중4
 1992****
가장 따뜻한 색, 블루 
별점 - 총 10점 중7
 ijuh****
애프터 
별점 - 총 10점 중10
 unge****
아가씨 
별점 - 총 10점 중7
 ijuh****
교회오빠 
별점 - 총 10점 중10
 ayj5****
매드맥스: 분노의 도로 
별점 - 총 10점 중10
 club****