IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Linux | Open source | Web development  >

Linux で Web スパイダーをビルドする

単純なスパイダーとスクレイパーでインターネットのコンテンツを収集する

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

原文はこちら

原文はこちら


レベル: 中級

M. Tim Jones, Consultant Engineer, Emulex

2006年 11月 14日

Web スパイダーとは、ユーザーに代わってインターネットを巡回して情報を収集、フィルタリング、そして場合によっては集約するソフトウェア・エージェントのことです。Web スパイダーは、一般的なスクリプト言語とそれぞれの一連の Web モジュールを使って簡単に開発できます。この記事では、Web サイトを巡回して情報 (この記事の場合は株価データ) を集める Linux® 対応のスパイダーとスクレイパーをビルドする方法を紹介します。

スパイダーとは、特定の方法と特定の目的でインターネットを巡回するプログラムのことです。特定の目的とは、情報を収集することであったり、あるいは Web サイトの構造と有効性を把握することであったりします。スパイダーは、Google や AltaVista をはじめとする現代の検索エンジンの基礎です。スパイダーは自動的に Web からデータを取得して、そのデータを他のアプリケーションに渡します。すると、アプリケーションがその Web サイトのコンテンツに検索語の上位セットとして索引を付けます。

エージェントとしての Web スパイダー

Web スパイダーとスクレイパーは、ソフトウェア・ロボットあるいはエージェント (1980 年代前半に Alan Kay が考案) の単なる別の形です。Alan は、コンピューターの世界でのユーザーの代理としてエージェントを考案しました。エージェントには目標が与えられ、その目標を目指して独自のドメイン内で動作します。動きが取れなくなるとユーザーにアドバイスを求め、目標を達成するまで動作しつづけます。

今日、エージェントは自律性、順応性、通信、そして他のエージェントとの連携などといった属性に分類されています。エージェントのモビリティー、さらにパーソナリティーなどのその他の属性が、現在のエージェント・リサーチの目標となっています。この記事の Web スパイダーは、エージェント分類法では「タスク固有のエージェント」に分類されます。

スパイダーと似てはいるものの、興味深い法的問題を伴うのが Web スクレイパーです。スクレイパーはスパイダーの一種で、製品やサービスの価格など、Web の特定コンテンツを対象にします。スクレイパーは一例として価格競争に使用されます。この場合、自社の製品価格を調整したり、あるいは宣伝するためにスクレイパーで特定製品の価格を確認します。スクレイパーも、多数の Web ソースからデータを集約し、その情報をユーザーに提供することができます。

生物学的な動機

自然界のクモについて考えるときには、孤立したものとしてではなく、環境との関わりで考えます。クモは周囲を見渡して感知し、有意義な方法で場所を移動します。Web スパイダーの動作もこれと同様です。Web スパイダーは高級言語で作成されたプログラムで、Web の場合には HTTP (Hypertext Transfer Protocol) プロトコルなどのネットワーク・プロトコルを使用して環境と相互作用します。一方、ユーザーと通信する場合には、SMTP (Simple Mail Transfer Protocol) を使って E メール・メッセージを送信できます。

スパイダーは HTTP や SMTP に限られてはいません。スパイダーによっては SOAP や XML-RPC (Extensible Markup Language Remote Procedure Call) などのWeb サービスを使用します。また、NNTP (Network News Transfer Protocol) を使ってニュースグループを検索したり、RSS (Really Simple Syndication) フィードで興味深いニュースを調べるスパイダーもあります。自然界のほとんどのクモは明暗度と動きの変化しかわかりませんが、Web スパイダーはさまざまなタイプのプロトコルを使って検知することができます。





上に戻る


スパイダーとスクレイパーのアプリケーション

スパイダーの目と足

Web スパイダーはインターネットを検索および移動する手段として主に HTTP を使っています。HTTP はメッセージ指向のプロトコルで、このプロトコルではクライアントがサーバーに接続して要求を発行し、サーバーが応答を返します。それぞれの要求と応答は、ステータスに関する情報を示すヘッダー、そしてコンテンツを記述する本文とで構成されます。

