'''
ror.xmlとsitemap.xml生成スクリプト(pythonの練習)
== 2008-12-01 written by Einguste ==
== 2009-03-07 last update ==
== python-2.5.2 で動作確認しています ==
== ひっそり ==
'''

とりあえずWindows用バイナリだけ公開してみます。
Windows用バイナリ 7zip自己展開 3.77M

usage: ror_sitemap.py -d output_dir my_url

ror.xmlsitemap.xmlを生成するpythonスクリプトです。
サーバー上でスクリプトを使って生成できない場合のためのものです。
python初心者&プログラミング素人が書いたあまり綺麗じゃないスクリプトです。
いろいろと作法にのっとっていないところがありそうです。

2008-12-21: CVS版のurlgrabberを参考にしてHTTPSでもkeep-aliveするようにしました。
2008-12-23: keep-aliveが有効な場合、リクエストヘッダにAccept-Encoding: identityが余分に送られるのを抑制してみました。
2008-12-25: socketのtimeoutを10秒にしてみました。
2008-12-27: Accept-Encoding: identityの抑制方法を変更しました。
2008-02-18: sitemap.xml.gzも作成するようにしました。
2008-03-07: sitemap.xmlのpriorityの計算を変更しました。

From Accessibility to Zope ≫ Blog Archive ≫ Image spidering in PythonのSpider classを参考にしています。
出力するxmlは、Create your Google Sitemap Online - XML Sitemaps Generator で生成されるxmlを参考にしています。

利用しているライブラリ
☆sys、os、codecs
☆urllib2、httplib
☆urlgrabber、socket
☆lxml
☆StringIO、gzip、zlib
☆datetime、pytz
☆chardet
☆re
☆optparse
☆cgi、math
☆collections、gc
です。もしあったら
☆M2Crypto
☆BeautifulSoup
もつかいます。

titleタグ、metaタグのdescriptionとkeywordsを取得します。
数値文字参照と文字実体参照はそのまま残します。改行は空白に置き換えています。
トップページのURLをベースのURLとして、他サイトへのリンクをそれ以上は辿らないようにしています。
リダイレクトされた場合、リダイレクトされたURLのほうを利用します。

サーバーが返す、Last-Modifiedヘッダから更新日時を取得しています。
Last-ModifiedはタイムゾーンをGMT固定で判定して、GMT+0900に変更しています。
取得できない場合、Dateヘッダを使うようにしてみました。

トップページからのリンクの深さからsortOrder、priorityを決定しています。
priorityはトップページを1として、リンクが深いほど低くなるような計算にしてみました。

文字コードが一定でないケースのために、自動判定を試みます。
metaタグに指定がある場合には、それを利用します。
指定がない場合にはchardetを用いて判定しています。
判定に失敗した場合はスキップします。
decodeしているのは、euc_jis_2004などをそのまま取り込むと、utf-8で書き出す際に文字化けしたからです。
文字化けを最小限にするため、lxmlに取り込む前にunicodeに変換しています。
r'<\?xml .*?version="1.0" .*?\?>'を削除しているのは、unicodeに変換しているため、そのままだとlxmlに取り込めないからです。
decodeした結果lxmlに取り込めない場合には、decode前のデータをlxmlに取り込むように変更してみました。

urlgrabberはkeep-aliveのために使ってみました。
urlgrabberがない場合はkeep-aliveできません。

?が含まれるURLもスキップしないようにしました。
?の左側で既に訪れたかどうかを判断しています。

習作です。
いろいろなサイトの情報を参考にさせていただきました。
情報を公開してくださっている皆様に感謝します。


参考サイト
From Accessibility to Zope ≫ Blog Archive ≫ Image spidering in Python
Python でエンコーディングを判定する - 傀儡師の館.Python - 楽天ブログ(Blog)
lxmlメモ帳 - スコトプリゴニエフスク通信
life is short - you need Python!: Accept-Encoding 'gzip' to make your cralwer faster

Python practice Room
Top page

Valid HTML 4.01 Transitional 正当なCSSです!