プロクラシスト

今日の寄り道 明日の近道

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


スポンサーリンク

こんにちは!ほけきよです。

今日は自動化第三弾!! SEO対策ってしてますか? ブログの検索流入をあげるために、Googleには媚を売っていかなければいけないじゃないですか~。

そんなわけで、前回は表示スピード向上にむけた画像圧縮のために、全画像をぶっこ抜いてくる方法を紹介しました。

今日は、SEO対策で大事だと言われる。内部リンクのネットワーク化についてです。

内部リンクのネットワーク化

SEO ブログ

とかで調べるとわんさか出て来るわけですよ。内部リンクの密度、数、アンカーテキスト*1などが大事って。

なので、記事をほったらかしにするわけじゃなくて、過去記事にもリンクをはりながら、蜘蛛の巣のような構造にしていかなければいけないってわけです。

めんどい

というわけで、最適化しようと思うじゃないですか~。

めんどい、めんどうがすぎる。

まず、どの記事にリンクが貼られているかわからない。忘れた。 ううーん、面倒なものは自動化しましょう

環境を作る

  • python(3系)

    • bs4
    • urllib
    • networkx
    • numpy
    • matplotlib
  • python環境のある人へ : pipで全部入ります。面倒な人は、anacondaに全部入っているはずなので

  • python環境のないwinユーザへ : python環境をwindowsにいれる方法は、私の過去記事に書いています。anacondaを入れておくと大抵のことができるのではかどります(容量が2GBほど必要ということには注意しておいてください)

コード

下記コードをコピペしてlink_network.pyなどで保存してください。*2 *3

どこでもいいのですがあんまりわからない!って人はデスクトップに一旦保存しておきましょう。

コードをみる
from bs4 import BeautifulSoup
import urllib
from urllib import request
import time
import csv
import os
import numpy as np
import time
from argparse import ArgumentParser
import networkx as nx
import matplotlib.pyplot as plt

def extract_url(root_url):
    page = 1
    is_articles = True
    urls = []
    entry_url = root_url + "/entry/"
    
    while is_articles:
        html = request.urlopen(root_url+"/archive?page={}".format(page))
        soup = BeautifulSoup(html, "html.parser")
        articles = soup.find_all("a",class_="entry-title-link")
        for article in articles:
            urls.append(article.get("href"))
        if len(articles) == 0:
            # articleがなくなったら終了
            is_articles = False
        page += 1
    return urls

def make_network(root_url, urls):
    entry_url = root_url + "/entry/"
    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):
        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")
        entry = soup.select(".entry-content")[0]
        links = entry.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 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)

何をしているかだけ軽く説明すると

■ URLをぶちぬいてリスト作る

■ 一記事ずつ本文からhrefついてるリンク抜き出す

■ リンクのURLがさっきのリストに含まれるものだったらグラフのエッジを張る

という手順でネットワークを作っていっています。リンクにはamazonリンクなど必要のないものも入っているので、予めURLリストを作っておくことがポイントですね。

使い方

ターミナル or コマンドプロンプトを開き*4、さっきのlink_network.pyが保存されている場所まで移動します。 デスクトップに保存している方は下記コマンドで実行されるはずです。

cd Desktop
python link_network.py --url http://www.procrasist.com --savename procrasist -g

一行目はデスクトップに移動しています。二行目の解説をちらっとしておくと

  • --url URLで、調べたいブログのURLを入力してください
  • --savename hoge で、出力されるグラフの名前を決められます(省略できて、省略した場合はgraph.pngになります)
  • -gは後で説明します。無くてもOKです。

結果は画面に描画されると同時に、pngファイルで保存されるようになっています!

出力結果

グラフとして出力されるのがこんな感じです。 ちなみに、比較用としてレコメンタンクを運営しているみるおか氏のリンク構造も載せておきます。

どちらが私でしょう?一目瞭然ですね。かなしい…(;_;) レコメンタンクの方は、かなり密なネットワーク構造になっていて、しっかり手入れをしているんだなと言うことがわかります。

どのようにしてそういう密なリンクを張っていくのか、下記記事でその一端に触れることができるので、最適化に興味がある人は是非みてみてはいかがでしょうか。

もう少し詳しく

このグラフ、出力でネットワークの粗密はわかるんですが、どうも、どういうカテゴリがクラスタを成しているかまではわかりづらいです。もう少し詳しくみたい!という方に、グラフ描画ソフトとの外部連携をおすすめします。

『使い方』で紹介した-gオプションで、savename.gmlというファイルが生成されるはずです。これは、グラフ構造を保ったファイルになっていて、これを使えば外部の描画ソフトと連携し、いい感じのグラフがかけるのです!! 有名所は

なんてのがあります。Gephiはなぜか私の環境じゃうまく動かなかったので、Cytoscapeを使います。

結果

グラフ可視化の結果がコチラ

よりスカスカグラフであることが判明しました!かなしい…(;_;)

このグラフは結構良くて、拡大するとどういう記事かまでわかるようになっています。

これは高校野球クラスタっぽいですね。じゃあどこと繋げられるかな~なんて考えることも可能です!

まとめ

いかがでしたか? こうやって見ると、強いブログ、弱いブログの差が一目瞭然ですね!

きちんとお手入れしなきゃなと痛感しました。皆さんも是非試してみてはいかがでしょうか?

よし、いよいよ最適化作業にうつr...( ˘ω˘)スヤァ

*1:リンクを貼る前の文言

*2:なお、今回は面倒だったのでエラーハンドリングしてません。必要な方は過去記事などを参考にどうぞ

*3:Windowsのメモ帳でコピペする際は、デフォルトでShift-JISとかのふざけた文字コードになっている可能性があるので、UTF-8で保存しましょう。

*4:windowsユーザーへ。簡単な開き方は、windowsボタン+“cmdと入力”+Enterです

PROCRASIST