본문 바로가기
Python

python - Flask를 이용한 API 만들기 (feat.naverAPI)

by le_piee 2020. 11. 1.

먼저 개발 환경입니다.

 

 

네이버 api 와 네이버 광고 api를 사용하였고 아래 링크에서 키 값을 받을 수 있습니다.

네이버 api : developers.naver.com/main/

 

NAVER Developers

네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음

developers.naver.com

네이버 광고 api : searchad.naver.com/my-screen

 

네이버 광고

 

searchad.naver.com

 

 

import flask
import json
from functools import wraps
from flask import request, Response
import requests
from bs4 import BeautifulSoup
import urllib.request
from powernad.API import RelKwdStat
import time
from random import uniform


#네이버 api 
Client_id = "your client id"
Client_Secret ="your client secret"

#네이버 광고 api
NAVER_AD_CUSTOMER_ID = "your customer id"
NAVER_AD_ACCESS_LICENSE ="your access license"
NAVER_AD_SECRET_KEY = "your secret key"

#네이버 블로그 api 요청 주소
NAVER_BLOG_API_URL="https://openapi.naver.com/v1/search/blog?query="
#네이버 쇼핑 api 요청 주소
NAVER_SHOP_API_URL="https://openapi.naver.com/v1/search/shop?query="
#네이버 광고 api 요청 주소
NAVER_AD_API_URL = "https://api.naver.com"

# 초당 몇회 이상일 경우 접근제한이 결려있기에 조절
LIMIT=10

app= flask.Flask(__name__)

#리턴값 변환 함수
def as_json(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        res = f(*args, **kwargs)
        res = json.dumps(res, ensure_ascii=False).encode('utf8')
        return Response(res, content_type='application/json; charset=utf-8')

    return decorated_function


#네이버 api 카운트 가져오기 함수
def getSearchCount(keyword,URL):
    encText = urllib.parse.quote(keyword) 
    url=URL + encText
    request = urllib.request.Request(url)
    request.add_header("X-Naver-Client-Id",Client_id)
    request.add_header("X-Naver-Client-Secret",Client_Secret)
    response = urllib.request.urlopen(request)
    rescode = response.getcode()
    response_body = response.read()
    jsonString = response_body.decode("utf-8")
    jsonDict =json.loads(jsonString)
    items = jsonDict['items']

    for item in items:
        title = item['title']
        link =item['link']
    if(rescode==200):
        totalCount = jsonDict["total"]
    else:
        totalCount = 0
    return totalCount

#naver api 가져오기 함수
def getSearchList(keyword,URL):
    searchList =[]
    encText = urllib.parse.quote(keyword) 
    url=URL + encText
    request = urllib.request.Request(url)
    request.add_header("X-Naver-Client-Id",Client_id)
    request.add_header("X-Naver-Client-Secret",Client_Secret)
    response = urllib.request.urlopen(request)
    rescode = response.getcode()
    response_body = response.read()
    jsonString = response_body.decode("utf-8")
    jsonDict =json.loads(jsonString)
    items = jsonDict['items']

    for item in items:
        title = item['title']
        link =item['link']
        searchList.append({'title':title,'link': link})
        print(searchList)
    
    return searchList

# naver api 블로그 글 가져오기
@app.route('/getBlogs', methods=['GET'])
@as_json
def getBlogs():
    if 'keyword' in request.args:
        keyword = str(request.args['keyword'])
    else:
        return "Error: keyword field was not provided. pleasw enter a keyword."
    
    return getSearchList(keyword,NAVER_BLOG_API_URL)

#naver api 쇼핑정보 가져오기
@app.route('/getShops', methods=['GET'])
@as_json
def getShops():
    if 'keyword' in request.args:
        keyword = str(request.args['keyword'])
    else:
        return "Error: keyword field was not provided. pleasw enter a keyword."
    
    return getSearchList(keyword,NAVER_SHOP_API_URL)
    

#naver api 탑10 가져오기
@app.route('/getPopularlists', methods=['GET'])
@as_json
def popularlist():
    NAVER_BEST100 = 'https://search.shopping.naver.com/best100v2/main.nhn'
    popular10lists =[]

    source = requests.get(NAVER_BEST100).text
    soup = BeautifulSoup(source,"html.parser")
    popular10 = soup.find(id="popular_srch_lst")
    popular10names = popular10.select(".txt")
    for name in popular10names:
        popular10lists.append({"name" : name.text})
        
    return popular10lists


#naver api  연관검색어,클릭 횟수 등 가져오기
@app.route('/relatedkeywords',methods=['GET'])
@as_json
def relatedkeywords():
    keywords =[]
    if 'keyword' in request.args:
        keyword = str(request.args['keyword'])
    else:
        return "Error: keyword field was not provided. pleasw enter a keyword."

    relKwdStat = RelKwdStat.RelKwdStat(NAVER_AD_API_URL, NAVER_AD_ACCESS_LICENSE,NAVER_AD_SECRET_KEY, NAVER_AD_CUSTOMER_ID)
    KWDataList = relKwdStat.get_rel_kwd_stat_list(None,hintKeywords=keyword,showDetail='1')
    for idx, outdata in enumerate(KWDataList):
        time.sleep(uniform(0.11,0.12)) #naver search api limit - daily 2500 max 10/sec
        relKeyword = outdata.relKeyword
        monthlyPcQcCnt = outdata.monthlyPcQcCnt
        monthlyMobileQcCnt = outdata.monthlyMobileQcCnt
        monthlyAvePcCtr = outdata.monthlyAvePcCtr
        monthlyAveMobileCtr = outdata.monthlyAveMobileCtr

        compIdx = outdata.compIdx

        blogsTotal = getSearchCount(relKeyword, NAVER_BLOG_API_URL)
        shopsTotal = getSearchCount(relKeyword, NAVER_SHOP_API_URL)

        if(str(monthlyPcQcCnt).isnumeric() and str(monthlyMobileQcCnt).isnumeric() and compIdx =="높음"):
            totalCnt =monthlyPcQcCnt + monthlyMobileQcCnt
            clickCnt = round(monthlyAvePcCtr + monthlyAveMobileCtr ,1)
            print(idx, relKeyword, totalCnt, clickCnt, blogsTotal, shopsTotal)
            keywords.append({'word':relKeyword, 'totalCnt':totalCnt,'clickCnt':clickCnt,'blogsTotal':blogsTotal})
            if(idx>=LIMIT):
                break
            
    return keywords

app.run()

 

 

 


결과 확인

 

블로그 정보 가져오기

쇼핑 정보 가져오기

 

탑10 가져오기

연관검색어 가져오기

'Python' 카테고리의 다른 글

python - from PIL import Image Error 에러 해결법  (1) 2020.11.13
python3- ubuntu에 apache2와 Flask 연동하기  (2) 2020.11.11
python - Flask  (0) 2020.11.01
python - flask API Type Error  (0) 2020.11.01
python - 네이버 쇼핑 web Scraping  (0) 2020.11.01