📗

sitemap.xml からSEO(TDKh1)の調査をするための簡単なスクレイピング

2022/05/11に公開

はじめまして!アキ@IT業界の歩き方です。
株式会社アスターリンクに在籍し、ITエンジニアやSEO担当をしています。

先日、sitemap.xmlから記事一覧を取得する記事をQiitaに寄稿しました。

WordPressのsitemap.xmlではプラグイン「Google XML Sitemaps」を利用することが多いのですが、そうするとsitemap.xmlの中でさらにsitemap.xmlを指定されてしまうケースがあります。

https
<sitemapindex xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/siteindex.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">	<sitemap>
		<loc>https://www.shigoto-web.co.jp/tensyoku/sitemap-misc.xml</loc>
		<lastmod>2022-04-28T06:53:58+00:00</lastmod>
	</sitemap>
	<sitemap>
		<loc>https://www.shigoto-web.co.jp/tensyoku/sitemap-pt-post-2022-04.xml</loc>
		<lastmod>2022-04-28T05:58:46+00:00</lastmod>
	</sitemap>
	<sitemap>
		<loc>https://www.shigoto-web.co.jp/tensyoku/sitemap-pt-post-2022-03.xml</loc>
		<lastmod>2022-04-27T04:15:25+00:00</lastmod>
	</sitemap>
(省略)

そのような場合にスクレイピングして記事一覧を取得するコードを紹介していますので、同じ悩みの方はぜひ参考にしてください。

今回は、この記事一覧を取得するコードを利用してtitleタグやmeta keywordsなどのSEO対策情報も取得してみたいと思います。

この記事ではTDKh1と呼ばれる情報を取得していきます。

TDKh1とは?

TDKh1とは、下記の略となります。

  • T:titleタグ
  • D:metaタグのdescription
  • K:metaタグのkeywords
  • h1:h1タグ

SEOにおいてはtitleタグやh1の影響が強くでます。
対策キーワードがタイトルやh1に入っているケースは多いため、要チェックです。

meta descriptionについては指定するメディアと指定せずGoogleに判断させるメディアがあります。

meta keywordsは指定してもSEOに効果がないと言われています。このあたりはお好みでソースをいじっください。
ちなみに筆者は対策キーワードを把握しやすいため指定する場合があります。

TDKh1のスクレピング方法

前回のツールを拡張して利用するため、Pythonで書いています。

早速ですが、ソースコードは下記のようになっています。
sitemap.xmlから記事一覧を取得する記事のソースも必要ですのでお気をつけください。

get_tdkh1_by_sitemap.py
import get_pages_by_sitemap
from bs4 import BeautifulSoup
from urllib import request
import os.path
import re
import time
import pprint
import pandas as pd

def get_tdkh1(url):
    tdkh1 = {}
    html = request.urlopen(url)
    soup = BeautifulSoup(html, 'html.parser')
    #print(soup.prettify())

    #url
    tdkh1['url'] = url

    #title
    t = soup.find("title")
    if t is None:
        t = ""
    else:
        t = t.text.strip()
    tdkh1['title'] = t

    #meta_descriptnion
    d = soup.find("meta", {"name":"description"})
    if d is None:
        d = ""
    else:
        d = d["content"].strip()
    tdkh1['description'] = d

    #meta_keywords
    k = soup.find("meta", {"name":"keywords"})
    if k is None:
        k = ""
    else:
        k = k["content"].strip()
    tdkh1['keywords'] = k

    #h1
    h1 = soup.find("h1")
    if h1 is None:
        h1_text = ""
    else:
        h1_text = h1.text.strip()
        for img in h1.find_all("img"):
            h1_text = h1_text + "<img>" + img["alt"]
    tdkh1['h1'] = h1_text

    return tdkh1

def get_tdkh1s(urls):
    tdkh1s = []
    for url in urls:
        tdkh1s = tdkh1s + [get_tdkh1(url)]
        time.sleep(0.5)

    #Excelに保存
    col_names = ['url', 'title', 'meta_description', 'meta_keywords', 'h1']
    lines = []
    
    for tdkh1 in tdkh1s:
        lines.append([tdkh1["url"], tdkh1["title"], tdkh1["description"], tdkh1["keywords"], tdkh1["h1"]])

    df = pd.DataFrame(lines, columns=col_names)

    with pd.ExcelWriter('./tdkh1s.xlsx') as writer:
        df.to_excel(writer, sheet_name='TDKh1一覧')

    return tdkh1s

if __name__ == '__main__':
    url = "https://shigoto-web.co.jp/tensyoku/sitemap.xml"
    urls= get_pages_by_sitemap.parse_sitemap(url)
    tdkh1s = get_tdkh1s(urls)

    print("--------------")
    print("完了")
    print("--------------")

各ページにアクセスしてTDKh1をBeautifulSoupによるスクレイピングによって取得しています。

連続してアクセスすることにより、サーバー負荷を高めないように0.5秒間のスリープを入れています。

h1をimgタグのaltで指定するメディアもあるため、alt属性も取得するようにしています。

取得結果は、pandasによってExcelファイルに出力しています。

人によってはcanonicalなども取得したいでしょう。お好みに合わせてカスタマイズしていただければと思います。

追記:Githubにソースを公開しました

この記事のプログラムはGithubで公開しております。
ぜひご利用ください。

https://github.com/it-aki/research_pages

参考

アキ@IT業界の歩き方はWeb制作やSEOコンサルティングを強みとしています。
メディア運営も得意でしごとウェブ転職IT業界の歩き方など運営しています。
ご依頼は株式会社アスターリンクまでどうぞ。

Discussion