본문 바로가기
● 크롤링, 자동화/BeautifulSoup

[잔재미코딩] [복습] naver datalab

by 0ver-grow 2021. 2. 1.
반응형

크롤링할 URL과 기본 셋팅

import requests 
from bs4 import BeautifulSoup as bs
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
url = 'https://datalab.naver.com/keyword/realtimeList.naver?where=main'

res = requests.get(url,headers=headers)
soup = bs(res.content, 'html.parser')

크롤링 대상

위 대상을 find_all로 찾아보자

1순위부터 후순위 전부 div.item_box라는 동일한 태그에 존재한다.

반복되는 태그에 속해있기에 find_all을 적용한다.

mydata = soup.find_all('div','item_box')

 

find_all함수의 특징

find_all로 불러온 자료들은 get_text(), split() 적용이 안된다.

하지만 반복문을 통해 불러온 find_all 자료들은 find 사용 변수와 동일한 타입이 되므로 get_text(), split() 적용이 가능하다.

  • find_all 함수 타입 : bs4.element.ResultSet
  • find 함수 타입 : bs4.element.Tag
  • for 반복문 변환 타입 : bs4.element.Tag
    • 참고로 Nonetype은 반복문 적용이 불가하다.
  • split()을 쓰면 리스트형태로 변환
for item in mydata :
    print(item.get_text().split('\n'))

동일 대상을 find로 찾아보자

find를 적용하려면

먼저 각 순위하나하나가 아닌, 모든 순위들이 들어있는 객체,태그를 뽑아야한다.

find_data = soup.find('div','list_group')

그럼 이제 내부에 있는 각 순위들을 어떻게 뽑을 수 있을까?

먼저 find함수의 특징을 살펴보자

find함수의 특징

  • 이 타입에는 split(), get_text() 적용가능
  • 내부에 find_all함수 적용 가능

find함수를 적용한 mydata2에 find_all함수를 적용하자.

대상 태그는 다음과 같다.

 

우린 하단의 2가지 태그 중 li.ranking.item을 적용할 것이다.

그 이유는 추후 설명

mydata2 = find_data.find_all('li','ranking_item')

mydata2를 출력해서 형태를 보자

1,진달래,가수진달래 가 각태그(줄바꿈)별로 존재한다.

즉, 줄바꿈 \n을 통해 리스트를 만들도록 하자

반복문 적용하기

  • 여기서 추가할 조건들
  • 각 출력문들을 띄워주고
  • 빈칸을 없애주자
for item in mydata2 :
    new = item.get_text().split('\n') # 띄워쓰기를 기준으로 분류
    print(new[2]+"위 :",new[4], "\n관련 검색어 :", new[6].strip())

출력결과


find_all에서 li.ranking_item이 아닌 div.item_box를 적용했다면?

앞에서 find_all을 적용할 때

위가 아닌 밑의 태그를 선택했을 때, 반복문을 실행시키면 다음과 같은 오류가 발생한다.

 


연관검색어만 추출하기

 

앞서 배운것처럼

1. find함수적용

2. find_all함수적용으로 2중추출하기

를 적용해도 되고

find_all함수만 적용해도 나온다.

 

지금은 find_all함수만으로 뽑아보자

 

reldata = soup.find_all('span','item_title_sub')
for item in reldata : 
    print(item.get_text())

반응형