【Python】SEO対策のために内部リンクを可視化するツールを作成してみる

プログラミングpython

【注意】スクレイピングは使い方を誤るとDos攻撃となる可能性があります。(サーバーに過剰な負荷をかける行為)十分注意してください。

前回SEO対策ツールとして、上位100サイトを抽出するツールをPythonで作成しました

次は内部対策として、内部リンクをチェックするツールを作成したいと思います。ちなみに内部リンクは新しいサーチコンソールで簡単に見れるようになりました。ですが、サーチコンソールでわかるのはどのページに何本のリンクが当たっているかということで、「どのページからどのページへリンクが当たっているか」は一つ一つのページで確認をする必要があります。

内部リンクの理想は「トップページから2クリックで到達できるようにする」ということがよく言われていますね。ですが、これを実現しようと思ったら結構めんどくさいです。

何がめんどくさいって、それを計測するツールがないのです。サーチコンソールでこのあたりの詳細なデータが一括でCSVに吐き出せたら色々と捗るのですが、今の所それが実装されることはなさそうです。

なのでこちらも作ってしまおうと思いました。

ツールさえあれば、サイトの内部リンクまわりの整理が、より簡単にできるようになりますね。

よろしくお願いいたします。

【Python】SEO対策のために内部リンクを可視化するツールを作成してみる

 

SEO対策は地道な作業です。そもそも私はSEO対策とというものを、webページのタグの最適化の作業だと考えています。結局の所googleに自分のサイトを評価してもらわなければいけませんが、その評価は人の手ではなく、ロボットの手によっておこなわれています。

そしてそのロボットはタグやタグの中身によってサイトを評価します。

最近「コンテンツの質」というものを、googleが提唱していますが、タグの付けかたが汚いコンテンツでは正当な評価を受けることは難しいでしょう。「いかに良質なコンテンツを最適なタグで囲むか」が重要です。

良質なコンテンツを最適なタグで囲むことは重要なことですが、時間がかかります。ですがSEOにはさらに時間がかかるめんどくさい作業があります。それは内部リンクの整理です。

どのページからどのページへリンクがされていて、アンカーテキストがなにか、そしてそれはaタグの中でも何番目から飛ばされているのか。これを目視で全て調査しきるころには、次のアルゴリズムのアップデートが入っていることでしょう。人の手ではやるべきことが膨大過ぎてとても手におえません。なのでツールを使いましょう!!

そして調べてみた結果、案の定有料ツールしかなかったので今回も作ることにしました。

個人的なデータ解析に基づいた見解ですが、googleのbotはページに貼られたリンクを全て辿らないと考えています。これについては「クロールバジェット」で検索すれば、その手の説明をしてくれているサイトがありますので、もし興味がありましたらご確認ください。

サイトの内部リンクを確認するツール

欲しい機能はありますが、自分用のアレンジは置いておいてい、一旦どのサイトでも使えるようなシンプルなものを目指して作成いたします。

トップページから発リンクされているページだけで内部リンクを可視化する

↑このようになりました。真っ黒なのはリンクが当たりまくっているからです。

あーもうめちゃくちゃだよ。

上のネットワーク図は「https://trend-trader.com」でツールを走らせた際の結果画面です。

結果の見やすさはともかく、内部リンクを可視化することに成功しました。

なぜこんなに網の目が細かいかというと、おそらくサイドバーからの発リンクを解析に含めてしまっている結果、真っ黒の画面になっていると思われます。googleがaタグにどう重きを置いているかは公表されていませんが、ヘッダー、サイドバー、フッターからの発リンクに重要度を与えていないという噂があります。

なので、この画像、ツールを使ってサイトの分析、改修ができるかと言ったらそういうものでもありません。弊ブログの場合、サイドバーを除いて集計するという必要がありそうです。サイドバーを集計から除外するコードを書き足してしまうと弊ブログでしか走らないコードになりそうだったので、一旦この状態でコードをご紹介することにします。

それから今回URLのリストを、トップページからリンクされているページに限ったものにしたのも、上と同じ理由です。

探索の深度を深めると、aタグでも相対パス、絶対パスで書かれているものがでてくるので、ソレ用の処理を書かなければなりません。今回のコードはそういった例外処理を極力少なくしたシンプルバージョンを目指しています

Searpsを抽出するものは作成しているので、そちらを御覧ください。

searpsチェックするツールを以前作成しました。

内部リンクまで調べる人となると、SEOを扱っている人でもかなりレベルが高い位置にいる人とお見受けします。

おそらくコンテンツの質だけでは上位化できない、ミドルキーワード、ビッグキーワードを狙っている方達ではないでしょうか。今回内部リンク対策用のツールを作成していますが、前回GoogleのSearpsを抽出するツールを作成しています。

言語は同じくpythonです。興味があればこちらからどうぞ。

【Python】SEO対策に使うため上位100サイトをさくっと抽出するツールを作ってみる

おそらく内部リンクの構造を考えるレベルまでいっているのであれば、Searpsをチェックするのにも何かしらのツールを使っていると思いますが・・・。

内部リンクを見直すことに意味はあるのか。リンクジュースという概念について。

そもそも論が好きなので、書いておきますが、内部リンクを見直すことがSEO的に意味があるのかどうかというのを考えなければなりません。googleはリンクが有益なページを評価するアルゴリズムを最初に開発しました。これはgoogle創業者である人物が大学の論文を見ていて思いついたと言われています。

