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);