카테고리 없음

크롤링 사용해보기

usop 2022. 5. 31. 20:14

크롤링이란?

크롤링이란 쉽게 설명하면 웹사이트에서 내가 원하는 데이터를 추출하는 것이다.  즉 사용자가 원하는 웹사이트에 들어가서 원하는 데이터를 추출하여 가져오는 것을 말한다. (스크랩핑이라고도 한다.)

크롤링을 사용하기 위해서는 2가지가 필요하다.

먼저 requests,  우리는 저번시간 install 했으니 패스하고

두번째로는 beautifulsoup 을 설치해야한다. requests 때와 마찬가지로

File - Settings - + 모양 클릭 - bs4 검색 후 install

 

 

 

네이버 영화 랭킹사이트를 크롤링해보자

https://movie.naver.com/movie/sdb/rank/rmovie.naver?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')

imports 부분을 통해 requests(요청) 와 beautifulsoup(불러오기)을 연결해주고

headers 를 쓰는 이유는 특정 브라우저들은 어떤 기본 요청이 들어오면 그 요청을 막는 기능이 있는데 그것을 방지하고자 사용한다고 하네요..(이 부분은 정확히 모르겠네욤)

 

그렇게 data  부분을 통해 요청을 받아오고 soup 을 통해 받아온 데이터를 뿌려주는 겁니다.

 

 

beaultiful 사용법은 두 가지가 있는데요.

select (여러가지) 와 select_one (한 가지) 을 사용하는 방법이 있습니다.

 

## 1. select_one

select_one은  네이버 영화에 '그린 북' 페이지를  담아보자.

'그린 북' 옆에 오른쪽 마우스 검사 클릭

'그린 북'에 해당되는 태그를 copy-copy selector 복사한 후  title에 담은 후 출력하면 된다.

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

print(title)

 

그린북의 텍스트와 속성을 따로 불러오는 방법도 알아보자.

 

print(title.text)
print(title['href'])

텍스트와 속성

 

 

## 2. select ( 특징: 결과값이 리스트 형식으로 나옴)

 

select는 여러가지 데이터를 가져와야 하므로 영화 랭킹 1~10위를 담아보자.

 

 

아까와 달리 이번엔 순위, 영화 제목, 평점 등 다양한 정보를 가져와야 보기 편하므로 한 줄 한 줄 카피해주는게 좋겠다.

 

<tr> 태그에 담아져있다.

<tr> 태그에 각 순위별로 담아진 것을 확인했으니 copy selecor 해보자.

 

각 태그들을 복사하여 나열해보면 tr 태그안의 (2),(3),(4) 를 나열한 것을 확인할 수 있다.

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

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

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

 

그렇다면 이 순위 데이터들은 

#old_content > table > tbody > tr 에 순서대로 담아져있다.

 

trs에 영화 순위 데이터들을 담아보자. 코드는 이러하다.

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

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

for tr in trs:
    print(tr)

 

그렇다면 여러가지 데이터 값들 중 영화 제목들만 뽑아내는 것은 어떻게 해야할지 생각해보자.

 

 

우선 각 제목별 데이터가 어디 담겨있는지 보려고 

'그린 북' 검사하기를 통해 copy selector 해보아 위치를 확인해주자

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

여기서 우리는 trs 에 table > tobdy > tr 까지 담아놨으니

그 뒤에 td.title > div > a 부분을  a_tag 변수에 담아주면 그게 바로 영화 순위 제목 데이터 값들의 위치임을 알 수 있다.

 

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

for tr in trs:
    a_tag = tr.select_one('td.title > div > a')
    print(a_tag)

출력해보면 잘 나오는 것을 확인했다. 

그런데 None이 섞여나왔다. 

None

이 None은 바로 영화 순위에서 10위 에서 11위로 넘어가는 줄 부분이다.

 

 

그렇기 때문에 이대로 출력하면 None이 섞여 정상적으로 출력이 되지 않아 none이 아닐때 출력해주면 된다.

 a_tag is not None 부분일때만 제목( text) 을 출력해주면 된다.

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