본문 바로가기
DATA/[ 모각코+ 12월 과정 ] 웹 크롤링

[ 모각코+ 7일차 ] 정적 크롤링 사용해보기 ②

by 2CHAE._.EUN 2021. 12. 28.
정적 크롤링을 위한 BeautifulSoup 라이브러리

 

BeautifulSoup 라이브러리는 HTML을 효율적으로 탐색하고, 원하는 정보를 손쉽게 추출하기 위한 라이브러리이다.

 

즉 BeautifulSoup 라이브러리를 사용해 HTML 코드에서 우리가 원하는 정보만 추출이 가능하다.

 

* BeautifulSoup 라이브러리 설치 방법 : https://2chaechae.tistory.com/51

 

[ 모각코+ 3일차 ] 설치 및 준비

[ 라이브러리 ] 라이브러리 : 필요한 기능을 수행할 수 있도록 준비된 함수와 메소드의 집합 정적 크롤링 라이브러리 [ requests ] http 요청을 쉽게 사용하기위해 만들어진 라이브러리 → 파이썬과

2chaechae.tistory.com

 

import requests # 라이브러리 불러오기

URL = '데이터를 받아오고 싶은 사이트'
raw = requests.get(URL) # get 함수 사용

print(raw) # 요청 성공 여부 출력
print(raw.text) # HTML 코드 출력


# 원하는 데이터 추출하기
target = '<div class="nums">'

if target in raw.text :
    idx = raw.text.index(target)
    print(raw.text[idx : idx + 100 ] ) # 100은 임의의 숫자( 원하는 HTML 태그까지 출력하기 )

 

target을 이용해서 데이터를 추출하는 방법은 데이터를 추출하는 것이 아니라 HTML 태그를 단순한 문자열 타입으로

처리해서 HTML을 텍스트로 출력했을 뿐이다. ( 문자열에서 target이 포함된 부분을 출력한 것임! )

 

하지만 BeautifulSoup 라이브러리는 문자열을 실제로 HTML 코드로 변환해준다.

 

 

BeautifulSoup 객체 생성하기

 

# BeautifulSoup 라이브러리 import

import bs4 

# BeautifulSoup 객체 생성

bs4.BeautifulSoup(" HTML 데이터 ", " 데이터 타입 " )

 

문자열 타입인 raw.text를 실제 HTML 코드로 변환해 주기 위해서는 bs4의 BeautifulSoup 클래스 사용

import requests
import bs4

URL = 'https://tv.naver.com/r'
raw = requests.get(URL)
# get 함수를 이용해서 URL의 내용 얻어오기

html = bs4.BeautifulSoup( raw.text, 'html.parser' )
# HTML 데이터로 raw.text를 데이터 타입은 HTML 이므로 html.parser 넣어주기
# 클래스의 객체를 생성하면서 문자열을 HTML로 변환

 

* type 함수를 사용해서 raw.text와 html의 데이터 타입을 확인해보면 서로 다름을 확인할 수 있음

 

 

find 함수

 

find 함수는 인자로 받은 태그와 선택자와 처음 일치하는 데이터를 리턴

target = html.find('div', {'class' : 'nums'})

print(target)

 

원하는 데이터 태그가 <div class="nums">이면

find 함수의 첫번째 인자로 태그로 두번째 인자로 선택자를 넣어 원하는 태그의 내용만 출력하기

 

# 태그만 사용하는 경우
html.find('div')

# 선택자만 사용하는 경우
html.find(id = 'something1')
html.find(attrs = {'id':'something1'})

# 태그와 선택자를 모두 사용하는 경우
html.find('div', {'id' : 'something1'})

 

 

fina_all 함수

 

find 함수가 태그와 선택자가 일치하는 가장 첫 태그만 받아왔다면

find_all 함수는 일치하는 모든 데이터를 리스트 형태로 리턴

 

target = html.find('div', {'class' : 'nums'})

all_targets = target.find_all("span", {'class' : 'something2'})

for at in all_targets :
	#print(at)
    print(at.text) # 태그에서 내용만 받아오기

 


[ 7일차 미션 ]


import requests
import bs4

URL = 'https://tv.naver.com/r'
raw = requests.get(URL)

html = bs4.BeautifulSoup( raw.text, 'html.parser')

target = html.find('div', { 'class' : 'top100' })
balls = target.find_all('dd', { 'class' : 'chn'})

print("< 최근 인기 영상 >")

index = 1
for ball in balls :
    print(index, ":", ball.text)
    index += 1

 

 

 

저작권 출처 : https://cafe.naver.com/codeuniv