저번주 배웠던 scraping을 복습하며 내 것으로 만드는 주차

Scraping_review

네이버 영화 랭킹 목록을 가져오는 작업을 해볼 것이다.
먼저 소스코드 복붙한 뒤 data 변수에 네이버 영화 랭킹 웹페이지 주소 복붙

import requests
from bs4 import BeautifulSoup

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.naver?sel=pnt&date=20210101',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')

그 다음 내가 가져오고 싶은 데이터가 어디 속해있는지 inspector를 통해 찾아본다. tbody 밑 tr에 랭킹, 제목, 평점이 입력되어있다. tbody의 selector를 복사해서 그 밑 tr을 선택하는 변수를 trs로 설정한다.

**html review
tr = table row
td = table data

import requests
from bs4 import BeautifulSoup

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.naver?sel=pnt&date=20210101',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')

trs = soup.select('#old_content > table > tbody > tr')

print(trs[1])

1번째 trs를 추출해보니 다음과 같은 결과가 나왔다.

<tr>
<td class="ac"><img alt="01" height="13" src="https://ssl.pstatic.net/imgmovie/2007/img/common/bullet_r_r01.gif" width="14"/></td>
<td class="title">
<div class="tit5">
<a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a>
</div>
</td>
<td><div class="point_type_2"><div class="mask" style="width:95.9000015258789%"><img alt="" height="14" src="https://ssl.pstatic.net/imgmovie/2007/img/common/point_type_2_bg_on.gif" width="79"/></div></div></td>
<td class="point">9.59</td>
<td class="ac"><a class="txt_link" href="/movie/point/af/list.naver?st=mcode&amp;sword=171539">평점주기</a></td>
<td class="ac"><img alt="na" class="arrow" height="10" src="https://ssl.pstatic.net/imgmovie/2007/img/common/icon_na_1.gif" width="7"/></td>
<td class="range ac">0</td>
</tr>

여기서 내가 항목으로 만들고 싶은 것들은 img의 내용, 영화제목, 그리고 평점이다. 즉,

<td class="ac"><img alt="01" height="13" src="https://ssl.pstatic.net/imgmovie/2007/img/common/bullet_r_r01.gif" width="14"/></td>

<a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a>

<td class="point">9.59</td>

를 항목으로 추출하고 싶은 것이다. 1번째 trs 뿐 아니라 웹페이지에 있는 모든 tr들을 다 뽑고 싶기 때문에 반복작업을 할 필요가 있다. 먼저 제목들 부터 추출해보자.

import requests
from bs4 import BeautifulSoup

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.naver?sel=pnt&date=20210101',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')

trs = soup.select('#old_content > table > tbody > tr')

for tr in trs:
	a = tr.select_one('a')
	print(a)

tr 밑에 클래스 없는 a 태그는 제목밖에 없다. 따라서 결과는 다음과 같이 나온다:

