본문 바로가기
풀스택 개발일지

[웹개발 종합반 3주차] 웹스크래핑(크롤링)

by 노랑사랑팽이 2022. 10. 21.

🔖05. 파이썬 패키지 설치하기

🔎 가상 환경(virtual environment) 이란?

라이브러리를 모아둔 곳

[Setting]-[Project: pythonprac]-[Python Interpreter]-[+]-[requests]-[install package]

일종의 ajax 같은 개념!


🔖06. 패키지 사용해보기

🔎 데이터 가져오기

import requests # requests 라이브러리 설치 필요

r = requests.get('http://spartacodingclub.shop/sparta_api/seoulair')
rjson = r.json()

print(rjson)


🔖07.웹스크래핑(크롤링) 기초

🔎 네이버 영화 페이지

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

 

랭킹 : 네이버 영화

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

movie.naver.com

 

🔎 bs4(beautifulsoup4) 패키지 설치

값을 찾기 쉽게 도와주는 패키지

 

🔎 html 가져오기

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

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

# 코딩 시작
print(soup)

 

🔎 HTML 추출하기

영화 페이지에서 영화제목란 마우스 커서 우클릭 [검사]

mark된 Elements  마우스커서 우클릭 [Copy]-[Copy selector]

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

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

# 코딩 시작
title = soup.select_one('#old_content > table > tbody > tr:nth-child(2) > td.title > div > a')
print(title)
print(title.text)
print(title['href'])

 

👀 출력

<a href="/movie/bi/mi/basic.naver?code=186114" title="밥정">밥정</a>
밥정
/movie/bi/mi/basic.naver?code=186114

 

🔎 영화페이지 제목 가져와보기

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

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

# 코딩 시작
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > td.title > div > a

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

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

 

👀 출력

밥정
그린 북
가버나움
디지몬 어드벤처 라스트 에볼루션 : 인연
원더
베일리 어게인
먼 훗날 우리
아일라
당갈
극장판 바이올렛 에버가든
포드 V 페라리
주전장
쇼생크 탈출
...

🔖08.웹스크래핑(크롤링) 연습

🔎 select 

[ ]안에 html 태그가 들어 있는 형태

 

🔎 select_one

html 코드만 들어있음

 

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

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

# 코딩 시작
#title
#old_content > table > tbody > tr:nth-child(3) > td.title > div > a
#old_content > table > tbody > tr:nth-child(4) > td.title > div > a

#rank
#old_content > table > tbody > tr:nth-child(2) > td:nth-child(1) > img
#old_content > table > tbody > tr:nth-child(3) > td:nth-child(1) > img

#scores
#old_content > table > tbody > tr:nth-child(2) > td.point

movies = soup.select('#old_content > table > tbody > tr')
# print(moves)

for movie in movies:
    a = movie.select_one('td.title > div > a')
    # print(movie.select_one('td:nth-child(1) > img')['alt'])

    if a is not None:
        title = a.text
        rank = movie.select_one('td:nth-child(1) > img')['alt']
        score = movie.select_one('td.point').text
        print(rank, title, score)

 

👀 출력

01 밥정 9.64
02 그린 북 9.59
03 가버나움 9.59
04 디지몬 어드벤처 라스트 에볼루션 : 인연 9.53
05 원더 9.52
06 베일리 어게인 9.52
07 먼 훗날 우리 9.52
08 아일라 9.51
09 당갈 9.49
010 극장판 바이올렛 에버가든 9.48
11 포드 V 페라리 9.48
12 주전장 9.47
...

 


☀️ 느낀점

스스로 추출해보려다가 select로 하면 [ ]안에 html이 담겨져 있는 형태로 추출되서 당황했었다. 알고보기 html만 추출하려면 한줄씩 select_one을 해줘야 했다. 

또한 none값의 row가 같아서 그냥 제목이 none값이면 순위와 별점 모두 추출할 필요 없다는 사실! 혹여나 다른 행에 none값이 있지 않을까 염려했었다.

추출한 값을 다 list에 담아서 추출해야 하나~ 심각하게 고민했는데, 그럴 필요 없었다. 추후엔 mongoDB를 깔고 웹크롤링으로 추출한 값을 DB에 담는 걸 공부할 예정이다. 

오늘 이틀치 진도를 하루안에 다 했다. 블로그에 정리하면서 하려니 생각보다 시간이 많이 소모되지만, 모바일로도 틈틈히 읽어보면서 기초를 다져야겠다. 오늘한 크롤링 부분은 반복해서 하고도 헷갈린다면 한번 더 연습해봐야겠다.

댓글