간단하게 키워드를 입력하면 연관검색어와 연관 해시태그를 찾아주는 웹서비스를 구현해보고싶었다. 키워드에 대한 연관검색어, 해시태그를 데이터베이스에 저장한 뒤 엑셀파일로 저장해보고 싶었다. 회사에서 간단하게 서브프로젝트로 해보라고하였다. 기술은 django로 구현하였고 배포는 heroku로 하였다.
밑에는 배포완성된 링크다. 한 번 사용해보면 좋겠다. 아직 정확성이 없지만 심심풀이로 해보면 재미있을 것 같다.
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>  
{% 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
여기에 있다. 상업적으로 사용하는 것이 아니니 공부하다가 참고가 되었으면 좋겠다! 끝!
'Personal Project' 카테고리의 다른 글
나의 다이어리 서비스 구현 (1) | 2021.01.14 |
---|---|
[Linux] screen 사용법 (0) | 2020.10.23 |
django로 크롤링해서 적용하기 +BeautifulSoup사용 (3) | 2020.09.24 |
django 글 줄바꿈 해주기 (1) | 2020.09.14 |
django Paginator 사용하기. 페이징 기법, 페이지 나누기 (0) | 2020.09.10 |
댓글