サイトマップを自動更新できるようにしてみる

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
XMLファイルで作られたサイトマップってのをサーバーに置くことがありますよね。

googleさんがサイトを巡回してインデックスしてくれるところの仕組みとか理屈みたいなものってのは僕はよく分かってないんですが、このサイトマップを置いておくと、googleさんは巡回しやすくなるみたいです。

まあ、ページが膨大で複雑に絡み合ってるようなサイトが巡回しにくいってのは、人間の僕でもイメージできますし、サイトマップがあった方が見やすいってのも想像はできます。

で、そのサイトマップXMLなんですが、新しいページを増やした時に自動で上書きされるようには当然なっていなくて、だから何もしなければ古いままの状態でサーバー上に放置されていることになりますよね。そうなると、ウェブサイトのリニューアルを繰り返しているうちに、場合によってはURLの構造なんかも大きく変わったりして、現在のページ情報とサイトマップの情報が大きく異なる場合も出て来ると思います。

別に古いままでもgoogleは巡回しに来てくれますし、サイトマップ上にない新しいページもそのうちインデックスはしてくれますけど、存在しないページなんかがサイトマップに残っていると、しかもそれがたくさんあったりすると、googleさんから注意を受けることがあります。404ページが多いですよ~的な感じで。あかつきのお宿も先日URLを一部変更したんですが、サイトマップが古いままだったので、googleさんからそんなようなことを言われました。googleのウェブマスターツールってのを使うとその辺の情報がよく分かります。

ってなわけで、サイトマップは常に最新になっている方が良い。

カーナビだって、新しくできた道路の情報がなかったりして、ナビ上は道でも何でもないところを走ったりすることがあるじゃないですか。んでもってしつこくルート変更のアナウンスとか出たりすることもあるじゃないですか。ちょっと煩わしいですよね。常に最新の情報がナビに入っていたら、そんなこともなくなる。

とは言え、例えばあかつきのお宿もそうですが、わりと頻繁にブログを更新するようなサイトは、それこそ頻繁にサイトマップを更新しなければならない。

サイトマップのXMLファイルは自分で一から書くこともできますし、自動作成のツールやサイトもいろいろあるのでそれを利用して作ることもできますが、いずれにしろ更新するには自分で手を動かさなければならないです。

でもその作業を日課にするのはだるいですよね。

そこで、クーロンを利用してサイトマップの更新を自動化してしまおうと、今回はそういう試みです。

前置きが微妙に長くなっちゃいましたが、さっそくやってみましょう。


あ、今回は前提として、さくらサーバーでやる場合の話ね。



必要なファイルをゲット、そしてアップ

まずはgoogleが提供していると思われる、サイトマップ生成ファイルを手に入れましょう。

こちらのサイトからzipファイルがダウンロードできるので、それをダウンロードして解答する。

いくつかファイルが入っているんですが、必要になるのは以下の二つのファイルです。

・example_config.xml
・sitemap_gen.py

この二つをサーバーにアップする。アップする場所はサイトマップを生成したい場所なので、まあドキュメントルートの直下が良いでしょう。

さくらサーバーだと『/home/アカウント/www』みたいな感じだと思います。

だからまあ、こんな感じ?

・www
  ・index.html
  ・config.xml
  ・sitemap_gen.py
  ・その他画像とかcssとか

今回は、example_config.xmlはconfig.xmlに名前を変えました。別に変えなくても良いです。

以下、config.xmlで話を進めます。



config.xmlを書き換える

config.xmlを開くと、何やらいろいろと書いてありますが、そのほとんどはただのコメントみたいですね。英語なんでよく分かりませんが、わりと丁寧に設定の説明が書いてあるみたいです。

これを書き換えていきましょう。

まずは34行目辺りに書いてあるこれ↓

<site
  base_url="http://www.example.com/"
  store_into="/var/www/docroot/sitemap.xml.gz"
  verbose="1"
  >

このbase_urlやらstore_intoやらを自分のサイト用に書き換えます。

<site
  base_url="http://norm-nois.com/"
  store_into="/home/アカウント/www/sitemap.xml.gz"
  verbose="1"
  >

あかつきのお宿だとこうなりますね。『アカウント』のところは自分のやつを書いて下さい。

次、60行目辺り。面倒なんで変更前と変更後をまとめてパパーッと書いちゃいます。

//変更前
<url  href="http://www.example.com/stats?q=name"  />
<url
   href="http://www.example.com/stats?q=age"
   lastmod="2004-11-14T01:00:00-07:00"
   changefreq="yearly"
   priority="0.3"
