인프런 커뮤니티 질문&답변

안승호님의 프로필 이미지
안승호

작성한 질문수

남박사의 파이썬 기초부터 실전 100% 활용

[삭제예정] 네이버 실시간 검색어 크롤링 하기

네이버 검색 순위 크롤링 관련

해결된 질문

작성

·

686

4

lists의 사이즈가 0입니다.

제가 혹시 간과한 부분이 있는지 여쭙습니다.

참고로 status code는 200, bs 변수에도 정상적으로 값이 할당되는듯합니다.

감사합니다.

import requests
from bs4 import BeautifulSoup
r = requests.get('https://www.naver.com')
bs = BeautifulSoup(r.text, 'html.parser')
lists = bs.find_all('li',{'class':'ah_item'})
for li in lists:
    print(li)
    lis = li.find('span',{"class":'ah_k'})  #find만 할경우
    for sa in lis:
        print(sa)

답변 4

9

남박사님의 프로필 이미지
남박사
지식공유자

작성하신 코드는 아무 문제 없습니다. 다만 2020년 1월 17일 부로 네이버 실시간 검색어가 기존의 임베딩 방식에서 ajax 통신 방식으로 변경된거 같습니다. 실제 개발자도구로 확인했을때 기존과 같이 li 태그에 ah_item 클래스명으로 표기는 되나 이전에는 해당 데이터가 html 에 직접 뿌려주는 방식이였다면 현재는 해당 실시간 순위 데이터를 ajax 통신으로 가져온 뒤에 자바스크립트로 li.ah_item 클래스 형태로 만들어주고 있습니다.

따라서 기존의 코드로는 해당 데이터를 추출 할 수 없게 되었습니다. 원래 크롤링이라는게 페이지 코드가 바뀌면 크롤링 코드도 변경되야 하는 문제라서 강좌는 BeautifulSoup 을 어떻게 쓰고 어떻게 분석을 하는지에 초점을 맞춘거라 그대로 두고 ajax 형태로 가져오는 실시간 검색 결과를 확인은 해야 하기에 수정된 코드를 첨부 합니다.

import requests
from bs4 import BeautifulSoup

# 아래 주소가 메인페이지 내부에서 호출되는 실시간 검색어 데이터를 넘겨주는 주소
# requests.get("주소").json() 을 하면 데이터를 json 형태로 받아올 수 있습니다.
# 아래 주소를 직접 브라우저에서 접속해보시기 바랍니다.
json = requests.get('https://www.naver.com/srchrank?frm=main').json()

# json 데이터에서 "data" 항목의 값을 추출
ranks = json.get("data")

# 해당 값은 리스트 형태로 제공되기에 리스트만큼 반복
for r in ranks:
    # 각 데이터는 rank, keyword, keyword_synomyms
    rank = r.get("rank")
    keyword = r.get("keyword")
    print(rank, keyword)

3

저도 남박사님 강의 듣고 네이버 실시간  검색어 크롤링 중 잘 되지 않아 문의를 남기려던 찰나에 윗분이 남긴 문의글 보았습니다. 궁금한 것은 크롬 개발자 도구를 확인하고 네이버와 같이 통신 방식으로 정보를 가져오는 것인지 판단하는 방법과 만약 통신 방식이라하면 답변 달아주신 것과 같은 주소('https://www.naver.com/srchrank?frm=main')를 어떻게 찾아낼 수 있는지 입니다.

답변 부탁드립니다. 

감사합니다!!

0

남박사님의 프로필 이미지
남박사
지식공유자

승호님 덕분에 저도 네이버 페이지에 변경이 있는지 알게 되었습니다. 감사합니다. 😀

0

안승호님의 프로필 이미지
안승호
질문자

빠른 답변 감사합니다. 덕분에 궁금한것이 해결되었습니다. 좋은 강의 고맙습니다.

안승호님의 프로필 이미지
안승호

작성한 질문수

질문하기