None
<a href="/movie/bi/mi/basic.naver?code=171539" title="그린 북">그린 북</a>
<a href="/movie/bi/mi/basic.naver?code=174830" title="가버나움">가버나움</a>
<a href="/movie/bi/mi/basic.naver?code=197647" title="가나의 혼인잔치: 언약">가나의 혼인잔치: 언약</a>
<a href="/movie/bi/mi/basic.naver?code=192613" title="디지몬 어드벤처 라스트 에볼루션 : 인연">디지몬 어드벤처 라스트 에볼루션 : 인연</a>
<a href="/movie/bi/mi/basic.naver?code=175092" title="먼 훗날 우리">먼 훗날 우리</a>
<a href="/movie/bi/mi/basic.naver?code=144906" title="베일리 어게인">베일리 어게인</a>
<a href="/movie/bi/mi/basic.naver?code=182525" title="언플랜드">언플랜드</a>
<a href="/movie/bi/mi/basic.naver?code=151196" title="원더">원더</a>
<a href="/movie/bi/mi/basic.naver?code=196843" title="극장판 바이올렛 에버가든">극장판 바이올렛 에버가든</a>
<a href="/movie/bi/mi/basic.naver?code=169240" title="아일라">아일라</a>
None
<a href="/movie/bi/mi/basic.naver?code=157243" title="당갈">당갈</a>
<a href="/movie/bi/mi/basic.naver?code=181710" title="포드 V 페라리">포드 V 페라리</a>
<a href="/movie/bi/mi/basic.naver?code=179518" title="주전장">주전장</a>
<a href="/movie/bi/mi/basic.naver?code=17421" title="쇼생크 탈출">쇼생크 탈출</a>
<a href="/movie/bi/mi/basic.naver?code=10200" title="터미네이터 2:오리지널">터미네이터 2:오리지널</a>
<a href="/movie/bi/mi/basic.naver?code=10016" title="나 홀로 집에">나 홀로 집에</a>
<a href="/movie/bi/mi/basic.naver?code=154667" title="덕구">덕구</a>
<a href="/movie/bi/mi/basic.naver?code=18988" title="라이언 일병 구하기">라이언 일병 구하기</a>
<a href="/movie/bi/mi/basic.naver?code=156464" title="보헤미안 랩소디">보헤미안 랩소디</a>
<a href="/movie/bi/mi/basic.naver?code=69105" title="월-E">월-E</a>
None
<a href="/movie/bi/mi/basic.naver?code=35939" title="클래식">클래식</a>
<a href="/movie/bi/mi/basic.naver?code=10102" title="사운드 오브 뮤직">사운드 오브 뮤직</a>
<a href="/movie/bi/mi/basic.naver?code=82432" title="헬프">헬프</a>
<a href="/movie/bi/mi/basic.naver?code=10002" title="빽 투 더 퓨쳐">빽 투 더 퓨쳐</a>
<a href="/movie/bi/mi/basic.naver?code=24452" title="매트릭스">매트릭스</a>
<a href="/movie/bi/mi/basic.naver?code=22126" title="인생은 아름다워">인생은 아름다워</a>
<a href="/movie/bi/mi/basic.naver?code=194334" title="부활: 그 증거">부활: 그 증거</a>
<a href="/movie/bi/mi/basic.naver?code=17159" title="포레스트 검프">포레스트 검프</a>
<a href="/movie/bi/mi/basic.naver?code=35901" title="살인의 추억">살인의 추억</a>
<a href="/movie/bi/mi/basic.naver?code=106360" title="위대한 쇼맨">위대한 쇼맨</a>
None
<a href="/movie/bi/mi/basic.naver?code=29217" title="글래디에이터">글래디에이터</a>
<a href="/movie/bi/mi/basic.naver?code=192066" title="소년시절의 너">소년시절의 너</a>
<a href="/movie/bi/mi/basic.naver?code=18847" title="타이타닉">타이타닉</a>
<a href="/movie/bi/mi/basic.naver?code=32686" title="센과 치히로의 행방불명">센과 치히로의 행방불명</a>
<a href="/movie/bi/mi/basic.naver?code=189027" title="아이즈 온 미 : 더 무비">아이즈 온 미 : 더 무비</a>
<a href="/movie/bi/mi/basic.naver?code=66463" title="토이 스토리 3">토이 스토리 3</a>
<a href="/movie/bi/mi/basic.naver?code=136900" title="어벤져스: 엔드게임">어벤져스: 엔드게임</a>
<a href="/movie/bi/mi/basic.naver?code=163788" title="알라딘">알라딘</a>
<a href="/movie/bi/mi/basic.naver?code=10048" title="죽은 시인의 사회">죽은 시인의 사회</a>
<a href="/movie/bi/mi/basic.naver?code=31162" title="캐스트 어웨이">캐스트 어웨이</a>
None
<a href="/movie/bi/mi/basic.naver?code=92125" title="헌터 킬러">헌터 킬러</a>
<a href="/movie/bi/mi/basic.naver?code=17170" title="레옹">레옹</a>
<a href="/movie/bi/mi/basic.naver?code=134899" title="동주">동주</a>
<a href="/movie/bi/mi/basic.naver?code=31796" title="반지의 제왕: 왕의 귀환">반지의 제왕: 왕의 귀환</a>
<a href="/movie/bi/mi/basic.naver?code=147092" title="히든 피겨스">히든 피겨스</a>
<a href="/movie/bi/mi/basic.naver?code=161850" title="아이 캔 스피크">아이 캔 스피크</a>
<a href="/movie/bi/mi/basic.naver?code=14450" title="쉰들러 리스트">쉰들러 리스트</a>
<a href="/movie/bi/mi/basic.naver?code=34324" title="집으로...">집으로...</a>
<a href="/movie/bi/mi/basic.naver?code=37886" title="클레멘타인">클레멘타인</a>
<a href="/movie/bi/mi/basic.naver?code=181700" title="안녕 베일리">안녕 베일리</a>
None

None이 아닌 경우에만 영화 제목을 추출하고 싶다. a 변수가 None이 아닐 때 a를 text 형태로 추출:

import requests
from bs4 import BeautifulSoup

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.naver?sel=pnt&date=20210101',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')

trs = soup.select('#old_content > table > tbody > tr')

for tr in trs:
  a = tr.select_one('a')
  if a is not None:
    title = a
    print(a.text)

이제 남은건 랭크와 평점!

import requests
from bs4 import BeautifulSoup

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.naver?sel=pnt&date=20210101',headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')

trs = soup.select('#old_content > table > tbody > tr')

for tr in trs:
  a = tr.select_one('a')
  if a is not None:
    title = a
    rank = tr.select_one('img')
    star = tr.select_one('td.point')
    #rank의 alt속성 값만 출력, title과 star를 text형태로 출력
    print(rank['alt'], title.text, star.text)
profile
coding을 잘하고 싶은 아저씨

0개의 댓글