Python에서 검색엔진최적화의 가장 중요한 하나로 sitemap을 빼놓을 수 없습니다. 검색엔진의 크롤링이 sitemap을 기반으로 동작하기 때문입니다.

아래는 Python 앱을 사용하는 경우 jinja2를 사용한 템플릿의 sitemap.xml 페이지를 만들어보려고합니다. 아래에서는 Python 프레임워크 중 하나인 Flask를 사용하였습니다. 그럼 어떻게 만들고 동작하는지 아래에서 자세히 알아봅니다.


# Python sitemap.xml 만들기
앱을 만들기 이 전에 아래와 같은 단계로 구분할 수 있습니다.

- Python flask앱에 sitemap.xml 페이지 만들기
- sitemap.xml 내부에 jinja2를 사용하여 동적으로 코드 생성하기

그럼 flask 앱을 먼저 만들어 봅니다.


!  Python flask 앱 만들기
python의 flask를 사용하여 아래와 같이 코드를 작성하고 template 파일을 연결할 수 있습니다. 먼저 간단한 /sitemap.xml로 접근하는 경우 동작할 페이지 코드를 작성합니다.
@application.route('/sitemap.xml')
def web_sitemap():
  ...

flask의 라우팅을 사용하여 페이지를 생성했습니다. 이제 주소 /sitemap.xml을 사용하면 해당 페이지의 코드를 실행하게 됩니다.


MongoDB 리스트 불러와 템플릿에 사용하기
다음으로 데이터베이스와 연동하여 sitemap에 출력할 내용이 필요합니다. MongoDB인 경우 500개의 리스트를 출력하고자 아래와 같이 코드를 작성하였습니다.
@application.route('/sitemap.xml')
def web_sitemap():
  results = db.myCollection.find().sort([('created', -1)]).limit(500)
  items_list = []
  for result in results:
    items_list .append(result)

500개를 제한된 리스트 결과를 가져오기 위해 .limit()을 사용하였습니다. 불러온 커서 객체를 다시 리스트 타입으로 변환하기 위해 빈 리스트에 for문을 사용하여 추가했습니다. 추가로 json으로 변환하고 불러오기 위해서 import json과 toJson() 함수를 선언하여 사용하였습니다.
from flask import make_response
import json

def toJson(data):
  return json.dumps(data, default=json_util.default)


@application.route('/sitemap.xml')
def web_sitemap():
    results = db.myCollection.find().sort([('created', -1)]).limit(500)
    items_list = []
    for result in results:
      items_list.append(result)

    sitemap_xml = render_template('sitemap.html', myList=json.loads(toJson(items_list )))
    response = make_response(sitemap_xml)
    response.headers['Content-Type'] = 'application/xml; charset=utf-8'
    return response

앱에 필요한 코드는 모두 작성되었습니다. xml 포맷임을 header 정보에 추가하여 response를 함께 return하였습니다. 다음으로는 템플릿 파일의 코드 작성입니다.

@ sitemap.html
다음으로 사용할 템플릿 파일을 작성하도록합니다. xml 포맷이며 가장 간단한 포맷 중 하나로 작성되었습니다. 넘어온 값은 리스트에서 pathname과 created는 각각 페이지 주소와 생성일(발행일)을 sitemap에 사용하기 위해서 추가된 내용입니다.
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  {% if myList %}
    {% for item in myList %}
    <url>
      <loc>https://mySiteDomain.com/{{ item.pathname }}</loc>
      <lastmod>{{ item.created }}</lastmod>
    </url>
    {% endfor %}
  {% endif %}
</urlset>

여기까지 코드 작성이 모두 완료되었습니다. 이제 간단한 sitemap.xml을 사용할 수 있게되었습니다.


! 검색엔진에 sitemap.xml 연동하기
많은 검색엔진 사이트는 앱의 크롤링, SEO를 위해서 sitemap을 제출하도록 요구합니다. 사이트맵이 없더라도 검색엔진에 노출될 수는 있지만 반영되는 속도나 정보의 정확성 등을 위해서 반드시 사이트맵을 검색엔진에 제출하는 것이 효과적인 방법입니다. 웹마스터툴 등을 사용하여 만들어진 사이트맵을 제출하는 것이 방문자 트래픽을 높이는 큰 요인으로 작용할 수 있습니다.

관련링크 : 네이버 사이트맵 등록시 에러나는 경우 >
https://webisfree.com/2020-08-18/python앱에서-네이버-서치-어드바이저-sitemap-등록시-에러나는-경우