/>

//変更後
<url  href="http://norm-nois.com/"  />
<!--<url
   href="http://www.example.com/stats?q=age"
   lastmod="2004-11-14T01:00:00-07:00"
   changefreq="yearly"
   priority="0.3"
/>-->

二つ目の『lastmod』とか『changefreq』とかって書いてある方はコメントアウトしちゃって大丈夫です。たぶん、priorityの設定とか更新頻度の設定なんかをするのに必要な記述だと思うんですが、更新頻度に関してはクーロンの設定の方でやるんで、別にここはいらない。

じゃあ次。80行目辺り。

//変更前
<urllist  path="example_urllist.txt"  encoding="UTF-8"  />

//変更後
<!--<urllist  path="example_urllist.txt"  encoding="UTF-8"  />-->

これもコメントアウトしちゃいましょう。

別にわざわざ書くほどのこともなかったな……。

どんどん行きましょう。次は90行目辺りですね。

//変更前
<directory  path="/var/www/icons"    url="http://www.example.com/images/" />
<directory
   path="/var/www/docroot"
   url="http://www.example.com/"
   default_file="index.html"
/>

//変更後
<directory  path="/home/アカウント/www"    url="http://norm-nois.com/" />
<directory
   path="/home/アカウント/www"
   url="http://norm-nois.com/"
   default_file="index.php"
/>

ここではdefault_fileをindex.phpにしていますが、それはこのサイトがCakePHPで動いているからで、サイトのトップページのファイルがindex.htmlだったらここはindex.htmlのままで良いと思います。

さて、ここより下にもまだ『accesslog ~』とかの記述がありますが、ごっそりコメントアウトしちゃっても構いません。僕はそうした。

最後の方にある『filter action=”drop” type=”wildcard” pattern=”*~”』とかは、googleにインデックスされたくないようなページがある場合に必要な設定になるみたいですが、今のところうちにはそんなページがないので、ここは無視です。

もしここの設定が分からない場合は、申し訳ないけど例によってググレカスの魔法を使わせてもらいますわい。



サイトマップを作ってみる

ファイルの書き換えが終わったら、実際にスクリプトを実行してサイトマップを作成してみましょう。

まずはsshでサーバーに接続する。

どうやって接続するかは……うん、まあ、ごめんだけど、分からない人は調べてみてください。ここまでの時点ですでにかなり冗長な記事になっているというのに、例えばさらに「Tera Termを手に入れるところから~」みたいなことを言い出したら、もう金返せって言われても文句言えないレベルですからね。一円ももらってないのに返せって言われてしまうレベルですからね。

マックだったらターミナルってのを起動して、ちょちょいとコマンドを打てばすぐに接続できる。こんな感じで↓

$ ssh ××××@××××.sakura.ne.jp

Windowsでもコマンドプロンプトから同じ要領で接続できる……んだっけ?

サーバーに接続できたら、先ほどアップしたsitemap_gen.pyを実行してみる。

$ cd /home/アカウント/www
$ chmod 755 sitemap_gen.py
$ python sitemap_gen.py --config=config.xml

やっていることは単純明快で、sitemap_gen.pyに実行権限を与えて、実際にスクリプトを走らせているだけです。

.pyってのはpythonとかいうスクリプト言語のファイルみたいです。何かモンティ・パイソンにちなんでいるんだってさ。僕はPHP以外のプログラミング言語はほとんど知らないので、このpythonってやつも全然分からないですが、とりあえずこう書けば動くってのは分かった。

実行すると、実行結果が返って来ます。エラーが出ていなかったら成功。サーバーを見ると『sitemap.xml.gz』という圧縮ファイルができているはずです。出ていなかったら何かがおかしい。config.xmlの記述とかに誤りがあるのかもしれない。

この圧縮ファイル、解答しなくてもgoogleさんは見に来てくれるらしいので、そのまま置いとけばサイトマップとして機能するみたいです。



cronの設定

さあ、いよいよ自動化です。ほんと、ここに来るまでに無駄に長くなってしまったな……。

さくらサーバーでcronの設定をする方法は、コントロールパネルから設定をするか、sshで接続して直接書くかの方法があります。

まあ基本的にはコントロールパネルから設定するのが一般的なのですが、今はサイトマップを作るためにsshに接続した状態になっているので、そのままここでやっちゃいましょう。

$ crontab -e