HTTP の要求には 3 つの基本タイプがあります。まず、サーバーの資産に関する情報を要求する HEAD、ファイルや画像などの資産を要求する GET、そしてクライアントが Web ページ (Web フォームを一般に使用) でサーバーと対話することを可能にする POST 要求です。

Web スパイダーおよびスクレイパーは便利なアプリケーションであるが故に、善悪いずれの目的にしても多種多様に用いられています。ここからは、この技術を使用したアプリケーションをいくつか説明します。

検索エンジンの Web クローラー

Web スパイダーはインターネットの検索を簡単かつ効率的にします。そのため、検索エンジンは多数の Web スパイダーを使ってインターネット上の Web ページを巡回し、コンテンツを返して索引を付けています。この作業によって、検索エンジンはローカル索引を素早く検索し、検索基準にもっとも適合する結果を特定することができます。Google では PageRank アルゴリズムも使用しているため、検索結果の Web ページのランクは、そのページにリンクしている他のページの数が基準になります。これは投票として機能し、検索結果では投票数のもっとも多いページに最上位のランクが付けられます。

このようなインターネット検索は、Web コンテンツとインデクサーとの通信に必要な帯域幅にしても、結果に対する索引付けの算定コストにしても高くつきます。また、大量のストレージも必要となりますが、Google が Gmail ユーザーに 1,000 メガバイトのストレージを提供していることを考えると、これは明らかに問題にはなっていません。

Web スパイダーは一連のポリシーを使用してインターネット上での処理を最小限にします。この挑戦の規模を理解する目安として、Google では 80 億を上回る Web ページに索引を付けていることを考えてみてください。動作ポリシーは、クローラーがインデクサーに送るページ、Web サイトに戻って再チェックする頻度、そしてマナー・ポリシーと呼ばれる内容を定義します。Web サーバーは、クローラーに巡回可能なものと、そうでないものを伝える robot.txt というファイルを使用して、クローラーを除外できます。

企業 Web クローラー

標準検索エンジンのスパイダーのように、企業 Web スパイダーは一般公開されないコンテンツに索引を付けます。例えば、企業には一般的に、従業員が使用する内部 Web サイトがあります。このタイプのスパイダーは、ローカル環境に制限されています。検索が制限されるということは通常、計算能力がより高くなり、特殊化された一層完全な索引が可能になるということです。Google ではこれをさらに発展させて、個人の PC のコンテンツに索引を付けるためのデスクトップ検索エンジンを提供しています。

特殊クローラー

クローラーには従来とは違った使用方法も多数あります。例えば、コンテンツのアーカイブや統計の作成などです。アーカイブ・クローラーは単に Web サイトを巡回して、長期記憶媒体にローカルで保管するコンテンツを抜き出します。このクローラーはバックアップ、あるいはそれよりも大々的なケースとして、インターネットのコンテンツのスナップショットを取得するために使用できます。一方、統計はインターネットのコンテンツや、あるいは欠如しているコンテンツを把握するのに役立ちます。クローラーを使用すれば、稼動中の Web サーバーの数、稼動中の特定タイプの Web サーバーの数、利用可能な Web ページの数、さらにはリンク切れの数 (ページが見つからないという HTTP 404 エラーを戻すリンク数) まで特定することができます。

Web サイト・チェッカーも、便利な特殊クローラーの 1 つです。このクローラーは、見つからないコンテンツの検出、すべてのリンクの検証、そして HTML (Hypertext Markup Language) の有効性の確認を行います。

E メール収集クローラー

今度は悪い面に目を向けてみましょう。残念なことですが、少数の悪党のせいで残りのすべての人々にとってのインターネットが台無しにされてしまうことがあります。E メール収集クローラーは Web サイトで E メール・アドレスを検索し、検索したアドレスを使って、誰もが毎日わずらわされている大量のスパムを作り出します。Postini では、2005 年 8 月の時点で、Postini ユーザーのために処理した全 E メール・メッセージの 70% が不要なスパムであったと報告しています。

E メールの収集は、この記事の最後のクローラーの例で分かるように、もっとも簡単な巡回アクティビティーの 1 つです。

Web スパイダーとスクレイパーの基本概念を説明したので、ここからは 4 つの例で、Ruby や Python などの現代のスクリプト言語を使用して Linux 対応のスパイダーとスクレイパーを簡単にビルドできることを実演してみます。





