群馬県高崎市でWebの製作や賃貸・不動産情報誌の作成(DTP)とかやってます。仕事絡みで、勉強したこととか、趣味で調べたこととかの個人的なメモみたいな記事を書いてます。

2009年04月24日

被リンク数をチェックする

練習にYahoo! サイトエクスプローラーを使って、被リンク数を取得するスクリプトを書いてみました。ただ被リンクのあるURLだけ取得してくるのもなんなので、ついでに被リンクの多いドメインを降順で表示してみる。

Yahoo! サイトエクスプローラーの検索結果の解析にはBeautifulSoupを使用。

import urllib2
import BeautifulSoup


def Backlinkcheck(query, depth=0):
backlink = []
depth = (depth+1) * 10
if depth < 0 : depth=0


for i in range(0,depth,10):
yahooSearch = "https://siteexplorer.search.yahoo.co.jp/advsearch?&st=inlinks&si=il&uf=esd"
yahooSearch = yahooSearch + "&b=" + str(i) + "&p=" + query

html = urllib2.urlopen(yahooSearch)
soup = BeautifulSoup.BeautifulSoup(html)

for aTag in soup.body.table.findAll('a'):
backlink.append(aTag.string)

backlink.sort()
domein = [i.split("/")[0] for i in backlink]
domeinConut = []
for i in set(domein):
domeinConut.append((i, domein.count(i)))


print "Domein:"
domeinConut.sort( cmp=lambda x, y: cmp(x[1], y[1]), reverse=True )
for i, j in domeinConut:
print i + ":" + str(j)

print
print "BacklinkURL:"
for i in backlink:
print i

if __name__ == '__main__':
url = "http://hoge.hoge"
Backlinkcheck(url, 10)


Backlinkcheck(<チェック対象URL>,<ページ指定>)として使用。
Yahoo! サイトエクスプローラーは検索結果を1ページ(10件)しか表示してくれないらしいので、何ページまで取得するかを指定することにした。0から数えて指定してください。

補足:
for aTag in soup.body.table.findAll('a'):
backlink.append(aTag.string)
Yahoo! サイトエクスプローラーの検索結果はテーブルタグに囲われて返ってくるので、テーブルタグ内のaタグのみを対象にループを回してアンカーテキストを取得。


for i in set(domein):
domeinConut.append((i, domein.count(i)))
domeinリストの重複をset関数で削除しループさせ、重複したドメイン名のカウント数をタプルにし、2次元配列としてdomeinConutに追加している。domeinConutの内容は以下のようなリストになる。
domeinConut = [("ドメイン名",重複カウント数),("ドメイン名",重複カウント数),…]
なんかもっと上手い方法がありそうだけど、これしか思いつかなかった。

domeinConut.sort( cmp=lambda x, y: cmp(x[1], y[1]), reverse=True )
domeinConutリストをタプルの2番目の要素(重複カウント数)を対象に降順にソートしています。



この記事へのトラックバックURL

http://lifecrak.gunmablog.net/t42837
上の画像に書かれている文字を入力して下さい