これでクーロンを設定するファイルがviモードで開きますので、編集作業を行います。crontabとかviモードとかも、初めて聞くぜそんなのって方はごめんだけど他で調べてください。僕もあまり詳しくはない。

今回は、一日一回、日付がちょうど変わる深夜12時に更新のスクリプトを走るようにしてみましょう。

0 0 * * * /usr/local/bin/python /home/アカウント/www/sitemap_gen.py --config=/home/アカウント/www/config.xml

これで、毎日深夜12時にサイトマップが更新されます。お疲れ様でした。

コントロールパネルから設定する場合も『/usr/local~』ってのを書けばオッケーです。あとは時間を設定する。コントロールパネルの場合は月とか日ごとに入力欄が分かれているから(下の写真参照)分かりやすいですね。





ふーむ、こんなに長々と説明するつもりはなかったんだけど、気がついたらこんなになってしまった……。

説明が長くなるときってのはいくつか理由があって、一つはもちろん簡単には説明できないような内容を書くときですが、それ以外の理由としてよくあるのが、実は自分でもよく分かってないから、ってのがあるんですよね。

きちんと理解している人は、要点だけをまとめて簡潔に、かつ分かりやすく記述できると思うんですよ。

でも僕みたいに、分かってないけどとりあえずこうやれば出来るんだぜぇ? って程度の理解だと、どこまで説明すれば良いのかも分かっていないので、言ってみれば教科書の丸写しみたいな感じになっちゃうんですね。

ま、長くてつまらない文章は読まれにくいってのが通例ですが、そこをあえて長く書いちゃう辺りがワイルドだぜぇ?
 もしかしたら何か関連しているかも? 
 みんなからのコメント 
2013年10月20日 01:55:50
R
こんにちは~( ^^)
参考にサイトマップ更新を追加してみました。動かなかった部分があったので報告しておきますね~。

112~114行目の



これはでコメントアウトしたらエラーが出ませんでした。

125行目の

これは

のように変更したら動きました。

よくわからなかったのですが、一応動くようになったのでOKかと思います。こういう記事を書いていただいてありがとうございます。参考になります~( ^^)
2013年10月21日 11:41:09
まっち~(管理人)
>Rさん
報告ありがとうございまっす^^ そしてすみませんm(_ _)m
やっぱり、よく分からずにごっそりコメントアウトしちゃうと、こういうことになってしまうんですよね。気をつけます。

それから、HTMLのタグ形式の入力を許可してなかったせいか、コメントの一部が消えてしまいましたね……せっかくご報告いただいたのに、もうしわけないです。

112〜114行目は、サーバーで設定しているアクセスログファイルを見に行くかどうかの設定だと思うんですけど、僕はアクセスログを取ってなかったので、accesslogっていうファイルがサーバー上にないんですよね。なのでここは必要なかったのかなと。

125行目は、サイトマップのファイルが一つじゃない場合に、他のところにあるファイルのパスを記述する……みたいな感じでしょうか。一つしかなければコメントアウトしても動くとか、そういう感じなのかな。こっちはもうちょいちゃんと調べてみますね。
2018年10月19日 18:32:50
匿名
質問が長くなってしまったのでteratailで質問文をまとめさせていただきました。

https://teratail.com/questions/153043

こちらのサイトでのご回答でもよろしいのでご対応いただけますと幸いです!
2018年10月22日 16:29:56
まっち~(管理人)
返事が遅くなってすみません。teratailの方に回答しておきましたのでご確認ください。
2018年10月29日 15:50:15
匿名
詳しくご回答ありがとうございました!

無事動きました!

ちなみにgoogle search consoleへ登録するディレクトリーは”../sitemap.xml.gz”になるのでしょうか?
2018年10月29日 19:05:44
まっち~(管理人)
おお、そうですか。無事に動いて良かったです。

public_htmlの直下にsitemap.xml.gzがある場合だと、おそらく「https://example.com/sitemap.xml.gz」でアクセスできる状態になってると思うので、Search Consoleに登録するのは「sitemap.xml.gz」で良いと思います(.gzはなくても大丈夫かもしれませんが)
2018年11月03日 12:40:34
匿名
/sitemap.xml.gzを登録すると無事クローラーが動きました!
御指南いただきありがとうございました!
2018年11月03日 12:40:54
匿名
/sitemap.xml.gzを登録で大丈夫そうです!
御指南いただきありがとうございました!
2018年11月05日 10:12:03
まっち~(管理人)
いえいえ〜、こちらこそこの方法がまだ有効であると分かったので勉強になりました。ありがとうございます。