上に戻る


例 1: 単純なスクレイパー

この例では、特定 Web サイトに対して実行されている Web サーバーの種類を調べる方法を説明します。この方法を大規模なサンプルに適用すれば、官界、学界、産業界での Web サーバー普及に関する興味ある統計を出すこともできます。

リスト 1 は、Web サイトをスクレイプして HTTP サーバーを識別する Ruby スクリプトです。Net::HTTP クラスが HTTP クライアントと GET、HEAD、および POST HTTP メソッドをインプリメントします。HTTP サーバーに対して要求を行うたびに、HTTP メッセージ応答の一部に、コンテンツを提供しているサーバーが示されます。サイトからページをダウンロードする代わりに、HEAD メソッドを使ってルート・ページ (「/」) に関する情報を取得しています。HTTPサーバーが正常に応答する限り (応答コードが「200」)、応答のそれぞれの行でサーバー・キーの検索を繰り返し、キーが見つかったら値をプリントします。このキーの値が、HTTP サーバーを表すストリングです。


リスト 1. 単純なメタデータのスクレイプを目的とした Ruby スクリプト (srvinfo.rb)
                
#!/usr/local/bin/ruby
require 'net/http'

# Get the first argument from the command-line (the URL)
url = ARGV[0]

begin

  # Create a new HTTP connection
  httpCon = Net::HTTP.new( url, 80 )

  # Perform a HEAD request
  resp, data = httpCon.head( "/", nil )

  # If it succeeded (200 is success)
  if resp.code == "200" then

    # Iterate through the response hash
    resp.each {|key,val|

      # If the key is the server, print the value
      if key == "server" then

        print "  The server at "+url+" is "+val+"\n"

      end

    }

  end

end

srvinfo スクリプトの使用方法に併せて、リスト 2 に多数の官界、学界、そしてビジネス界の Web サイトから取得した結果を示します。この結果には、Apache (68% の普及率) から Sun、Microsoft® IIS (Internet Information Services) までかなりの多様性があります。また、サーバーがレポートされていないケースもあります。興味深い結果として、ミクロネシア連邦では古いバージョンの Apache を実行している一方 (更新の時期)、Apache.org では最先端の技術を使っていることがわかります。


リスト 2. サーバー・スクレイパーの使用例
                
                    
[mtj@camus]$ ./srvrinfo.rb www.whitehouse.gov
  The server at www.whitehouse.gov is Apache
[mtj@camus]$ ./srvrinfo.rb www.cisco.com
  The server at www.cisco.com is Apache/2.0 (Unix)
[mtj@camus]$ ./srvrinfo.rb www.gov.ru
  The server at www.gov.ru is Apache/1.3.29 (Unix)
[mtj@camus]$ ./srvrinfo.rb www.gov.cn
[mtj@camus]$ ./srvrinfo.rb www.kantei.go.jp
  The server at www.kantei.go.jp is Apache
[mtj@camus]$ ./srvrinfo.rb www.pmo.gov.to
  The server at www.pmo.gov.to is Apache/2.0.46 (Red Hat Linux)
[mtj@camus]$ ./srvrinfo.rb www.mozambique.mz
  The server at www.mozambique.mz is Apache/1.3.27 
   (Unix) PHP/3.0.18 PHP/4.2.3
[mtj@camus]$ ./srvrinfo.rb www.cisco.com
  The server at www.cisco.com is Apache/1.0 (Unix)
[mtj@camus]$ ./srvrinfo.rb www.mit.edu
  The server at www.mit.edu is MIT Web Server Apache/1.3.26 Mark/1.5 
	(Unix) mod_ssl/2.8.9 OpenSSL/0.9.7c
[mtj@camus]$ ./srvrinfo.rb www.stanford.edu
  The server at www.stanford.edu is Apache/2.0.54 (Debian GNU/Linux) 
	mod_fastcgi/2.4.2 mod_ssl/2.0.54 OpenSSL/0.9.7e WebAuth/3.2.8
[mtj@camus]$ ./srvrinfo.rb www.fsmgov.org
  The server at www.fsmgov.org is Apache/1.3.27 (Unix) PHP/4.3.1
