Wii Pointer #1 Tilt Normal
본문 바로가기
📁𝐩𝐫𝐨𝐠𝐫𝐚𝐦𝐦𝐢𝐧𝐠𝐋𝐚𝐧𝐠𝐮𝐚𝐠𝐞/Python

[웹 스크래핑 크롤링] 웹스크래핑(크롤링) 기초

by 개발자_후니 2022. 12. 29.
728x90
반응형
웹스크래핑(크롤링) 기초

 

html을 가져와서 네이버 영화 랭킹사이트의 영화이름을 쉽게 가져오는 방법?

 

 

beautiful soup = bs4 (크롤링 패키지) 라는 라이브러리 활용!

 

크롤링 기본 세팅 코드

 

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)

 

추가해서

 

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)

 

실행해보면

 

 

이런 실행화면이 나타나게 된다.

 

beautiful soup (bs4) 사용하는 방법

 

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

 

우선 이 사이트에서 시작 해 보겠다.

 

 

해당 화면의 '밥정' 에 오른쪽 마우스 클릭해서 검사를 누르면

 

 

이런식으로 내가 지정한 검사의 요소를 나타내준다 나타내준 곳에 한번 더 오른쪽 마우스를 눌러서

 

copy -> copy selector

 

혹은

 

복사 -> selector 복사 를 눌러주면 된다.

 
title = soup.select_one('#select 복사')

print(title)

 

#select 복사 자리에 붙여넣어준뒤

 

그대로 출력하면

 

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

print(title)

 

 

이렇게 출력된다.

 

만약 

 

출력된 <a href="/movie/bi/mi/basic.naver?code=186114" title="밥정">밥정</a> 결과 값에서

 

href의 값만 출력하고 싶다면

 

print(title['href'])

 

이렇게 입력하고 출력해주면

 

 

이렇게 href 값만 출력된것을 확인할 수 있다.

 

근데 여러개 선택하려면 어떻게 해야하나?

 

우선 selector 복사를 여러번 해보자

 

 

여기 그린북이랑 가버나움 두개를 카피 셀렉트해서 복붙해보자

 

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

 

확인해보니

 

#old_content > table > tbody > tr

 

여기까지는 똑같다는것을 확인할 수 있다.

 

td.title > div > a

 

뒷부분인 이 코드도 같다는것을 확인할 수 있다.

 

그럼 어떻게 해야하나

 

 

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

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

print(movies)

 

이런식으로 출력하면

 

이 친구들의 body 가 나오는 것 같다.

 

 

그렇다면,  그 바디에서 타이틀에 대해서 만 출력 해보자.

 

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

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

for movie in movies:
    a = movie.select_one('td.title > div > a')

    print(a)

 

for movie in movies:
    a = movie.select_one('td.title > div > a')

    print(a)

 

이 구문 어디서 본 적 있지 않는가?

 

기억해 보라

 

아 requests!

 

 

이 코드를 출력하면

 

 

이렇게 출력되는 것을 확인할 수 있다.

 

아까 밥정을 출력했을때의 모음집이다.

 

여기서 None 은 가로선으로 확인된다.

 

이 가로선을 없애보자

 

for movie in movies:
    a = movie.select_one('td.title > div > a')
    if a is not None:
        print(a)

 

is not None:

 

 

을 사용하거나

 

!= None:

 

을 사용해도 된다.

 

해당 코드를 출력하면

 

 

None 이 사라져있는것을 확인할 수 있다.

 

그 다음 영화 제목만 출력 하려면

 

for movie in movies:
    a = movie.select_one('td.title > div > a')
    if a != None:
        print(a.text)

 

a.text 를 프린트 하면 된다.

 

 

-끝-

728x90
반응형