본문 바로가기

js 공부(ft. sparta)/3주차

3-7. 웹스크래핑(크롤링) 기초

네이버 영화에 있는 영화 제목들과 별점들을 가져와볼꺼다.

스크래핑을 하는데 있어서 먼저 특별한 라이브러리가 하나 필요하다.

우선 vscode를 껏다 켰을 경우 아래 사진을 보며 설명하겠다.

먼저 1번을 확인해 venv가 맞는지 확인해주고 2번을 확인해 venv가 없기때문에 새로운 터미널을 다시 열어주면 준비가 끝난다.

그래야 여기 안에서 라이브러리를 꺼내다 쓸 수있다.

이제 우린 라이브러리를 venv에 설치를 할꺼다.

터미널창에 

pip install bs4

쓴 뒤 enter을 눌러 깔아준다.

다 깐뒤에 python 코드창에 있는것을 모두 지워주고 아래 "크롤링 기본세팅" 코드를 붙여넣어준다.

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

url 을 ctrl + 마우스 왼클릭 하면 해당 다음영화사이트에 들어가진다.

그럼 영화들이 아래처럼 쭉 나온다.

크롤링이란 웹에 접속해서 데이터를 솎아내어 가지고 오는거다. 그래서 라이브러리가 두개 필요하다.

첫번째는 웹에 접속하는 requests , 솎아내는 BeautifulSoup(bs) 이다.

우린 전 수업에 requests를 설치했고, 방금 bs를 설치했다.

 

이제 print(soup)을 쓴뒤 터미널창에서 실행해보면 html들을 쭉 가져오는 것을 확인할 수있다.

이제 여기서 우리가 원하는 것만 솎아내면 된다.

 

그전에 코드를 잠깐 살펴보자면 아래와 같다.

import requests # requests를 이용할게
from bs4 import BeautifulSoup # bs도 이용할게

URL = "https://movie.daum.net/ranking/reservation" # url을 받아서 변수 URL에 넣어줘
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') # 그 데이터를 솎아낼 준비를 해서

print(soup) # 찍어보자

이제 솎아보자.

print(soup)대신 아래 코드를 작성 후 

a = soup.select_one('')

아까 열었던 다음영화페이지에서 존윅4라는 글자를 마우스 우클릭으로 누르고 검사페이지를 연다.

그럼 위 사진처럼 뜨는데 여기서 저 표시를 한거 위에 마우스를 올려서 우클릭한뒤 copy -> copy selector 를 눌러준다.

그리고 아래 코드처럼 작은 따옴표 안에 붙여넣어준뒤 저장하고 실행해보자.

import requests # requests를 이용할게
from bs4 import BeautifulSoup # bs도 이용할게

URL = "https://movie.daum.net/ranking/reservation" # url을 받아서 변수 URL에 넣어줘
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') # 그 데이터를 솎아낼 준비를 해서

a = soup.select_one('#mainContent > div > div.box_ranking > ol > li:nth-child(1) > div > div.thumb_cont > strong > a')

print(a)

그럼 아래 사진처럼 딱 존윅4 부분만 가져오게 된다.

만약 우리가 여기서 저 존윅4 라는 글자만 가져오고 싶으면 아래와 같이 수정하고 실행해주면된다.

print(a.text)

위 코드로 수정하고 실행하면 아래와 같이 나온다.

만약 우리가 href 값을 가지고 오고 싶으면 아래와 같이 수정해주면 된다.

print(a['href'])

위 코드로 수정 후 실행하면 아래와 같이 href에 해당하는 url이 나온다.

 

이번에는 제목들을 쭉 다 가지고 올거다.

먼저 영화 제목에 마우스를 올려 검사를 연다음 li 를 접어보면 li로 다 이어져있다.

처음엔 li를 가져오고 그 안에서 이름들을 가져오면 된다.

 

위 처럼 lis를 만들어주고 검사창에서 첫번째 li를 copy - copy selector 해준다.

그럼 아래사진처럼 나온다.

두번째 li도 copy - copyselector 를 해보면

#mainContent > div > div.box_ranking > ol > li:nth-child(2)

위와 같은게 나온다.

자 여기서 공통인것은 #mainContent > div > div.box_ranking > ol > li 딱 이부분까지가 공통이다.

그러니 아래와 같이 작성해주면 li들이 착착착 다 쌓이게 된다.

이제 리스트가 생겼으니 반복문으로 돌려주면서 모두 잘 들어갔는지 확인해보자.

li에 해당되는 모든 영화들이 잘 나온것을 확인할 수 있다.

이제 우린 이안에서 제목만 하나씩 따오면 된다.

 

우선 영화제목은 검사창에 보면 아래 사진에 해당한다.

여기다 대고 마우스 우클릭 copy - copy selector 한번만 더 해보면

#mainContent > div > div.box_ranking > ol > li:nth-child(2) > div > div.thumb_cont > strong > a
 

위 코드가 나온다. 잘 보면 우린 li:nth-child(2) 의 li 까지는 이미 받아왔다.

그렇기 때문에 그 뒤에 해당하는 div 부터 a까지 받아오면된다.

이제 이걸 실행하면 아래와 같이 영화 제목이 해당되는 a 받아온것을 확인해볼 수 있다.

그리고 이제 .text만 해서 가져오면 되는데 현재창은 없지만 가끔 none이라고 영화가 없는 것도 같은 방식으로 만들어져서

a가 없는 경우가 있다.

그러니 반복문안에 조건문을 만들고 실행해주면 아래와 같이 깔끔하게 제목들만 나온것을 확인해볼 수 있다.

 

'js 공부(ft. sparta) > 3주차' 카테고리의 다른 글

3-9. DB 개괄  (0) 2023.04.12
3-8. 웹스크래핑(크롤링) 연습  (0) 2023.04.12
3-6. 패키지 사용해보기  (0) 2023.04.11
3-5. python 패키지 설치  (0) 2023.04.11
3-4. python 기초 공부하기(2)  (0) 2023.04.11