[mtj@camus]$ ./srvrinfo.rb www.csuchico.edu
  The server at www.csuchico.edu is Sun-ONE-Web-Server/6.1
[mtj@camus]$ ./srvrinfo.rb www.sun.com
  The server at www.sun.com is Sun Java System Web Server 6.1
[mtj@camus]$ ./srvrinfo.rb www.microsoft.com
  The server at www.microsoft.com is Microsoft-IIS/6.0
[mtj@camus]$ ./srvrinfo.rb www.apache.org
The server at www.apache.org is Apache/2.2.3 (Unix) 
	mod_ssl/2.2.3 OpenSSL/0.9.7g

上記は有益なデータで、政府や研究機関が Web サーバーに何を使用しているのかがわかります。次の例では、これよりも多少実用的な株価情報スクレイパーについて説明します。




上に戻る


例 2: 株価情報スクレイパー

この例では、株価情報を集める単純な Web スクレイパー (別名スクリーン・スクレイパー) をビルドしています。以下に示すように、応答 Web ページにパターンを利用するという強力な方法を使っています。


リスト 3. 株価情報を目的とした単純な Web スクレイパー
                
                    
#!/usr/local/bin/ruby
require 'net/http'

host = "www.smartmoney.com"
link = "/eqsnaps/index.cfm?story=snapshot&symbol="+ARGV[0]

begin

  # Create a new HTTP connection
  httpCon = Net::HTTP.new( host, 80 )

  # Perform a HEAD request
  resp = httpCon.get( link, nil )

  stroffset = resp.body =~ /class="price">/

  subset = resp.body.slice(stroffset+14, 10)

  limit = subset.index('<')

  print ARGV[0] + " current stock price " + subset[0..limit-1] +
          " (from stockmoney.com)\n"

end

上記の Ruby スクリプトでは、サーバー (この場合、www.smartmoney.com) への HTTP クライアント接続をオープンし、ユーザーによって渡された株価情報を明確に要求するリンクを作成しています (&symbol=<symbol> を使用)。このリンクを HTTP GET メソッド (完全な応答ページを取得するため) で要求してから、現在の株価が直後に続いている class="price"> を検索します。これが Web ページから抜粋されてユーザーに表示されます。

この株価情報スクレイパーは、リスト 4 のように対象の銘柄記号を使ったスクリプトを呼び出すだけで使用できます。


リスト 4. 株価情報スクレイパーの使用例
                
                    
[mtj@camus]$ ./stockprice.rb ibm
ibm current stock price 79.28 (from stockmoney.com)
[mtj@camus]$ ./stockprice.rb intl
intl current stock price 21.69 (from stockmoney.com)
[mtj@camus]$ ./stockprice.rb nt
nt current stock price 2.07 (from stockmoney.com)
[mtj@camus]$




上に戻る


例 3: 通信する株価情報スクレイパー

例 2 の株価情報を目的とした Web スクレイパーも魅力的ですが、このスクレイパーに定期的に株価をモニターさせ、本命の株が一定の価格を超えた場合、あるいは一定の価格を下回った場合に知らせてくれるようにすると実に有益なものになります。そこで、お待ちかねのスクレイパーの登場です。リスト 5 では、単純な Web スクレイパーを更新して、定期的に株価をモニターし、定義した価格の範囲外になると E メール・メッセージを送信するようにしています。


リスト 5. E メール・アラートを送信できる株価情報スクレイパー
                
#!/usr/local/bin/ruby
require 'net/http'
require 'net/smtp'

#
# Given a web-site and link, return the stock price
#
def getStockQuote(host, link)

    # Create a new HTTP connection
    httpCon = Net::HTTP.new( host, 80 )

    # Perform a HEAD request
    resp = httpCon.get( link, nil )

    stroffset = resp.body =~ /class="price">/

    subset = resp.body.slice(stroffset+14, 10)

    limit = subset.index('<')

    return subset[0..limit-1].to_f

end


#
# Send a message (msg) to a user.
# Note: assumes the SMTP server is on the same host.
#
def sendStockAlert( user, msg )

    lmsg = [ "Subject: Stock Alert\n", "\n", msg ]
    Net::SMTP.start('localhost') do |smtp|
      smtp.sendmail( lmsg, "rubystockmonitor@localhost.localdomain", [user] )
    end

