WEB/python

[python] 파이썬으로 크롤링하는 법 / 영화페이지 제목 크롤링하는 법 친절 설명

자바칩 프라푸치노 2021. 6. 10. 16:10

bs4를 설치해야함

https://movie.naver.com/movie/sdb/rank/rmovie.nhn?sel=pnt&date=20200303 

 

랭킹 : 네이버 영화

영화, 영화인, 예매, 박스오피스 랭킹 정보 제공

movie.naver.com

이 페이지에 들어간다

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.nhn?sel=pnt&date=20200303',headers=headers)

soup = BeautifulSoup(data.text, 'html.parser')

# 코딩 시작

이게 크롤링 기본 세팅 코드이다

 

그린북 제목을 개발자도구에서 클릭하면

이렇게 나오는데 저 파란 부분을 copy> copy selector을 누른다.

#old_content > table > tbody > tr:nth-child(2) > td.title > div > a

그럼 이렇게 복사가 된다.

title= soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
print(title)

그럼 select_one을 먼저 해보자

하나만 select하는 것이다.

이렇게 치고 print를 해보면

이렇게 나온다

그런데 여기서 tag와 tag안에 있는 그린북이라는 텍스트를 가지고 오고 싶으면

print(title.text)

이렇게 하면 된다.

그런데 tag안에 있는 속성을 가지고 오고 싶으면

print(title['title'])

이렇게 써서 가지고 오면 된다.

 


이번에는 select여러개를 해보자

영화별로 제목 순위 별점을 가져오고 싶다

그러면 똑같은 구조로 되어있는 html을 파악을 해야겠다.

그린북 저 줄을 보면 tr태그로 되어있다.

그래서 copy selector을 해보자

#old_content > table > tbody > tr:nth-child(2)
#old_content > table > tbody > tr:nth-child(3)

바로 밑의 가버나움도 해보면 저렇게 나온다

그러면 뒤에 다른 부분을 떼면 해당하는 것들이 다 나오겠다.

#old_content > table > tbody > tr
trs = soup.select('#old_content > table > tbody > tr')
for tr in trs:
    print(tr)

그럼 이렇게 크롤링을 하면 tr들이 리스트로 나온다

그러면 그 tr안에서 다시 title을 찾든지 순위를 찾든지 하면 되는 것이다.

 

그럼 다시 그린북을 copy selector해보자

#old_content > table > tbody > tr:nth-child(2) > td.title > div > a

이렇게 나오는데 아까 trs로 tr까지는 찾았다.

그러니까 뒤에  td.title > div > a 이만큼을 더 찾아야하는 것이다.

trs = soup.select('#old_content > table > tbody > tr')
for tr in trs:
    a_tag = tr.select_one('td.title > div > a')
    print(a_tag)

그럼 for문을 돌면서 또 찾는 것이다.

그러면 이런 식으로 나온다

중간중간에 none이 나오는데 이것은 페이지에 구분선이다.

그러면 여기서 title만 얻으려고 하는데 .text를 쓰면 none때문에 오류가 난다.

그러므로

trs = soup.select('#old_content > table > tbody > tr')
for tr in trs:
    a_tag = tr.select_one('td.title > div > a')
    if a_tag is not None:
        print(a_tag.text)

if문으로 걸어주면 된다.


2021.06.10 - [WEB/python] - [python] 크롤링으로 영화 제목 랭킹 별점 가져오기

728x90