Sitemap生成プログラム python

新サイトが早くインデックスされる様にSitemap.xmlを作ってGoogleに送信した。

ページ数が膨大なのでpythonでプログラムを作って生成。

sitemap.xmlはページ数が膨大な場合は分割して、1ファイル当たり5万URL・50MB以下に抑えないといけない。(Google Help)

GFDBのsitemapは59ファイルになった。つまり290万ページ以上か…予想以上に多かった。

以下sitemap生成プログラム コード一部抜粋 python


def makeSitemapIndex(n):
    fp = open('sitemap-index.xml', 'w')
    fp.write('<?xml version="1.0" encoding="UTF-8"?>\n')
    fp.write('<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n')

    for i in range(1, n + 1):
        fp.write('    <sitemap>\n')
        fp.write('        <loc>http://gfdb.info/sitemap%s.xml</loc>\n' % i)
        fp.write('    </sitemap>\n')

    fp.write('</sitemapindex>\n')
    fp.close()

class Sitemap():
    def __init__(self):
        self.num = 1

    def open(self, limit=50000):
        self.count = 0
        self.limit = limit
        self.fp = open('sitemap%s.xml' % self.num, 'w')
        self.fp.write('<?xml version="1.0" encoding="UTF-8"?>\n')
        self.fp.write('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n')

    def close(self):
        self.fp.write('</urlset>\n')
        self.fp.close()

    def write(self, url, priority):
        #priority: 0.0 - 1.0(str)
        self.fp.write('    <url>\n')
        self.fp.write('        <loc>' + url + '</loc>\n')
        self.fp.write('        <priority>' + priority + '</priority>\n')
        self.fp.write('    </url>\n')

        self.count += 1
        if self.count == self.limit:
            self.num += 1
            self.close()
            self.open()

def dburl(f):
    return 'http://gfdb.info/' + f + '.html'

def makeSitemap():
    sm = Sitemap()
    sm.open()

    db = GFDB()

    #単発
    url = 'http://gfdb.info/'
    priority = '1.0'
    sm.write(url, priority)
    url = 'http://gfdb.info/index.html'
    priority = '1.0'
    sm.write(url, priority)
    url = 'http://gfdb.info/about.html'
    priority = '0.4'
    sm.write(url, priority)
    url = 'http://gfdb.info/sql.html'
    priority = '0.6'
    sm.write(url, priority)

    #個人ランキング(0.9)
    evts = db.getEvts()
    for evt in evts:
        for page in range(1, 11):
            url = dburl('user-ranking-%s-%s' % (evt, page))
            priority = '0.9'
            sm.write(url, priority)

    #部活ランキング(0.9)
    cevts = db.getClubEvts()
    for evt in evts:
        url = dburl('club-ranking-%s' % evt)
        priority = '0.9'
        sm.write(url, priority)

    #部活実績(0.8)
    clubs = db.getClubs().fetchall()
    for clubId, in clubs:
        url = dburl('club-%s' % clubId)
        priority = '0.8'
        sm.write(url, priority)

    #個人実績(0.7)
    users = db.getUsers().fetchall()
    for userId, in users:
        url = dburl('user-%s' % userId)
        priority = '0.7'
        sm.write(url, priority)

    #部活内個人ランキング(0.1)
    for clubId, in clubs:
        for evt in evts:
            url = dburl('user-ranking-%s-inclub-%s' % (evt, clubId))
            priority = '0.1'
            sm.write(url, priority)

    #部活名履歴(0.1)
    for clubId, in clubs:
        url = dburl('club-history-%s' % clubId)
        priority = '0.1'
        sm.write(url, priority)

    #部活旧部員一覧(0.2)
    for clubId, in clubs:
        url = dburl('club-old-members-%s' % clubId)
        priority = '0.1'
        sm.write(url, priority)

    #個人部活所属履歴(0.1)
    for userId, in users:
        url = dburl('user-history-%s' % userId)
        priority = '0.7'
        sm.write(url, priority)
    sm.close()

def main():
    makeSitemap()
    makeSitemapIndex(59)

if __name__ == '__main__':
    main()

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>