end


#
# Our main program, checks the stock within the price band every two
# minutes, emails and exits if the stock price strays from the band.
#
# Usage: ./monitor_sp.rb <symbol> <high> <low> <email_address>
#
begin

  host = "www.smartmoney.com"
  link = "/eqsnaps/index.cfm?story=snapshot&symbol="+ARGV[0]
  user = ARGV[3]

  high = ARGV[1].to_f
  low = ARGV[2].to_f

  while 1

    price = getStockQuote(host, link)

    print "current price ", price, "\n"

    if (price > high) || (price < low) then

      if (price > high) then
        msg = "Stock "+ARGV[0]+" has exceeded the price of "+high.to_s+
               "\n"+host+link+"\n"
      end

      if (price < low) then
        msg = "Stock "+ARGV[0]+" has fallen below the price of "+low.to_s+
               "\n"+host+link+"\n"

      end

      sendStockAlert( user, msg )

      exit

    end

    sleep 120

  end

end

上記の Ruby スクリプトは少々長くなっていますが、リスト 3 の株価スクレイピング・スクリプトに基づいたものです。新しい関数 getStockQuote が株価採取関数をカプセル化し、もう 1 つの sendStockAlert が E メール・アドレスにメッセージを送信します (いずれもユーザー定義関数)。メイン・プログラムは、現在の株価を取得して価格が範囲内であるかどうかをチェックし、範囲外の場合には E メール・アラートをユーザーに送信するというループでしかありません。またマナーとして、サーバーに負担をかけすぎないように株価チェックには間隔を設けています。

リスト 6 は、人気の高いハイテク関連株の株価モニターを呼び出す例です。2 分ごとに株価がチェックされて画面に出力されます。株価が上限を超えると、E メール・アラートが送信されてスクリプトが終了します。


リスト 6. 株価モニター・スクリプトの実演
                
                    
[mtj@camus]$ ./monitor_sp.rb ibm 83.00 75.00 mtj@mtjones.com
current price 82.06
current price 82.32
current price 82.75
current price 83.36

結果として送信された E メールには、図 1 に示すようにスクレイプされたデータのソースへのリンクも記載されています。


図 1. リスト 5 の Ruby スクリプトで送信された E メール・アラート
図 1. リスト 5 の Ruby スクリプトで送信された E メール・アラート

ここでスクレイパーはひとまず置いて、今度は Web スパイダーの作成について詳しく見てみましょう。




上に戻る


例 4: Web サイト・クローラー

最後の例では、Web サイトを巡回する Web スパイダーを取り上げます。サイトの外で迷子にならないよう、単一の Web ページだけを対象とします。

Web サイトを巡回して、サイト内に提供されたリンクを辿るには、HTML ページを構文解析する必要があります。Web ページをうまく構文解析できれば、他のリソースへのリンクも特定できます。一部のリンクはローカル・リソース (ファイル) を指定していますが、それ以外は非ローカル・リソース (他の Web ページへのリンクなど) を表します。

Web を巡回するには、まず、特定の Web ページですべてのリンクを識別し、これらのリンクをアクセス予定のリンク・キューに入れます。次に、アクセス予定のリンク・キューにある最初の項目でこのプロセスを繰り返します。つまりこれは、横型検索になります (最初に見つけたリンクを辿る場合は、縦型検索になります)。

ローカル以外のリンクを避けてローカル Web ページだけを辿るには、リスト 7 に示すように、単一の Web サイトに Web クローラーを指定します。この例では、Ruby から Python に切り替えて、Python の便利な HTMLParser クラスを利用しています。


リスト 7. 単純な Python Web サイト・クローラー (minispider.py)
                
                    
#!/usr/local/bin/python

import httplib
import sys
import re
from HTMLParser import HTMLParser


