Nasuta<http://www.nasuta.jp/>

2008年04月15日

Mac OSX(tiger)でGoogle App Engine SDKを動かす

ruby とはぜんぜん関係ありませんが、Google App Engineが面白そうなのでSDKをいれて試してみました。
(残念ながらアカウントは待ち、まだもらえてません)

1. Pythonのインストール


TigerのPythonはバージョンが古いのでver 2.5を別途インストールします。

http://www.python.org/download/
ここからdmg形式でダウンロードできます。

http://www.python.org/ftp/python/2.5.2/python-2.5.2-macosx.dmg

古いバージョンのpythonが呼ばれないように環境変数のPATHの順番に気をつけてください。/usr/local/binが /usr/bin より前にあれば大丈夫です。


2. sdk のインストール


http://code.google.com/appengine/downloads.html

ここからSDKをダウンロードします。こちらもdmg形式なので簡単にインストールできます。(pythonが古いとインストーラが警告を出して終了してしまいます)

3. サンプルの実行

http://code.google.com/appengine/docs/gettingstarted/

Getting Startedに従ってサンプルを実行したら、あっけなく動作しました。

googleアカウントによる認証のテストもストレージのテストも簡単にSDKで出来てしまいます。アカウントの入力ページはgoogleのサイトではなくローカルにある入力フォームが自動的に呼ばれます。

実際に動かしたファイルを参考までにアップしておきます。
これー>google_app_engin_sample.tar.gz

参考:
google app developerによるデモ
posted by ふんじ at 15:09| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

2008年04月10日

ruby でサイト内のリンクを抽出

ruby hogehoge.rb http://foobar.com/

と実行したらそのサイトをクロールしてサイト内リンク(テキストのみ)をすべてリストアップするスクリプトを書いてみました。

幾つかのサイトを食わせてみて正常動作してます。このままでもかなり実用に堪えることができると思います。

再帰で実装したら落ちたので再帰を使わないでクロールを行なってます。結構大変ですねぇ。。<クロール

require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'kconv'
require 'uri'

def catanate(p1="/",p2 = "")

return p2 if p2 =~ /^\//

p1 = p1.sub(/\/([^\/]+)$/,"/");
return p1 + p2
end

def crawler(start)
offset = ""

s_uri = URI.parse(start).normalize
if @bad_urls[s_uri.to_s] != nil then
p "bad url skipped #{s_uri.to_s}"
return
end

queue = []
begin
host = s_uri.host
f = open(s_uri.to_s);
base_uri = f.base_uri

return unless f.content_type =~/text/

if base_uri.host != s_uri.host then
@bad_urls[s_uri.to_s] = "DUMMY"
return
end

doc = Hpricot(f)

rescue => ex
@bad_urls[s_uri.to_s] = "DUMMY"
p "#{s_uri.to_s} ==> #{ex}"
else
(doc/'a').each { |e|
s = e.inner_html.toutf8.gsub(/<.*?>/,'')
next if s == nil || s == ''
begin
next unless e.attributes['href']
uri = URI.parse( e.attributes['href']).normalize

scheme = (uri.scheme == nil ? s_uri.scheme : uri.scheme)
next unless scheme =~/http/

host = (uri.host == nil ? s_uri.host : uri.host)
next unless host == s_uri.host

port = (uri.port == nil ? s_uri.port : uri.port)
if port != nil then
port = (port.to_i == 80 ? "" : ":#{port}" )
end
path = catanate(s_uri.path,uri.path)
qs = ( uri.query == nil ? "" : "?#{uri.query}" )
s = scheme + "://" + host + port + path + qs
next unless @urls[s] == nil

@urls[s]="dummy";
queue.push(s);

rescue => ex2
p "#{e.attributes['href']} => #{ex2}"
end
}
end

return queue;
end

@urls = {}
@bad_urls = {};
q = []
q.push(ARGV[0])
q.each{ |u|
p u
sleep 0.1
wk = crawler(u)
q.concat(wk) if wk != nil
}



@urls.sort.each { |key,val|
p key
}

posted by ふんじ at 23:39| Comment(0) | TrackBack(0) | Misc | このブログの読者になる | 更新情報をチェックする

2008年04月01日

ruby でHTMLを解析してアンカーテキストとリンクURLを抽出

参考にしたURL:
http://tam.qmix.org/wiki/Hpricot.html
http://labs.airs.co.jp/2007/7/11/site_explorer_api_hpricot_seo

簡単にできました。

require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'kconv'

doc = Hpricot(open(ARGV[0]))

(doc/'a').each { |e|
s = e.inner_html.toutf8.gsub(/<.*?>/,'')
next if s == nil || s == ''
print "["
print s
print "]\n"
print e.attributes['href']
print "\n"
}


e.inner_html がアンカーテキストになりますが、UTF-8に変換し、タグをHTMLのタグを消去しています。


$ ruby crawler.rb http://nasuta.seesaa.net/ | head -10
[Nasuta開発ブログ]
http://nasuta.seesaa.net/
[Nasua]
http://www.nasuta.jp/
[http://www.nasuta.jp/]
http://www.nasuta.jp/
[ruby でRSSの解析 その2 はてぶのデータエクスポートデータの解析]
http://nasuta.seesaa.net/article/91728241.html
[http://hatena.g.hatena.ne.jp/bbs/3/13]
http://hatena.g.hatena.ne.jp/bbs/3/13


つぎは階層を追っかけてクローラーっぽい動きを実現させてみますかね。
posted by ふんじ at 18:55| Comment(0) | TrackBack(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。