네이버·구글 검색 결과, 파이썬으로 자동 수집하는 가장 쉬운 방법
아침에 출근하면 제일 먼저 하는 일이 뭐예요? 저는 한동안 네이버랑 구글 검색창에 우리 회사 이름, 경쟁사 이름, 업계 키워드를 하나씩 쳐 넣는 거였어요.
"어제 무슨 기사 나온 거 없나" 확인하려고요.
키워드가 하나면 괜찮은데, 이게 대여섯 개씩 되면 매일 아침 그것만 십 분씩 잡아먹거든요. 새 기사 몇 개 있는지 눈으로 훑고, 링크 복사해서 엑셀에 붙여넣고. 이거 며칠 하다 보면 "이걸 파이썬으로 자동화하면 딱인데" 싶어지잖아요.
맞아요. 이번 편이 바로 그거예요.
크롤링 열심히 배웠는데, 검색엔진은 크롤링하지 마세요
[Python] 16. 크롤링 기초 - requests와 BeautifulSoup으로 웹 데이터 자동 수집하기
파이썬 크롤링 기초 - requests와 BeautifulSoup으로 웹 데이터 자동 수집하기매일 아침 경쟁사 사이트 들어가서 가격 확인하고 엑셀에 복붙하고, 공고 페이지 새로고침하면서 새 글 올라왔나 보고.하
devsalix.tistory.com
[Python] 17. requests로 안 되던 사이트, 파이썬 Selenium으로 긁어보기
requests로 안 되던 사이트, 파이썬 Selenium으로 긁어보기지난 편에서 이런 이야기로 마무리했던 거 기억하시나요. 분명 브라우저 화면에는 목록이 쭉 떠 있는데, 코드로 긁으면 텅 빈 리스트만 돌
devsalix.tistory.com
여기서 좀 김이 빠지는 얘기를 먼저 해야겠어요.
지난 두 편에서 우리 크롤링 엄청 열심히 배웠잖아요. 16에서 requests랑 BeautifulSoup으로 정적인 페이지 긁는 법, 17에서 Selenium으로 자바스크립트 페이지까지 다루는 법. 그거 배웠으니까 이번엔 "네이버 검색 결과를 크롤링해보자!" 할 것 같죠.
근데 아니에요. 네이버랑 구글 같은 큰 검색엔진은 크롤링 안 하는 게 정답이에요.
"어? 그럼 지금까지 배운 게 헛거였나?" 싶으시죠. 전혀 아니에요. 비유를 하나 들어볼게요.
크롤링은 담을 넘어 벽에 붙은 안내문을 눈으로 읽고 손으로 베껴 적는 것과 비슷해요. 정문이 없는 곳에서는 이 방법밖에 없어요. 근데 경비원(봇 감지)한테 걸리면 쫓겨나고(차단), 안내문 위치가 바뀌면(사이트 디자인 변경) 또 헤매야 하죠.
반면에 API는 정문으로 들어가서 안내데스크에 "이 주제 자료 주세요" 하면 목록으로 깔끔하게 정리해서 건네받는 것이에요. 빠르고, 정확하고, 눈치 볼 것도 없어요.
네이버는 이 정문이 활짝 열려 있어요. 그것도 공짜로요. 그래서 크롤링 기술은 정문(API)이 없는 중소 사이트에 쓰는 무기로 아껴두고, 네이버처럼 정문이 열려 있는 곳은 그냥 정문으로 들어가는 게 백배 편해요.
웃긴 건, API가 크롤링보다 오히려 더 쉬워요.
네이버 검색 API 신청하기
정문으로 들어가려면 회원증이 필요하겠죠. 그게 바로 API 키예요.
발급 과정이 막막하게 느껴지실 수 있는데, 사실 8편에서 이미 비슷한 걸 해보셨어요. 구글 시트 다룰 때 인증키 발급받았던 거 기억나세요? 그거랑 거의 똑같아요. 세 단계면 끝나요.
- 네이버 개발자센터(developers.naver.com)에 로그인하고 "애플리케이션 등록"을 눌러요.
- 앱 이름 대충 짓고, 사용할 API로 "검색"을 골라요.
- 등록하면 Client ID랑 Client Secret 두 개가 딱 나와요. 이 둘을 복사해두면 끝.
이 Client ID랑 Secret은 그냥 아이디/비밀번호 한 쌍이라고 생각하면 돼요. 둘 다 있어야 문이 열려요. 특히 Secret은 남한테 보이면 안 되니까, 나중에 코드 인터넷에 올릴 때 이 부분은 지우고 올리세요.
NAVER Developers
네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음
developers.naver.com
검색 결과 수집: API로 뉴스 가져오기
키 두 개 준비됐으면 이제 코드 몇 줄이면 돼요. 진짜예요.
import requests # 인터넷 요청 라이브러리 (16편에서 배운 그거예요)
client_id = "발급받은_Client_ID" # 개발자센터에서 복사한 값
client_secret = "발급받은_Client_Secret"
url = "https://openapi.naver.com/v1/search/news.json" # 뉴스 검색 주소
headers = { # 신분증(인증키)을 헤더에 담아요
"X-Naver-Client-Id": client_id,
"X-Naver-Client-Secret": client_secret,
}
params = {"query": "파이썬", "display": 10} # 검색어와 가져올 개수
res = requests.get(url, headers=headers, params=params) # 요청 보내기
data = res.json() # 결과를 딕셔너리로 변환
print(data["items"][0]) # 첫 번째 결과 하나만 찍어서 구조 확인
# 실행 결과 (일부):
# {'title': '<b>파이썬</b> 입문 강좌 인기', 'link': 'https://...', 'pubDate': 'Wed, 30 Jul 2025 ...'}
여기서 headers에 넣은 두 줄이 바로 회원증이에요. 헤더 이름은 정확히 X-Naver-Client-Id, X-Naver-Client-Secret으로 써야 해요. 오타 나면 문 안 열려요.
그리고 하나 짚고 갈게요. 크롤링이면 여기서 BeautifulSoup으로 HTML을 이 잡듯 뒤져야 했잖아요. 근데 API는 res.json() 이 한 줄이면 결과가 파이썬 딕셔너리로 딱 정리돼서 와요. 이래서 정문이 편하다는 거예요.
JSON에서 필요한 것만 뽑기
data["items"] 안에 검색 결과가 목록으로 들어 있어요. JSON이 뭔지 잘 모르셔도 괜찮아요. 그냥 파이썬 딕셔너리랑 똑같이 생긴 데이터 상자라고 보면 돼요. 대괄호로 하나씩 꺼내면 되거든요.
for item in data["items"]: # 결과 목록을 하나씩 꺼내요
title = item["title"].replace("<b>", "").replace("</b>", "") # 강조 태그 제거
link = item["link"] # 기사 링크
date = item["pubDate"] # 작성 날짜
print(title, "|", link, "|", date) # 보기 좋게 출력
# 실행 결과:
# 파이썬 입문 강좌 인기 | https://... | Wed, 30 Jul 2025 ...
# 파이썬으로 업무 자동화 | https://... | Wed, 30 Jul 2025 ...
제목에 <b> 같은 게 섞여 나와서 "이거 에러인가?" 하실 수 있는데, 아니에요. 검색어를 굵게 강조하려고 붙는 HTML 태그예요. 위에서처럼 .replace()로 지워주면 깔끔해져요.
결과를 엑셀로 저장하기
이제 이걸 화면에만 찍지 말고 엑셀로 남겨볼게요. 5편에서 openpyxl로 엑셀 다뤄봤으니 그대로 재활용이에요.
import openpyxl # 엑셀 라이브러리 (5편에서 배웠어요)
wb = openpyxl.Workbook() # 새 엑셀 파일 만들기
ws = wb.active
ws.append(["제목", "링크", "날짜"]) # 첫 줄에 머리글
for item in data["items"]:
title = item["title"].replace("<b>", "").replace("</b>", "")
ws.append([title, item["link"], item["pubDate"]]) # 한 줄씩 추가
wb.save("검색결과.xlsx") # 저장 완료
이거 돌리고 폴더 열어보면 검색결과.xlsx가 딱 생겨 있어요. 열어보면 제목, 링크, 날짜가 표로 정리돼 있고요.
키워드 여러 개를 한 번에
자, 처음 얘기로 돌아가볼게요. 매일 아침 키워드 대여섯 개를 손으로 검색하던 그 반복 노동. 이제 반복문 하나로 끝내요.
import time # 잠깐 쉬는 기능을 쓰려고
keywords = ["우리회사", "경쟁사", "업계 뉴스"] # 매일 확인하는 키워드들
ws.append(["키워드", "제목", "링크", "날짜"]) # 키워드 열도 추가
for kw in keywords: # 키워드마다 반복
params = {"query": kw, "display": 5}
res = requests.get(url, headers=headers, params=params)
for item in res.json()["items"]:
title = item["title"].replace("<b>", "").replace("</b>", "")
ws.append([kw, title, item["link"], item["pubDate"]]) # 키워드도 같이 기록
time.sleep(0.3) # 예의상 잠깐 쉬기 (한도 보호)
wb.save("키워드_모니터링.xlsx")
이거 하나면 아침마다 십 분씩 하던 걸 코드 한 번으로 끝내요. 키워드는 리스트에 계속 추가만 하면 되고요.
그럼 구글은요?
제목에 구글도 있으니 잠깐 짚고 갈게요.
구글은 네이버처럼 간단한 무료 검색 API가 없어요. Custom Search JSON API라는 게 있긴 한데, API 키뿐 아니라 "검색엔진 ID"라는 것도 따로 만들어야 하고, 무료는 하루 100건까지예요. 구글 검색 자동화가 필요하면 이 방법을 쓰긴 하는데, 네이버보다 확실히 번거로워요.
그래서 처음 시작하시는 거라면 네이버 검색 API로 흐름부터 익히시는 걸 권해요. 원리는 똑같으니까 나중에 구글로 넘어가도 금방 적응하실 거예요.
Search engine APIs
Explore all of our search engine APIs for real-time search data
serpapi.com
정 크롤링을 해야 한다면 (그리고 왜 안 되는지)
"그래도 API 없는 사이트는 크롤링해야 하잖아요?" 맞아요. 그럴 땐 16편, 17편에서 배운 그대로예요. requests.get("검색 URL")로 받아서 BeautifulSoup으로 파싱하고, 자바스크립트로 늦게 뜨는 내용이면 Selenium을 쓰고요.
근데 네이버·구글 검색 페이지를 이렇게 직접 긁으면 어떻게 되는지 미리 말씀드릴게요.
조금만 자주 요청해도 "로봇이 아닙니다" 확인 화면, 그러니까 캡차가 떠요. 담을 자꾸 기웃거리니까 경비원이 나와서 "신호등 사진 다 골라봐" 하고 검문하는 거죠. 이게 뜨면 "아, 나 봇으로 찍혔구나" 신호예요.
이때 이걸 뚫으려고 애쓰지 마세요. 물러서서 정문(API)으로 가는 게 정답이에요. 봇 감지 우회는 약관상으로도 문제고 난이도도 확 올라가서, 입문 단계에서 손댈 영역이 아니에요.
자주 만나는 에러
처음에 이 두 개는 꼭 한 번씩 만나시더라고요.
401 Unauthorized — 인증 실패예요. Client ID나 Secret이 틀렸거나, 헤더 이름을 잘못 쓴 거예요. 발급값을 다시 복사하되 앞뒤에 공백 안 붙었는지 확인하고, 헤더 이름 철자 다시 보세요.
429 Too Many Requests — 너무 자주 요청해서 하루 한도를 넘었다는 뜻이에요. 참고로 네이버 검색 API는 하루 25,000건까지라 개인 학습용으론 차고 넘치는데, 반복문에서 실수로 같은 요청을 계속 돌리면 금방 차요. 위에서처럼 time.sleep으로 간격을 두면 훨씬 안전해요.
그리고 팁 하나. 결과가 이상하면 무조건 print(res.json())로 응답을 통째로 한 번 찍어보세요. 어떤 키가 들어 있는지 눈으로 보고 시작하면 헤맬 일이 확 줄어요.
직접 해보기
한 번 손으로 해보셔야 진짜 남아요.
- 초급: 관심 키워드 하나로 뉴스 10건을 검색해서 제목만 화면에 출력해보세요.
- 중급: 그 결과를 제목·링크·날짜로 엑셀에 저장해보세요.
- 도전: 관심 키워드 3개를 한 번에 돌려서 한 엑셀 파일에 정리해보세요.
힌트를 하나 드리면, 검색 주소의 news.json을 blog.json으로 바꾸면 블로그도 검색돼요. 쇼핑, 지식iN도 같은 방식이에요. 하다가 막히면 댓글로 남겨주세요.
이제 검색 결과가 엑셀에 착착 쌓이죠. 근데 매번 엑셀 열어서 확인하는 것도 은근 귀찮잖아요. 다음 편에서는 이렇게 모은 정보를 슬랙이나 카카오톡으로 알아서 쏴주는 알림 봇을 만들 거예요. 매일 아침 우리 회사랑 경쟁사 뉴스가 슬랙에 딱 와 있는 그림, 꽤 괜찮지 않아요?
제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀
'Application > Python' 카테고리의 다른 글
| [Python] 20. 파이썬 뉴스 봇 만들기 - 매일 아침 관심 뉴스 요약 메일 받기 (1) | 2026.08.03 |
|---|---|
| [Python] 19. 파이썬 알림 봇 만들기 - 슬랙과 카카오톡으로 실시간 알림 받기 (1) | 2026.07.31 |
| [Python] 17. requests로 안 되던 사이트, 파이썬 Selenium으로 긁어보기 (0) | 2026.07.27 |
| [Python] 16. 크롤링 기초 - requests와 BeautifulSoup으로 웹 데이터 자동 수집하기 (0) | 2026.07.24 |
| [Python] 15. 파이썬으로 양식 일괄 발송 시스템 만들기 (엑셀 명단 → 개인 문서 → 자동 메일) (0) | 2026.07.22 |