class miniHTMLParser( HTMLParser ):

  viewedQueue = []
  instQueue = []

  def get_next_link( self ):
    if self.instQueue == []:
      return ''
    else:
      return self.instQueue.pop(0)


  def gethtmlfile( self, site, page ):
    try:
      httpconn = httplib.HTTPConnection(site)
      httpconn.request("GET", page)
      resp = httpconn.getresponse()
      resppage = resp.read()
    except:
      resppage = ""

    return resppage


  def handle_starttag( self, tag, attrs ):
    if tag == 'a':
      newstr = str(attrs[0][1])
      if re.search('http', newstr) == None:
        if re.search('mailto', newstr) == None:
          if re.search('htm', newstr) != None:
            if (newstr in self.viewedQueue) == False:
              print "  adding", newstr
              self.instQueue.append( newstr )
              self.viewedQueue.append( newstr )
          else:
            print "  ignoring", newstr
        else:
          print "  ignoring", newstr
      else:
        print "  ignoring", newstr


def main():

  if sys.argv[1] == '':
    print "usage is ./minispider.py site link"
    sys.exit(2)

  mySpider = miniHTMLParser()

  link = sys.argv[2]

  while link != '':

    print "\nChecking link ", link

    # Get the file from the site and link
    retfile = mySpider.gethtmlfile( sys.argv[1], link )

    # Feed the file into the HTML parser
    mySpider.feed(retfile)

    # Search the retfile here

    # Get the next link in level traversal order
    link = mySpider.get_next_link()

  mySpider.close()

  print "\ndone\n"

if __name__ == "__main__":
  main()

このクローラーの基本設計は、チェック対象の最初のリンクをキューにロードするというものです。このキューは、次に問い合わせる予定のリンクのキューとして機能します。リンクがチェックされると、検出された新しいリンクが同じキューにロードされます。このようにして横型検索を行います。また、確認済みリンクのキューを設けて、すでに確認したリンクは辿らないようにしています。基本設計は大体こんなところで、実際の作業はほとんど HTML パーサーで行われます。

最初に、Python の HTMLParser クラスから miniHTMLParser という新しいクラスを抽出します。このクラスはいくつかのことを実行します。第一に、これが私の HTML パーサーで、開始 HTML タグが検出されるたびにコールバック・メソッド (handle_starttag) を使用します。また、巡回 (get_next_link) で検出されたリンクにアクセスし、そのリンクが表すファイル (この場合は HTML ファイル) を取得するクラスも使用しています。

このクラスには 2 つのインスタンス変数が含まれます。一方の viewedQueue は、これまでに調査が済んでいるリンクが含まれ、instQueue はまだ問い合わせが済んでいないリンクを表します。

上記のリストを見るとわかるように、クラス・メソッドは単純です。get_next_link メソッドは、instQueue が空であることを確認して " を返します。空でない場合は、pop メソッドによって次の項目が返されます。次に、gethtmlfile メソッドが HTTPConnectionK を使用してサイトに接続し、定義されたページのコンテンツを返します。最後に、Web ページ内のすべての開始タグに対して handle_starttag が呼び出されます (この Web ページは、feed メソッドによって HTML パーサーにフィードされたものです)。この関数で、リンクがローカル以外のリンクであるかどうか (http が含まれているかどうか)、E メール・アドレスであるかどうか (mailto が含まれているかどうか)、そして Web ページである (可能性が高い) ことを示す「htm」が含まれているかどうかを調べます。さらに、まだアクセスしていないリンクであることを確実にするチェックを行ってから、問い合わせキューと確認済みキューにロードします。

main メソッドは単純なもので、新しい miniHTMLParser インスタンスを作成して、ユーザーが定義したサイト (argv[1]) とリンク (argv[2]) から開始しています。リンクのコンテンツを取り込んで HTML パーサーにフィードし、次にアクセスするリンクがあれば、これを取り込みます。このループはアクセスするリンクが残っている限り続きます。

Web スパイダーを呼び出すには、以下のように Web サイトのアドレスとリンクを指定します。

./minispider.py www.fsf.org /

上記では、Free Software Foundation のルート・ファイルを要求しています。このコマンドの結果は、リスト 8 のようになります。このリストを見ると、問い合わせキューに追加された新しいリンクと、ローカル以外の無視されたリンクがわかります。リストの最後に、ルートで検出されたリンクの問い合わせが示されています。


リスト 8. minispider スクリプトの出力
                
[mtj@camus]$ ./minispider.py www.fsf.org /

