2

特定の動的 Web サイト用のクローラーを作成しました。すべてのクロール ジョブに 3 時間以上かかります。ページが既にクロールされているか、ページにいくつかの変更があるかを制御したい。これができれば、スクリプトは非常に短時間で完了します。

例えば:

    foreach ($urls as $url) {
        if(thereAreChanges($url)){
            crawl($url);
        }
    }

情報: Web ページは content-length と crc を提供していません。

Array ( [0] => HTTP/1.1 200 OK 
        [Date] => Tue, 08 Jan 2013 07:47:03 GMT 
        [Server] => Apache 
        [Set-Cookie] => Array ( 
                [0] => PHPSESSID=eisb6qjme9b0ouoga9su9fgok4; path=/  
                [1] => j12011=a%3A3%3A%7Bs%3A3%3A%22sid%22%3Bs%3A26%3A%22eisb6qjme9b0ouoga9su9fgok4%22%3Bs%3A2%3A%22ip%22%3Bs%3A12%3A%2294.103.47.65%22%3Bs%3A4%3A%22time%22%3Bi%3A1357631223%3B%7D; expires=Sat, 09-Mar-2013 07:47:03 GMT; path=/  
        ) 
        [Expires] => Thu, 19 Nov 1981 08:52:00 GMT 
        [Cache-Control] => no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
        [Pragma] => no-cache 
        [Vary] => Accept-Encoding 
        [Connection] => close 
        [Content-Type] => text/html 
)

このサイトは Content-Type を提供していますが、Content-Length を提供していません。コンテンツの長さをApacheに尋ねるにはどうすればよいですか。

更新: http://urivalet.com/はコンテンツの長さを取得できます。私はこれを必要とする。

ヘッダーでページのCRCコードを取得できれば。それは完璧です。しかし、これはロングショットだと思います。

4

2 に答える 2

1

関数thereAreChanges($url)では、次のことができます。

  1. If-modified-since最後にページにアクセスした時刻をパラメーターとしてリクエスト送信ヘッダーを送信する場合。304変更されていない場合、このヘッダーはステータス コードを返します。
  2. 応答のヘッダーを確認Last-Modifiedし、現在保存されているページの最終更新日と比較してください。コンテンツが新しい場合は、それを取得します。
  3. 可能であればHEAD、それらのヘッダーでリクエストを実行してください。GETすべてのコンテンツを提供します。ただし、HEADヘッダーのみを返します。このようなクエリでは、ヘッダーのみが必要です。
  4. 4.

クローラーと検索エンジンのフレームワークを作成するよりも、既存のクローラーと検索エンジンのフレームワークを使用することをお勧めします。

Apaches Nutchを使用して Web ページをクロールし、Solrを使用してインデックス付きページを検索します。Solr は、PHP でクエリを実行できる HTTP インターフェイスを提供します。柔軟性を高めるために、Luceneを使用できます。

Nutch と Solr のセットアップ方法に関するチュートリアルを次に示します。

于 2013-01-07T07:45:27.877 に答える
0

解決策は'header'=>"Accept-Encoding: gzip"

そのため、ヘッダーはContent-Lengthを返しません。このパラメーターページでは、content-lengthが返されます。

于 2013-01-08T10:35:46.227 に答える