[3주차_웹개발] 개발일지 (영화제목 crawling)

Coastby·2022년 6월 5일
0
post-custom-banner

[실습 목표]
네이버 영화페이지 크롤링하기!

[실습 웹사이트 주소]
https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303

완성본

데이터분석반에서 했던 실습과 유사하다.
https://velog.io/@coastby/1주차데이터분석-개발일지-스크래핑-숙제

  1. 페이지 html 정보 가지고 오기
  2. 반복되는 형식을 리스트로 가져오기
  3. 반복문으로 원하는 태그만 가져오기
  4. 형식에 맞게 가공하기

1. 페이지 html 정보 가지고 오기

필요한 패키지를 다운로드하고 페이지의 html 정보를 변수에 담는다.

import requests
from bs4 import BeautifulSoup

# 타겟 URL을 읽어서 HTML를 받아오고,
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
# soup이라는 변수에 "파싱 용이해진 html"이 담긴 상태가 됨
# 이제 코딩을 통해 필요한 부분을 추출하면 된다.
soup = BeautifulSoup(data.text, 'html.parser')

2. 반복되는 형식을 리스트로 가져오기

반복되는 tr태그를 soup으로 가져온다.
tr 태그는 개발자 도구의 copy selector로 가져온다.

import requests
from bs4 import BeautifulSoup

# URL을 읽어서 HTML를 받아오고,
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
soup = BeautifulSoup(data.text, 'html.parser')

# select를 이용해서, tr들을 불러오기
movies = soup.select('#old_content > table > tbody > tr')

3+4. 반복문으로 원하는 태그만 가져오기/가공하기

태그안에서 원하는 정보가 어디 있는 지 확인한 후 하나씩 가져와본다.

중간에 구분선이 있어서 구분선이 있는 tr태그은 지정되는 a태그가 없다. 따라서 a태그가 있는 tr만 가져오는 조건문을 만든다.

# movies (tr들) 의 반복문을 돌리기
for movie in movies:
    # movie 안에 a 가 있으면, 제목이 있는 a_tag들 가지고오기
    a_tag = movie.select_one('td.title > div > a')
    if a_tag is not None:
        # a의 text를 찍어본다.
        print (a_tag.text)

순위 / 제목 / 별점 순으로 찍어낸다.

rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기
title = a_tag.text                                      # a 태그 사이의 텍스트를 가져오기
star = movie.select_one('td.point').text 

순위는 속성값으로 표현되어 있다. 이는 2가지 방법으로 가져올 수 있다.

soup.select_one('태그명')['속성명']
soup.태그명.get('속성명')

완성코드

import requests
from bs4 import BeautifulSoup

# URL을 읽어서 HTML를 받아오고,
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303',headers=headers)

# HTML을 BeautifulSoup이라는 라이브러리를 활용해 검색하기 용이한 상태로 만듦
soup = BeautifulSoup(data.text, 'html.parser')

# select를 이용해서, tr들을 불러오기
movies = soup.select('#old_content > table > tbody > tr')

# movies (tr들) 의 반복문을 돌리기
for movie in movies:
    # movie 안에 a 가 있으면,
    a_tag = movie.select_one('td.title > div > a')
    if a_tag is not None:
        rank = movie.select_one('td:nth-child(1) > img')['alt'] # img 태그의 alt 속성값을 가져오기
        title = a_tag.text                                      # a 태그 사이의 텍스트를 가져오기
        star = movie.select_one('td.point').text                # td 태그 사이의 텍스트를 가져오기
        print(rank,title,star)

✋나의 답안

for tr in trs:
    a_tag = tr.select_one('td.title > div > a')
    if a_tag is not None:
        title = a_tag.text
    rank = tr.select_one('td:nth-child(1) > img')
    if rank is not None:
        rank_num = rank['alt']
    star = tr.select_one('td.point')
    if star is not None:
        star_num = star.text
        print(rank_num, title, star_num)
  • 결과는 같으나 쓸데없이 중복되는 조건문을 계속 넣음
  • 변수도 굳이 여러개를 설정함
profile
훈이야 화이팅
post-custom-banner

0개의 댓글