sitemap.xml からSEO(TDKh1)の調査をするための簡単なスクレイピング
はじめまして!アキ@IT業界の歩き方です。
株式会社アスターリンクに在籍し、ITエンジニアやSEO担当をしています。
先日、sitemap.xmlから記事一覧を取得する記事をQiitaに寄稿しました。
WordPressのsitemap.xmlではプラグイン「Google XML Sitemaps」を利用することが多いのですが、そうするとsitemap.xmlの中でさらにsitemap.xmlを指定されてしまうケースがあります。
<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から記事一覧を取得する記事のソースも必要ですのでお気をつけください。
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で公開しております。
ぜひご利用ください。
参考
アキ@IT業界の歩き方はWeb制作やSEOコンサルティングを強みとしています。
メディア運営も得意でしごとウェブ転職やIT業界の歩き方など運営しています。
ご依頼は株式会社アスターリンクまでどうぞ。
Discussion