본문 바로가기
Personal Project

연관검색어,해시태그 서비스 구현 [Django로 개발 git, Heroku로 배포]

by applepick 2020. 12. 12.
반응형

간단하게 키워드를 입력하면 연관검색어와 연관 해시태그를 찾아주는 웹서비스를 구현해보고싶었다. 키워드에 대한 연관검색어, 해시태그를 데이터베이스에 저장한 뒤 엑셀파일로 저장해보고 싶었다. 회사에서 간단하게 서브프로젝트로 해보라고하였다. 기술은 django로 구현하였고 배포는 heroku로 하였다. 

밑에는 배포완성된 링크다. 한 번 사용해보면 좋겠다. 아직 정확성이 없지만 심심풀이로 해보면 재미있을 것 같다.

jsmkeyword.herokuapp.com/

 

https://jsmkeyword.herokuapp.com/

 

jsmkeyword.herokuapp.com


├── feeds
│   ├── __pycache__
│   ├── migrations
│   │   └── __pycache__
│   └── templates
└── project
    └── __pycache__

파일의 디렉토리의 구성은 이런식으로 잡아주었다. feeds가 전반적인 연관검색어 로직을 가지고있다. 

 

대략적인 대표 코드들만 설명해보겠다. 

#/feeds/views.py
from django.shortcuts import render,get_object_or_404
import requests
from bs4 import BeautifulSoup 
from selenium.webdriver.common.keys import Keys
from django.views.decorators.csrf import csrf_exempt
from .models import KeywordModel
from django.http import HttpResponseNotFound, Http404

@csrf_exempt #CSRF token missing or incorrect오류 해결
def home(request):
    return render(request, 'main.html')

@csrf_exempt #CSRF token missing or incorrect오류 해결
def result(request):
    try:
        keywordmodel = KeywordModel()
        if request.method == "POST":
            keyword = request.POST['Keyword']
        url = 'https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query={}'.format(keyword)
        req = requests.get(url)
        html = req.text
        soup = BeautifulSoup(html, 'html.parser')

        keywordarray = soup.select('div[class="tit"]')
        tag = soup.select('.total_tag_area span[class*=txt]')  
        notkeyword = "For you 함께 클릭한 상품 추천"
        keyword_list = {}
        tag_list ={}
        tag_overlap_list_keyword =[]

        for i in range(len(keywordarray)):
            if(notkeyword !=keywordarray[i].text.strip()):
                keyword_list[i] = keywordarray[i].text.strip()

        for i in range(len(tag)):
            tag_overlap_list_keyword.append(tag[i].text.strip())
        
        tag_list = tuple(set(tag_overlap_list_keyword))

        if not keyword_list:  
            print("저장 x")
            if not tag_list:
                print("테그저장 x")
            else:
                keywordmodel.keyword = keyword
                keywordmodel.tag_list = tag_list
                keywordmodel.save()
        else :
            keywordmodel.keyword = keyword
            keywordmodel.keyword_list = keyword_list
            if not tag_list:
                print("테그저장 x")
            else:
                keywordmodel.tag_list = tag_list
            keywordmodel.save()
    except:
        return HttpResponseNotFound("키워드를 입력하세요.")

    return render(request, 'result.html',{'keyword_list':keyword_list.items(),'keyword':keyword,'tag_list':tag_list})

def stock(reqeust):
    return render(reqeust, 'stock.html')

이런식으로 폼에서 사용자가 키워드를 입력받으면 그 값으로 키워드를 찾아주는 것이다. 네이버에서 연관검색어, 연관 해시태그를 받아온다. 여기서 튜플과 리스트를 사용했다. 리스트를 통해서 append로 값을 추가해주고, 그 값들을  튜플에다가 넣어주었다. 그리고 튜플을 비교해 만약 연관검색어가 없을 시 데이터베이스에 저장하지 않는다. 만약 사용자가 연관검색어가 없을경우에는 연관검색어가 없다고 창을 띄어준다. 이 부분은 밑에 설명하겠다. 가끔 연관 검색어를 가져올 때  "For you 함께 클릭한 상품 추천"가 뜨는 부분이 있다. 이 부분을 삭제하고 싶어 if문으로 문자열을 비교해 삭제했다. 하나하나 비교해야하기때문에 비효율 적이지만 이 부분은 다시 한 번 생각해봐야겠다.


 모델은 

from django.db import models

class KeywordModel(models.Model):
    keyword = models.CharField(max_length=100)
    keyword_list = models.CharField(max_length=400)

    def __str__(self):
        return "%s - %s" % (self.keyword, self.keyword_list)

이렇게 키워드와 연관검색어를 저장할 수 있도록 구성하였다. 이제 이 값들을 admin에서 저장해보고싶었다. 그러기위해서는 

 

pip3 install django-import-export

를 사용해주었다. 저것을 받아준 다음 setting.py에서

INSTALLED_APPS = [
	#나머지값들
    'import_export',
]

이렇게 선언해줘야한다.

 

admin.py에서는

from django.contrib import admin
from .models import KeywordModel
from import_export.admin import ExportActionModelAdmin, ImportExportMixin, ImportMixin

class KeywordAdmin(ImportExportMixin, admin.ModelAdmin):
    pass

admin.site.register(KeywordModel,KeywordAdmin)

이런식으로 구성해주면 admin페이지에서 데이터베이스를 엑셀파일로 저장할 수 있다.

admin 페이지에서 export버튼이 생겼다. 저기서 엑셀파일을 다운받을 수 있다.


마지막으로 연관검색어가 없다면 사용자에게 띄워주는 부분만 보여주겠다.

 

  #project/feeds/templates/result.html
  
  {% for num, word in keyword_list%}
    <span class="badge bg-light text-dark" style="font-size:1rem;">{{word}}</span>&nbsp&nbsp
    {% endfor %}<br><br>
    {% if not keyword_list %}
    <span class="badge bg-light text-dark" style="font-size:1rem; ">연관검색어가없네요 ㅠㅠ</span><br><br>
        
    {% endif %}

view.py에서 keyword_list를 가져왔다. 그러면 그 값을 for문과 if문을 통해 값을 출력해준다. 만약없다면 연관검색어가없네요 ㅠㅠ를 출력해준다.  이렇게 간단하게 설계부터 배포까지 혼자 해보았다. 그전에도 aws, 네이버클라우드를 사용해서 배포해보았지만, 헤로쿠가 가장 쉬웠던 것 같다.

 

완성된 페이지다! 

키워드를 입력하면

이런 식으로 구현해보았다. 완성된 코드의 깃허브는

 

github.com/sungmin69355/keyword

 

sungmin69355/keyword

Contribute to sungmin69355/keyword development by creating an account on GitHub.

github.com

여기에 있다. 상업적으로 사용하는 것이 아니니 공부하다가 참고가 되었으면 좋겠다! 끝!

 

반응형

댓글