CMSといえばSEOということで、CMS & SEO屋に転業しつつあるエアーズの加藤です。
そんな事情で日々SEO情報に目を通していると、先日こんな記事がありました。
Web担当者Forum
このページはなぜ検索結果で上位にあるのか? を調べる方法
元記事が英語なのでしょうがないのですが、この記事の中で出てくる「 バックリンクのアンカーテキストを確認するためのツール 」が日本語サイトだとまったく役に立ちません。そこで、欲しければつくるということで、US Yahooの Site Explorer API と Hpricot をつかって自前で調べるスクリプトを書いてみました。
みんなが同じようなことやりだして世の中に余計な負荷が増えるのも難なので、以下抜粋です。
まずスクレイピングに必要な、おなじみのライブラリ達をrequireします。$KCODE = 'u'なのは僕の環境の都合です。
$KCODE = 'u'
require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'kconv'
次に、Site Explorer API関連の変数を設定します。appidはUS Yahooのアカウントでログインして、"Yahoo Site Explorer":http://siteexplorer.search.yahoo.com/ のページからWeb Services APIのリンクを辿っていくと取得できます。
api_url = 'http://search.yahooapis.com/SiteExplorerService/V1/inlinkData'
appid = 'あなたのappid'
results = 100 # 1件から100件まで。デフォルトは50。
url = 'http://www.yahoo.co.jp/' # 調査対象のページのURL
query_url = "#{api_url}?appid=#{appid}&query=#{url}&results=#{results}"
そして、Site Explorer APIを使って調査対象のページにリンクしているページの情報を取得します。HpricotはXMLもパースしてくれるので便利ですね。
xdoc = Hpricot.XML(open(query_url).read.toutf8)
pages = (xdoc/:result).map do |res|
{:title => (res/:title).inner_html, :url => (res/:url).inner_html}
end
これで、以下のようにページの情報が100件分取得できました。これは Yahoo! Site Explorer上での検索 で100件確認する場合と同じ結果になるはずです。
[{:url=>"http://www.alexa.com/", :title=>"Alexa the Web Information Company"}, ...
ページ情報が取得できたので、次に各ページへ実際にアクセスしてアンカーテキストを抽出します。ここでは省いていますが、URL末尾の処理(スラッシュの有無やindexファイル対応)とか、アクセスできない場合の例外処理とかが必要なので、実際にはもうちょっと複雑です。
pages.each do |page|
hdoc = Hpricot(open(page[:url]).read.toutf8)
links = hdoc/"//a[@href='#{url}']"
page.merge!(:link_text => links.map {|link| link.inner_html})
end
また、リンクの中に<img />やその他のタグが含まれている場合もあるので、きっちりテキストだけ取り出したい場合はALTから取り出すなどの処理も必要になります。
以上で、アンカーテキストも含めたバックリンクの情報が取得できました。あとはCSVに書き出すとか自由に加工できます。
[{:url=>"http://www.alexa.com/", :link_text=>["yahoo.co.jp"], :title=>"Alexa the Web Information Company"}, ...
1ページ当たり最大でも数百件のバックリンクといった中小のサイトであればこのくらいで十分役に立つはずです。Yahoo! Site Explorerは Google ウェブマスターツール と違って自サイト以外も調べられるので、競合調査にも便利ですよ。