크롤링 사용해보기
크롤링이란?
크롤링이란 쉽게 설명하면 웹사이트에서 내가 원하는 데이터를 추출하는 것이다. 즉 사용자가 원하는 웹사이트에 들어가서 원하는 데이터를 추출하여 가져오는 것을 말한다. (스크랩핑이라고도 한다.)
크롤링을 사용하기 위해서는 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> 태그에 각 순위별로 담아진 것을 확인했으니 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은 바로 영화 순위에서 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)