Inflearn brand logo image

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

Victor Choi님의 프로필 이미지
Victor Choi

작성한 질문수

남박사의 파이썬으로 봇 만들기 with ChatGPT

InlineQuery와 스마트폰 위치 정보를 활요한 주변 맛집 검색 봇 만들기

맛집 검색 네이버 api 403에러 나는데 현재 막혔나요?

작성

·

339

답변 3

2

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

import requests

header = {
    "referer": "https://map.naver.com/p/search/%EB%A7%9B%EC%A7%91"
}
url = "https://map.naver.com/p/api/search/allSearch?query=%EB%A7%9B%EC%A7%91&type=all&searchCoord=127.23607494606563%3B37.64831199999951&boundary="

r = requests.get(url, headers=header)
print(r.text)

위의 코드에서처럼 헤더값에 referer 값을 설정해서 넘기시면 문제 없이 동작하는것을 확인했습니다.  

referer 값은 현재 페이지를 접속할때 이전에 어떤페이지에서 넘어왔는지를 참조하는 값 입니다. 강좌를 진행할 때는 이 referer 값을 체크하지 않았는데 현재 체크하게 변경된것으로 보입니다. 그래서 브라우저에서 직접 새창열기를 통해 직접 접속하게 되면 이 referer 값을 설정할 수 없기 때문에 서버가 403 오류를 발생시키는건데,

image.png

위의 스샷처럼 postman 같은 웹테스트 툴에서 직접 referer 을 설정해서 테스트 해볼 수 있고,

 

image.png

크롬 개발자 도구에 Modheader라는 확장프로그램을 설치해서 referer값을 설정해서 페이지를 열어보는 방법으로도 테스트 해볼 수 있으니 참고 하시기 바랍니다.

안녕하세요, 관련하여 질문드립니다.

알려주신대로 postman에서 테스트를 해보았는데 503 error 페이지가 뜨더군요.

그새 또 바뀐걸까요?? 동일하게 세팅해서 해보았는데요..

 

image.png

 

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

글쎄요, 말씀하신대로 저도 방금 동일한 설정으로 POSTMAN 요청을 해봤습니다.

GET https://map.naver.com/p/api/smart-around/places?searchCoord=127.410467%3B37.494965&boundary=127.40741995661926%3B37.485660441766115%3B127.41372851222224%3B37.50409817352643&code=01&limit=20&sortType=RECOMMEND&timeCode=EVENING

GET 방식으로 위의 URL로 요청을 했습니다.

 

image.png

쿼리 파라메터는 그림에서처럼 URL에 묻어있는 값들이 전송되고 있습니다.

 

image.png

헤더값에 referer 값을 https://map.naver.com/p?c=15.00,0,0,0,dh 로 설정하고 다른것은 건드린거 없이 요청을 하면,

 

image.png

위의 그림에서처럼 문제없이 결과를 가져오는걸 확인했습니다.

 

import requests
import logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
logger = logging.getLogger(__name__)

def get_naver_around(lat, lon):
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
        "Accept-Language": "ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4",
        "referer": "https://map.naver.com/p?c=15.00,0,0,0,dh", # 추가된 내용
    }
    url = f"https://map.naver.com/p/api/smart-around/places?searchCoord={lat};{lon}&limit=20&sortType=RECOMMEND"
    print(f">>>>>>>>>>>>>>>> {url} <<<<<<<<<<<<<<<<<<<<<")
    logger.info(f">>>>> {url} <<<<<<<<")
    r = requests.get(url, headers=header)
    results = []
    data = r.json()
    items = data.get("result").get("list")
    for item in items:
        _rank = item.get("rank")
        _id = item.get("id")
        _name = item.get("name")
        _x = item.get("x")
        _y = item.get("y")
        _distance = item.get("distance")
        _categoryname = item.get("categoryName")
        _categorys = item.get("category")
        _category = ",".join(_categorys)
        _review_count = item.get("reviewCount")
        _address = item.get("address")
        _road_address = item.get("roadAddress")
        _tel = item.get("tel")
        images = item.get("images")
        _image = images[0] if len(images) > 0 else ""
        results.append({
            "rank": _rank,
            "id": _id,
            "name": _name,
            "x": _x,
            "y": _y,
            "distance": _distance,
            "categoryname": _categoryname,
            "category": _category,
            "review_count": _review_count,
            "address": _address,
            "road_address": _road_address,
            "tel": _tel,
            "image": _image,
            "description": item.get("description")
        })
    return results

if __name__ == "__main__":
    lat = 127.410467
    lon = 37.494965
    results = get_naver_around(lat, lon)
    for result in results:
        print(f"Name: {result['name']}, Address: {result['address']}, Tel: {result['tel']}, Category: {result['category']}")
        print(f"Image: {result['image']}")
        print("-" * 40)

또한 강의에서 사용된 코드를 다운로드 하고 get_naver_around 함수만 복붙하여 referer 값만 추가하고 다음과 같이 수정된 코드를 실행해보았습니다.

 

image.png

코드를 실행한 결과 문제없이 동작됨을 확인하였습니다. 참고로 해당 수정된 코드는 강의 수업노트에도 수정했습니다.

아~~ 그렇군요. 언급하신 referer가 결과에 영향이 있는 것을 확인하였습니다.

친절한 답변 정말 감사드립니다 : )

좋은하루 되세요~!!

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

넵! 해결되셨다니 다행입니다. 진형님께서도 더운데 더위 조심하시고 좋은 하루 되시길 바랍니다. 궁금하신 사항은 언제든 환영입니다.

0

Victor Choi님의 프로필 이미지
Victor Choi
질문자

주신 답변은 이해를 못하겠습니다.

여기 강의하시는 분이 답변 안해주시나요?

0

안녕하세요, 인프런 AI 인턴입니다.
Victor Choi님, 네이버 API 사용 중 403 에러가 발생한다면 이는 일반적으로 CSRF 보안 설정이나 API 사용 권한 제한으로 인한 문제일 수 있습니다.

403 Forbidden 에러는 서버가 요청을 이해했지만 권한 문제로 요청을 거부했음을 의미합니다. 네이버 API의 경우, 올바른 API 키를 사용했는지, 해당 API의 사용 조건이나 권한이 변경되지는 않았는지 확인하는 것이 좋습니다. 추가적으로 CSRF 보안이 관련이 있을 수 있으며, Spring Security 적용 환경에서는 CSRF 보호가 기본적으로 활성화되어 있어 POST, PUT, DELETE 요청 시 403 에러가 발생할 수 있습니다. 더욱 자세한 내용은 Spring Security Reference Guide를 참조하세요.

이 외에 API 요청 시 필요한 헤더나 요청 형식에 대한 문서 검토가 필요할 수도 있습니다. 네이버 측의 API 문서를 다시 한 번 확인해 보시고, 문제가 지속된다면 네이버 개발자 센터에 문의해 보시기 바랍니다.

Victor Choi님의 프로필 이미지
Victor Choi

작성한 질문수

질문하기