1

PHP と cURL ライブラリを使用して、最初のクローラーを作成しようとしています。私の目的は、1 つのサイトから体系的にデータを取得することです。つまり、コードは特定のサイトのすべてのハイパーリンクをたどるのではなく、特定のリンクのみをたどります。

私のコードのロジックは、メイン ページに移動して、いくつかのカテゴリのリンクを取得し、それらを配列に格納することです。完了すると、クローラーはページ上のこれらのカテゴリ サイトに移動し、カテゴリに複数のページがあるかどうかを調べます。その場合、サブページも別の配列に格納します。最後に、配列をマージして、クロールが必要なサイトのすべてのリンクを取得し、必要なデータのフェッチを開始します。

以下の関数を呼び出して cURL セッションを開始し、データを変数にフェッチします。変数は後で DOM オブジェクトに渡し、Xpath で解析します。cURL total_time と http_code をログ ファイルに保存します。

問題は、クローラーが 5 ~ 6 分間実行されてから停止し、サブページに必要なすべてのリンクをフェッチしないことです。配列の内容を出力して結果を確認します。ログに http エラーが表示されません。すべてのサイトで http 200 ステータス コードが返されます。localhost で PHP デバッグを有効にしても、PHP 関連のエラーは表示されません。

リクエストが多すぎるため、数分後にサイトがクローラーをブロックすると思いますが、よくわかりません. より詳細なデバッグを取得する方法はありますか? 後で同じメカニズムを使用して 100 を超える他のサイトからコンテンツを取得したくないので、PHP はこの種の活動に適していると思いますか?

私のcURLコードは次のとおりです。

function get_url($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch, CURLOPT_URL, $url);
    $data = curl_exec($ch);
    $info = curl_getinfo($ch);  
    $logfile = fopen("crawler.log","a");
    echo fwrite($logfile,'Page ' . $info['url'] . ' fetched in ' . $info['total_time'] . ' seconds. Http status code: ' . $info['http_code'] . "\n");
    fclose($logfile);
    curl_close($ch);

    return $data;
}

// Start to crawle main page.

$site2crawl = 'http://www.site.com/';

$dom = new DOMDocument();
@$dom->loadHTML(get_url($site2crawl));
$xpath = new DomXpath($dom);
4

2 に答える 2

1

set_time_limitを使用して、スクリプトを実行できる時間を延長します。そのためFatal error: Maximum execution time of 30 seconds exceeded、エラー ログが表示されます。

于 2013-01-01T12:12:15.673 に答える
0

これをサーバー上で実行する必要がありますか? そうでない場合は、php の cli バージョンを試す必要があります。これは、一般的な制限から除外されています。

于 2012-12-31T21:15:52.983 に答える