본문 바로가기
스파르타/Web

[Web] 크롤링 - ( week 3 )

by bakcoding_sparta 2023. 4. 20.

웹 페이지의 데이터를 가져오는 것을 웹 스크래핑 또는 크롤링이라고 한다.

데이터를 가져와볼 페이지는 https://movie.daum.net/ranking/reservation 이다.

 

베이스 코드

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(URL, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')

 

우선 크롤링을 위해서 추가로 패키지를 설치해주어야 한다. 패키지 이름은 bs4(beautiful soup)이며 해당 라이브러리는 크롤링해 온 웹 데이터를 필요한 것만 속아내서 사용하는데 도움을 준다.

 

pip install bs4

 

그리고 가져온 데이터를 한번 출력해 보면 해당 페이지의 html을 모두 가져오는 걸 확인할 수 있다.

print(soup)

 

여기서 필요한 정보만 골라서 가져오는 연습을 해본다.

우선 해당 페이지에서 개발 툴을 켜고 가져올 데이터의 html에 우클릭 > copy > copy selector

 

그리고나서 다시 코드로 돌아와서 soup을 사용해본다.

 

 

# 하나만 가져오기
title = soup.select_one('#mainContent > div > div.box_ranking > ol > li:nth-child(1) > div > div.thumb_cont > strong > a')

# 가져온 하나의 데이터
print(title)
# 해당 데이터의 텍스트만 가져오기
print(title.text)

soup에서 하나만 가져오는 함수 select_one 안에 복사한 것을 붙여 넣어 준 후 해당 데이터를 출력해 본다.

선택한 부분의 html과 텍스트만 가져오는 것을 볼 수 있다.

 

속성을 가져올 때는 딕셔너리의 키로 접근하는 방식으로 사용하면 된다.

 

# 속성 가져오기
print(title['href'])

 

이번엔 해당 페이지의 모든 영화 정보를 가져와본다.

그러기 위해서는 어떤 값을 가져와야 할지 파악이 필요하다.

페이지의 구조를 보면 영화들은 모두 li 태그로 만들어져 있다.

따라서 li를 가져온 다음 반복문으로 리스트를 돌면서 각 영화들의 정보를 추출하면 된다.

 

해당 li 가 있는 영역의 selector를 카피해서 li 부분까지만 가져와 본다.

# 영화 모두 가져오기
lis = soup.select_one('#mainContent > div > div.box_ranking > ol > li')
print(lis)

출력 결과 전체의 lis가 들어온 게 보인다. 이제 lis에서 각 영화의 정보를 가져온다.

이 때는 페이지의 html을 보면서 필요한 정보가 담겨있는 요소를 특정할 수 있도록 지정된 id나 class를 확인해주어야 한다.

class 이름이 link_txt이다. 이걸 가지고 데이터를 정리해 본다.

 

# 각 영화 정보를 순회
for li in lis:
    title = li.select_one('.link_txt')
    print(title)

해당 리스트에서 필요한 부분의 정보를 가져오는 것을 확인할 수 있다.

마찬가지로 해당 영역의 텍스트만 가져와 본다.

    # 텍스트만 가져오기
    print(title.text)
    # or
    title = li.select_one('.link_txt').text
    print(title)

텍스트를 가져올 때는 select_one에서 선택한 것의 text를 가져오거나

가져온 정보에서 text만 출력하게 하는 방법 모두 가능하다.

 

이번에는 영화의 순위를 가져와 본다. 우선 필요한 정보가 담겨있는 요소의 id 값을 확인한다.

개발자 툴을 사용할 때 마우스 아이콘을 클릭하고 브라우저 상에서 알고 싶은 영역을 클릭하면 해당 코드로 안내해 준다.

순위를 가져오고 싶기 때문에 순위가 적힌 공간을 클릭한다. 만약 해당 요소가 특정되지 않는다면 안내된 코드 내부에서 직접 찾아야 한다.

 

순위가 담겨있는 요소의 id는 rank_num이다

동일한 방식으로 가져오고 싶은 다른 값들도 가져와 본다.

for li in lis:
    title = li.select_one('.link_txt').text
    rank = li.select_one('.rank_num').text
    rate = li.select_one('.txt_grade').text
    print(rank, title, rate)

값들이 잘 출력되는 것을 확인할 수 있다.