Checking link  /
  ignoring hiddenStructure
  ignoring http://www.fsf.org
  ignoring http://www.fsf.org
  ignoring http://www.fsf.org/news
  ignoring http://www.fsf.org/events
  ignoring http://www.fsf.org/campaigns
  ignoring http://www.fsf.org/resources
  ignoring http://www.fsf.org/donate
  ignoring http://www.fsf.org/associate
  ignoring http://www.fsf.org/licensing
  ignoring http://www.fsf.org/blogs
  ignoring http://www.fsf.org/about
  ignoring https://www.fsf.org/login_form
  ignoring http://www.fsf.org/join_form
  ignoring http://www.fsf.org/news/fs-award-2005.html
  ignoring http://www.fsf.org/news/fsfsysadmin.html
  ignoring http://www.fsf.org/news/digital-communities.html
  ignoring http://www.fsf.org/news/patents-defeated.html
  ignoring /news/RSS
  ignoring http://www.fsf.org/news
  ignoring http://www.fsf.org/blogs/rms/entry-20050802.html
  ignoring http://www.fsf.org/blogs/rms/entry-20050712.html
  ignoring http://www.fsf.org/blogs/rms/entry-20050601.html
  ignoring http://www.fsf.org/blogs/rms/entry-20050526.html
  ignoring http://www.fsf.org/blogs/rms/entry-20050513.html
  ignoring http://www.fsf.org/index_html/SimpleBlogFullSearch
  ignoring documentContent
  ignoring http://www.fsf.org/index_html/sendto_form
  ignoring javascript:this.print();
  adding licensing/essays/free-sw.html
  ignoring /licensing/essays
  ignoring http://www.gnu.org/philosophy
  ignoring http://www.freesoftwaremagazine.com
  ignoring donate
  ignoring join_form
  adding associate/index_html
  ignoring http://order.fsf.org
  adding donate/patron/index_html
  adding campaigns/priority.html
  ignoring http://r300.sf.net/
  ignoring http://developer.classpath.org/mediation/OpenOffice2GCJ4
  ignoring http://gcc.gnu.org/java/index.html
  ignoring http://www.gnu.org/software/classpath/
  ignoring http://gplflash.sourceforge.net/
  ignoring campaigns
  adding campaigns/broadcast-flag.html
  ignoring http://www.gnu.org
  ignoring /fsf/licensing
  ignoring http://directory.fsf.org
  ignoring http://savannah.gnu.org
  ignoring mailto:webmaster@fsf.org
  ignoring http://www.fsf.org/Members/root
  ignoring http://www.plonesolutions.com
  ignoring http://www.enfoldtechnology.com
  ignoring http://blacktar.com
  ignoring http://plone.org
  ignoring http://www.section508.gov
  ignoring http://www.w3.org/WAI/WCAG1AA-Conformance
  ignoring http://validator.w3.org/check/referer
  ignoring http://jigsaw.w3.org/css-validator/check/referer
  ignoring http://plone.org/browsersupport

Checking link  licensing/essays/free-sw.html
  ignoring mailto:webmaster

Checking link  associate/index_html
  ignoring mailto:webmaster

Checking link  donate/patron/index_html
  ignoring mailto:webmaster

Checking link  campaigns/priority.html
  ignoring mailto:webmaster

Checking link  campaigns/broadcast-flag.html
  ignoring mailto:webmaster

done

[mtj@camus]$

この例は、Web スパイダーの巡回フェーズを説明するものです。クライアントがファイルを読み取った後は、インデクサーの場合と同様にページでコンテンツを調べることもできます。




上に戻る


Linux のスパイダー用ツール

いくつかのスクレイパーとスパイダーのインプリメント方法を見てきましたが、Linux にはこの機能を代行してくれるツールがあります。

Web get を表す wget コマンド は、再帰的に Web サイトを調べて対象コンテンツを取り込む便利なコマンドです。Web サイト、対象とするコンテンツ、そしてその他の管理オプションを指定すると、このコマンドが該当ファイルをローカル・ホストにロードします。例えば以下のコマンドは、定義された URL に接続し、再帰的に 3 レベルまで辿って、拡張子が mp3、mpg、mpeg、または avi のファイルを取り込みます。

