advertoolsのリストを精査

· ·

advertoolsでデータをcsv出力し、それをpandasを利用して分解しつつ分析にかけていく。まずは前準備。

inputデータを格納するディレクトリとoutputデータを入れるディレクトリを指定しておく。

1
2
3
4
5
6
7
import pandas as pd

data_dir = '../data'
input_dir = f'{data_dir}/input'
output_dir = f'{data_dir}/output'
input_file = f'{input_dir}/file.csv'
output_file = f'{output_dir}/file.csv'

urlやtitle等の基本情報を得る場合は、このあたりを抽出する

df[['url', 'status', 'canonical', 'request_headers_referer', 'title', 'meta_desc', 'depth', 'size', 'download_latency', 'download_timeout', 'redirect_times', 'redirect_ttl', 'redirect_urls', 'redirect_reasons']]

この中で redirect_urlsredirect_reasons など、一部で複数データが発生し @@ で連結されたデータが出力される場合があるため適当にsplitしていく。

1
2
3
4
5
redirect_urls_split = df['redirect_urls'].str.split('@@', expand=True)
redirect_urls_split = redirect_urls_split.fillna('')

redirect_reasons_split = df['redirect_reasons'].str.split('@@', expand=True)
redirect_reasons_split = redirect_reasons_split.fillna('')

splitしたものを元のdataframeに戻しつつ元カラムを削除する。

1
2
df2 = pd.concat([df, redirect_urls_split, redirect_reasons_split], axis=1)
df2 = df2.drop(['redirect_urls', 'redirect_reasons'], axis=1)

またカラムのtitleがexpandしたせいで数字に置き換わってしまっているので再度名前を付けてあげる。

1
df2 = df2.set_axis(['url', 'status', 'canonical', 'request_headers_referer', 'title', 'meta_desc', 'depth', 'size', 'download_latency', 'download_timeout', 'redirect_times', 'redirect_ttl', 'redirect_urls_0', 'redirect_urls_1', 'redirect_urls_2', 'redirect_reasons_0', 'redirect_reasons_1', 'redirect_reasons_2'], axis=1)

ここでは @@ によるsplitが最大2つ行われており、urlとreasonそれぞれが3カラム化していた場合の書き方をしています。ここはsplitしたときに何分割されるかを見ながら判断する。

メモ 🔗

response headerを抜く場合は resp_headers 系を抜く 🔗
1
df[["url","resp_headers_accept-ch","resp_headers_accept-ranges","resp_headers_access-control-allow-credentials","resp_headers_access-control-allow-headers","resp_headers_access-control-allow-methods","resp_headers_access-control-allow-origin","resp_headers_age","resp_headers_cache-control","resp_headers_content-language","resp_headers_content-length","resp_headers_content-security-policy","resp_headers_content-type","resp_headers_date","resp_headers_etag","resp_headers_expires","resp_headers_last-modified","resp_headers_link","resp_headers_p3p","resp_headers_permissions-policy","resp_headers_pragma","resp_headers_server","resp_headers_set-cookie","resp_headers_status","resp_headers_strict-transport-security","resp_headers_traceresponse","resp_headers_vary","resp_headers_via","resp_headers_x-akamai-transformed","resp_headers_x-amz-cf-id","resp_headers_x-amz-cf-pop","resp_headers_x-cache","resp_headers_x-content-type-options","resp_headers_x-csrf-token","resp_headers_x-dt-tracestate","resp_headers_x-envoy-upstream-service-time","resp_headers_x-frame-options","resp_headers_x-pardot-route","resp_headers_x-pardot-rsp","resp_headers_x-powered-by","resp_headers_x-wow-stage-catweb","resp_headers_x-xss-protection"]]
ページ内リンク分析 🔗

ページ内リンクは数が多いから分析を行う上で @@ によるslice以外にも分析し易いように加工する必要がある。jupyter notebookなどで分析していてもメモリを大量に消費してしまい簡単に分析できずkernel restartが発生してしまう。

うまいやり方がパッと思いつかず…無理やりですが… @@ の区切り文字を目印にSeries化、concatしてからindex番号を元にmergeするという手順を踏んだ。ここは要検討。あとは不要なカラムを落とすだけ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
df2 = df[["url", "links_nofollow", "links_text", "links_url"]]
df2 = df2.fillna('')

list_links_nofollow = df2["links_nofollow"].str.split("@@").explode()
list_links_text = df2["links_text"].str.split("@@").explode()
list_links_url = df2["links_url"].str.split("@@").explode()

df3 = pd.concat([list_links_nofollow, list_links_text, list_links_url], axis=1)
df3 = df3.reset_index()
df4 = df.reset_index()
df5 = pd.merge(df3, df4, left_index=True, right_index=True)

もう少しキレイな処理を行いたい。

imageリストを抽出 🔗

画像に関しては次のカラムを抽出する感じで良いと思う。

1
df2 = df[["url", "img_alt", "img_src", "img_srcset", "img_sizes", "img_loading", "img_referrerpolicy"]]
欲しいカラム名探し 🔗

カラムが沢山あるので、欲しいカラム探しはこんな感じで書いて出力したものをもとに考えていけば良さそう。

1
2
3
for l in df.columns:
    if l.__contains__("img"):
        print(l)

参考 🔗

Extracted On-Page SEO Elements

comments powered by Disqus