[Django] sitemaps アプリケーションを使って sitemap.xml を google に送信する方法
2017-05-19 22:00
  • Django ネタです。
    sitemap.xml を Google さんに通知する方法をまとめました。
    crontab を設定して送信を自動化するところまでまとめています。

    前提

    以下の環境で運用されていること。
    Django 1.8 以上(1.8 も随分古くなった印象… 1.11 の時代ですしね…(´Д⊂グスン
    sitemap.xml の生成ができていること
    sitemaps が有効になっていること
    

    おさらい

    少しだけおさらい…

    sitemaps アプリとは、 Django の本体に入っているアプリケーションなので有効にするのは簡単です。

    INSTALLED_APPS = (
        ....
        'django.contrib.sites',
        'django.contrib.sitemaps',
    )
    

    基本的には INSTALLED_APPS に追加するだけですが、詳細は以前の記事を参照して頂ければと思います。

    Djangoでサイトマップを動的に生成する方法

    では本題に入ります。

    手動でサイトマップを Google に送信する方法

    手動で、っていうと Google Search Console からサイトマップを
    登録する方法が思い浮かぶかもしれませんが、ここではそれは扱いません。

    スクリプトを手動で叩く という意味です。笑
    django.contrib.sitemaps が有効になると、 manage.py のサブコマンドである ping_google が使えるようになります。
    ※サブコマンド一覧

    $ ./manage.py
    
    Type 'manage.py help <subcommand>' for help on a specific subcommand.
    
    Available subcommands:
    
    [auth]
        changepassword
        createsuperuser
    
    [django]
        check
        compilemessages
        createcachetable
        dbshell
        diffsettings
        dumpdata
        flush
        inspectdb
        loaddata
        makemessages
        makemigrations
        migrate
        runfcgi
        shell
        showmigrations
        sql
        sqlall
        sqlclear
        sqlcustom
        sqldropindexes
        sqlflush
        sqlindexes
        sqlmigrate
        sqlsequencereset
        squashmigrations
        startapp
        startproject
        syncdb
        test
        testserver
        validate
    
    [sessions]
        clearsessions
    
    [sitemaps]
        ping_google
    
    [staticfiles]
        collectstatic
        findstatic
        runserver
    

    ↓これですね。
    [sitemaps]
        ping_google
    

    サーバーに SSH ログイン等して以下を叩くだけで Google に ping が送信され、最新のサイトマップを通知できます。
    $ python manage.py ping_google /sitemap.xml
    

    ※引数にサイトマップのパスを指定するのを忘れないように。

    しばらくすると、 Google Search Console の方でサイトマップが送信されたことがわかると思います。

    サイトマップが更新された
    ※キャプチャは、2017年5月18日現在

    自動でサイトマップを Google に送信する方法

    いろいろ考えましたが、僕は上記コマンドを crontab に登録することで
    一定時間おきに自動でサイトマップを更新することにしました。

    通常の使い方であれば、管理画面から記事を保存(または公開)したタイミングをトリガーにして
    コマンドを叩けばいいのですが、僕の場合は記事のストックっていう姑息な手段を用いているため、
    しばしば未来記事を書いています。

    そのため、保存タイミングでは記事は公開されず、当然サイトマップも更新されません。
    公開日時(未来)をみて、最新があれば通知する…というスクリプトを書けばいいだけですが、
    ちょっと面倒だったので一定時間おきに自動通知…つまりは crontab を設定する…ということろに落ち着きました。

    crontab 設定する

    crontab を設定するにあたって、 python の PATH, ファイルの実行権限等、いくつかハマってしまいました。^^;

    うまく行った設定を以下に書いておきます。

    MAILTO=xxx@4to.pics
    
    # send ping to google every day for update sitemap.xml
    # ping_google.sh というシェルスクリプトを作成しました。
    1 22 * * * /full/path/to/script/ping_google.sh
    

    ping_google.sh
    #!/bin/bash
    cd /full/path/to/django/app
    /path/to/python manage.py ping_google /sitemap.xml
    
    echo 'Done batch'
    

    こんな感じですね。
    毎日 22:01 分に ping_google.sh が実行されるようになり、指定のメールアドレスに実行結果が送られてきます。

    参考: さくらのVPS で crontab を設定し、実行結果をメール送信する方法

    注意したいのは、 Django で使っている Python のバージョンが何かということです。
    僕の場合は、 Python 3.5.1 を pyenv を使ってインストールしていましたので、明示的にパスをしていする必要がありました。pyenv3.5.1 を指定したディレクトリに cd しても pyenv は参照されないっぽいです。なので、 OS 標準の 2.7 系の python が使われていてエラーで落ちてしまっていました。^^;

    参考: CentOS6環境にpyenv, mod_wsgi, apacheを入れ、djangoを動かしてみた記録

    以上です。(_ _;)

    人気ブログランキングへ ブログランキング・にほんブログ村へ
    ↑応援よろしくお願いします!m(_ _)m

  • 2017-05-19 22:00
  • Python
  • DjangoPythonGoogle Search ConsoleSitemapサイトマップ自動通知manage.pyping_googlecroncrontab自動通知
  • 新しい記事へ
    ブロガーさんにおすすめっぽい楽天カフェに来ました。

    古い記事へ
    楽天カードの期間限定ポイントの有効な使い方

profile picture

自己紹介的な何か

@wkmettyでついったーやってます。時々。 普段はなんちゃってプログラマやってます。海外から帰任してからは現場に戻って最前線でコード書いてます。 週末は気の向くままにプログラミングしたり、写真撮りに出かけたり、家でhuluみながらまったりしたりしています。(*´ω`*)モキュ