wget -A mp3,mpg,mpeg,avi -r -l 3 http://<some URL>

curl コマンドも同じように機能しますが、その利点は積極的に開発されているということです。同様のコマンドとして、snarf、fget、および fetch も使用できます。




上に戻る


法的な問題

Web スパイダーによるインターネット上でのデータ・マイニングに関する訴訟は何件か発生し、思わしくない結果となっています。最近では、Farechase, Inc. が (リアルタイムでの) スクリーン・スクレーピングでアメリカン航空に訴えられました。この訴訟の申し立ては初め、データの収集がアメリカン航空の (契約条件下での) ユーザー同意に違反しているという内容でした。この申し立てが失敗に終わると、アメリカン航空は不法侵害を主張し、結果的にはその主張が認められました。その他の訴訟では、スパイダーやスクレイパーによって使われる帯域幅が正当なユーザーの利益を損ねていると訴えています。いずれも妥当な主張で、マナー・ポリシーがなおさら重要になってきています。詳細は、「参考文献」を参照してください。




上に戻る


今後の発展

Web の巡回と採取は面白いもので、場合によっては非常に大きな利益を生む可能性もあります。ただし、上記でも述べたように法的な問題があります。スパイダーやスクレイパーを実行する場合は、サーバーに用意されている robots.txt ファイルに従い、マナー・ポリシーに取り込んでください。SOAP などの新しいプロトコルを使用すると、スパイダー操作が一層簡単になり、さらに通常の Web 動作に与える影響も抑えることができます。セマンティック Web などの今後の活動によりスパイダー操作はさらに単純化され、スパイダーのソリューションおよびメソッドが増え続けることになるでしょう。



参考文献

学ぶために
  • ウィキペディアの Web crawler ページは、Web クローラーとその歴史、そして Web 巡回ポリシーに関する絶好の情報源です。

  • Email Spiders には、E メール・スパイダーの興味深い考察と、その対処方法が記載されています。

  • The Web Robots Pages は、Web ロボットに関する昔ながらの Web サイトで、ロボット専用プロトコル (マナー・ポリシーに対処するための) に関する貴重な情報源になります。

  • Scrapers, Robots and Spiders: The Battle Over Internet Data Mining」(Gesmer Updegrove LLP、2006年) では、アメリカン航空と Farechase, Inc. の訴訟に対する考察を含め、Web スクレイパーの法的および倫理的問題を概説しています。

  • developerWorks Linux ゾーンには、Linux 開発者用の資料が豊富に揃っています。

  • developerWorks technical events and Webcasts で最新情報を入手してください。


製品や技術を入手するために
  • Searchtools.com の Source Code for WebRobot Spiders には、数々のタスクを対象とした無料のオープン・ソース・ロボットのためのソース・コードが複数の言語で用意されています。

  • SEK for Linux を注文してください。この 2 枚組 DVD セットには、Linux 対応の DB2®、Lotus®、Rational®、Tivoli®、そして WebSphere® の最新 IBM トライアル・ソフトウェアが収録されています。

  • developerWorks から直接ダウンロードできる IBM トライアル・ソフトウェアを使用して、Linux で次の開発プロジェクトを構築してください。


議論するために


著者について

M. Tim Jones

M. Tim Jonesは、埋め込みソフトウェアのエンジニアであり、GNU/Linux Application Programming, AI Application Programming と BSD Sockets Programming from a Multilanguage Perspective の著者でもあります。エンジニアとして経歴は幅広く、静止衛星用のカーネル開発から埋め込みシステム・アーキテクチャー、そしてネットワーク・プロトコル開発まで経験しています。現在はEmulex Corp.のシニア主席エンジニアです。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



 


 


不充分・不完全である大変素晴らしい
 


この記事を共有する

del.icio.us del.icio.us newsing newsing FC2ブックマーク FC2ブックマーク
Choix! Choix! ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
MM/memo MM/memo CZブックマーク CZブックマーク livedoorクリップ livedoorクリップ
はてなブックマーク はてなブックマーク Buzzurl(バザール) Buzzurl(バザール)




上に戻る


    日本IBMについて プライバシー お問い合わせ