論文は引用される数が多いほど良い論文だそうです。おそらくそれに着想を得たと思われます。このことからわかるように、リンクというものを重要視したアルゴリズムであることは間違いありません。近年ではリンク構造における評価の比率は減っていると聞きますが、まだまだ内部リンクは大切です。というのもgoogleのクローラーは内部リンクを辿ってwebページの解析をおこないます。このクローラーが来るということがSEOにはとても重要です。理由は多くありますが、端的にいうと、良いもの書いても、認識してもらわないと意味がないからです。クローラーの動きにも意識を配り、内部リンクを見直します。

ウェブサイトの内部リンクを可視化するpythonのスクリプト

最初に、ソースコードは以下になります。

from bs4 import BeautifulSoup
import urllib
from urllib import request
import time
import csv
import os
import numpy as np
from argparse import ArgumentParser
import networkx as nx
import matplotlib.pyplot as plt

def extract_url(root_url):
    page = 1
    is_articles = True
    urls = []
    
    while is_articles:
        html = request.urlopen(root_url)
        soup = BeautifulSoup(html, "html.parser")
        articles = soup.find_all("a")
        for article in articles:
            urls.append(article.get("href"))
        is_articles = False
        
        page += 1
    return urls

def make_network(root_url, urls):
    entry_url = root_url
    G = nx.Graph()
    for url in urls:
        article_name= url.replace(entry_url,"").replace("/","-")
        G.add_node(article_name)
    for i,url in enumerate(urls):
        if url.startswith("http"):
            print("Match!")
        else:
            print("Unmatch!")
            continue
        print(i+1,"/",len(urls))
        try:
            html = request.urlopen(url)
        except urllib.error.HTTPError as e: 
            print(e.reason)
        except urllib.error.URLError as e: 
            print(e.reason)
        soup = BeautifulSoup(html, "html.parser")
        links = soup.find_all("a")
        for link in links:
            l = link.get("href")
            if l in urls:
                linking_article_name = url.replace(entry_url,"").replace("/","-")
                linked_article_name = l.replace(entry_url,"").replace("/","-")
                print("被リンク!{} -> {}".format(linking_article_name, linked_article_name))
                j = urls.index(l)
                G.add_edge(linking_article_name, linked_article_name)
            else: 
                continue
    return G

def visualize(G, savename, savegml):
    pos = nx.spring_layout(G) # グラフ形式を選択。ここではスプリングモデルでやってみる
    nx.draw(G, pos, with_labels=True,alpha=0.3,font_size=0.0,node_size=10) # グラフ描画。 オプションでノードのラベル付きにしている
    plt.savefig(savename+".png")
    plt.show()
    if savegml:
        nx.write_gml(G,savename+".gml")

    
if __name__ == '__main__':
    parser = ArgumentParser()
    parser.add_argument("-u", "--url", type=str, required=True,help="input your toppage url!")
    parser.add_argument("-o", "--savename", type=str, default="network", help="output name")
    parser.add_argument('-g', "--savegml", action="store_true", default=False)
    args = parser.parse_args()
    
    urls = extract_url(args.url)
    G = make_network(args.url, urls)
    visualize(G, args.savename, args.savegml)

beautifulsoupでaタグを辿り情報を取得します。

処理が完了すると、同じフォルダにpngファイルで画像が保存されていると思いますので、そちらをご確認ください。

ここまでやってみると、pythonでクローラーを作成することが非常に楽しくなってきました。ライブラリも充実していますし、なによりも日本語での解説サイトが多いのは助かります。非常に便利ですね。

問題点があるとしたら、外部への発リンクがある場合も描画に含めてしまっています。なのでドメインで判定して、自サイトのみに絞るように改良してみたいと思っています。

使い方

コマンドプロンプトにて、作成したpyファイルがある場所まで移動して、実行してください。

  • python sample.py --url https://trend-tracer.com/

「python 〇〇(←作成したファイル名) 〇〇(←検索したいキーワード) --url 〇〇 ←(調査するサイトURL)」

urlを入力する前に--urlをつけるのを忘れないようにしてください。トップからaタグが貼られているページのみで描画するので、それほど完了まで時間はかからないと思います。

開発環境

  • Windows10
  • Python 3.6.5

pip

  • beautifulsoup
  • urllib
  • networkx
  • numpy
  • matplotlib

アナコンダで環境を構築していればすべて入っているかと思います。

アナコンダのダウンロードページはこちらにあるので、まだpythonをインストールしていない方はanacondaからインストールすることをオススメします。

[adsense][adsense]

参考

今回のコードは、以下のサイト様のコードを参考にさせていただきました。

SEO対策!自分のブログの内部リンクを自動で可視化する

非常にわかりやすくまとめておられます。

ただ、こちらのコードだと、はてなブログにしか対応していませんでした。

今回のコードは特にサイトの形態に依存せず、使えるようになっています。どのサイトでも使用できるでしょう。

 

最後に

pythonでのスクレイピングツールを作り始めて数ヶ月経ちましたが、だいぶ慣れてきたように思います。特にbeautifulsoupがとても便利です。重宝しています。

最近ではjavascriptで非同期に作られるサイトもスクレイピングするようになってきました。

こちらについてはrequestでサイトのコードを問い合あせても欲しい情報が含まれていない場合があるので、seleniumを使ってスクレイピングしなければなりません

そこについても、エントリして共有できたらと思います。

(出来なかったら、申し訳ないです)

 

以上です。

読んでいただきありがとうございます。

[adsense]