こんにちは!ほけきよです。
今日は自動化第三弾!! 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
なんてのがあります。Gephiはなぜか私の環境じゃうまく動かなかったので、Cytoscapeを使います。
結果
グラフ可視化の結果がコチラ
よりスカスカグラフであることが判明しました!かなしい…(;_;)
このグラフは結構良くて、拡大するとどういう記事かまでわかるようになっています。
これは高校野球クラスタっぽいですね。じゃあどこと繋げられるかな~なんて考えることも可能です!
まとめ
いかがでしたか? こうやって見ると、強いブログ、弱いブログの差が一目瞭然ですね!
きちんとお手入れしなきゃなと痛感しました。皆さんも是非試してみてはいかがでしょうか?