【Python×SEO】AhrefsのデータからURLごとのトラフィック上位5キーワードを抽出する
AhrefsやSearch Consoleは便利である反面、データが膨大過ぎるためそのままでは活用しづらいことがあります。
特にURL×クエリの組み合わせのデータでは、1URLあたり数百キーワードが紐づいているケースもあり、「URLごとに獲得できている代表的なキーワードが何なのか」を調べるだけでも、複数のステップが必要です。
1000行、2000行程度のデータであれば問題なく処理できますが、数万行~数十万行のデータに対して手動で作業を行うと、各ステップごとに数十秒~数分待たされてしまい、その間はPCも重たくなり仕事が止まってしまいます。
そこで今回は、Python(Polars)を使ってURLごとのトラフィック上位のキーワードを抽出するコードを紹介します。
また例によってPolarsを使用しているため、事前にpip install polarsを実行してインストールしておいてください。
手順①:AhrefsのオーガニックキーワードCSVファイルの準備
まずはAhrefsから、Organic Keywordsのデータをダウンロードします。
今回のコードは期間比較なしのデータを使用する前提で作成しているため、CSVダウンロード前に以下のドロップダウンを「なし(Don't compare)」に選択したうえで、CSVのダウンロードを行ってください。
ダウンロードできたら次の章で記載している.pyファイルと同じディレクトリに「organic_keywords.csv」という名前で保存してください。
手順②:pythonの実行ファイル(extract_top_keywords_by_url.py)を作成する
次のコードを任意のファイル名で、先ほどのCSVファイルと同じフォルダに格納します。
今回はChatGPTが考えてくれた「extract_top_keywords_by_url.py」という名前にしてみます。
コード上では4行目で読み込むCSVファイルのパス、5行目でURLごとにいくつのキーワードを抽出するのかを設定しているので、こちらは適宜変更してください。
import pandas as pd
import polars as pl
CSV_PATH = './organic_keywords.csv'
KEYWORD_LENGTH = 5 # URLごとに抽出するキーワード数
if __name__ == "__main__":
df = pl.read_csv(CSV_PATH)
df.columns = [column_name.replace(' ', '_').lower() for column_name in df.columns]
# 必要なカラムだけ抽出する
df = df.select(["keyword", "volume", "organic_traffic", "current_position", "current_url"])
# dataframeをトラフィック降順でソート
df_sorted_by_traffic = df.sort("organic_traffic", descending=True)
# URLごとにランクを振る
df_with_rank = df_sorted_by_traffic.with_columns(
rank = pl.col("organic_traffic").rank(method="ordinal", descending=True).over("current_url"),
total_traffic = pl.col("organic_traffic").sum().over("current_url")
)
# URLごとにトラフィックの合計を計算し、トラフィック降順でソート
df_sorted_by_total_traffic = df_with_rank.sort("total_traffic", descending=True)
df_filtered = df_sorted_by_total_traffic.filter(pl.col("rank") <= KEYWORD_LENGTH)
# CSVに出力
df_filtered.to_pandas().to_csv('./organic_keywords_rank.csv', index=False, encoding='utf-8-sig')
このextract_top_keywords_by_url.pyと、先ほどのCSVを保存すると、ファイル構造は以下のようになります。
ルートディレクトリ
├── extract_top_keywords_by_url.py
└── organic_keywords.csv
手順③:コードを実行する
準備はこれだけなので、あとはコードを実行するだけでOKです。
python extract_top_keywords_by_url.py
出力結果
コードを実行すると、同じフォルダ上に「organic_keywords_rank.csv」というファイルが生成されます。
CSVファイルには、
keyword
volume
organic_traffic
current_position
current_url
rank
total_traffic
という7つのカラムがあります。total_trafficが大きい順にURLが並んでおり、各URLごとにorganic_trafficが大きなkeywordが5つまで記載されています。
これでURLごとにトラフィックを集めている主要キーワードを抽出することができました。
Polarsならコードの簡略化ができる
先ほどのコードでも問題なくデータの抽出が可能ですが、変数も多く、コードもやや読みづらい印象があります。
PolarsではDataFrameに対する処理をメソッドチェーンのように連結できるため、以下のように記載することも可能です。
import pandas as pd
import polars as pl
CSV_PATH = './organic_keywords.csv'
KEYWORD_LENGTH = 5 # URLごとに抽出するキーワード数
df = pl.read_csv(CSV_PATH)
df.columns = [column_name.replace(' ', '_').lower() for column_name in df.columns]
# メソッドチェーンを使って処理を行う場合のコード
(
df.select(["keyword", "volume", "organic_traffic", "current_position", "current_url"])
.sort("organic_traffic", descending=True)
.with_columns(
rank = pl.col("organic_traffic").rank(method="ordinal", descending=True).over("current_url"),
total_traffic = pl.col("organic_traffic").sum().over("current_url")
)
.sort("total_traffic", descending=True)
.filter(pl.col("rank") <= KEYWORD_LENGTH)
.to_pandas().to_csv('./organic_keywords_rank2.csv', index=False, encoding='utf-8-sig')
)
余計な変数も減らせますし、そもそものコード量も少なくすることができるので、個人的にPolarsを気に入っている理由のひとつです。
Polarsを使っていく際は、積極的に使っていけると良いかなと思います。
まとめ
Pythonを活用することでExcelやスプレッドシートでは何十秒と待たなければならない作業でも、あっという間に処理可能です。
大量のデータを処理・加工する方は、ぜひ今回のnoteでご紹介したコードをご活用ください。
また今回は単一のCSVファイルが対象でしたが、実務では4サイト、5サイトと複数サイトのデータをまとめて調査・比較することが多いかと思います。
複数サイトのデータを一括で処理・統合する方法については、また次回以降のnoteで書いていこうと思います。
この記事が気に入ったらサポートをしてみませんか?