0

基本的なウェブスクレイピングを使用して、ユーザーの検索エクスペリエンスを容易にする価格比較用のデータベースを準備しようとしています。今、私はいくつかの質問があります:

必要なWebページのコンテンツを使用file_get_contents()または取得する必要がありますか?curl

$link = "http://xyz.com";
$res55 = curl_init($link);
curl_setopt ($res55, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($res55, CURLOPT_FOLLOWLOCATION, true); 
$result = curl_exec($res55);

さらに、Webページをクロールするたびに、次にアクセスするリンクをたくさん取得します。これには長い時間がかかる場合があります(Ebayのような大きなWebサイトをクロールする場合は数日かかります)。その場合、私のPHPコードはタイムアウトになります。これを行うための自動化された方法は何ですか?サーバーに変更を加えることでPHPがタイムアウトするのを防ぐ方法はありますか、それとも別の解決策がありますか?

4

5 に答える 5

7

したがって、その場合、私のPHPコードはタイムアウトになり、それほど長くは続きません。

あなたはあなたのウェブページを動かしているコードでこれをしていますか?つまり、誰かがリクエストを出したとき、あなたはその場でクロールしてレスポンスを構築していますか?もしそうなら、はい、間違いなくより良い方法があります。

クロールする必要のあるサイトのリストがある場合は、スケジュールされたジョブ(たとえば、 cronを使用)を設定して、サイトをクロールするコマンドラインアプリケーション(Webページではない)を実行できます。その時点で、探しているデータを解析してデータベースに保存する必要があります。その場合、サイトはそのデータベースを指す必要があります。

これは2つの理由で改善されています。

  1. パフォーマンス
  2. コードデザイン

パフォーマンス: Webサイトのような要求/応答システムでは、I/Oのボトルネックを最小限に抑える必要があります。応答にはできるだけ時間がかからないようにする必要があります。したがって、可能な限りインライン作業を避けたいと考えています。このプロセスをWebサイトのコンテキスト外の何かにオフロードし、ローカルデータベースを使用することで、一連の外部サービス呼び出し(低速)を単一のローカルデータベース呼び出し(はるかに高速)に変えることができます。

コード設計: 関心の分離。このセットアップは、コードをもう少しモジュール化します。データのフェッチを担当するモジュールと、データの表示を担当するモジュールがあります。どちらも、相手がそのタスクをどのように実行するかを知る必要も、気にする必要もありません。したがって、一方を交換する必要がある場合(より良いスクレイピング方法を見つけるなど)、もう一方も変更する必要はありません。

于 2012-08-06T19:23:42.897 に答える
3

カールは良いオプションです。file_get_contentsは、サーバー上のファイルを読み取るためのものです

無制限のタイムアウトを設定するために、curlのタイムアウトを0に設定できます。Apacheでもタイムアウトを設定する必要があります

于 2012-08-06T19:18:49.120 に答える
3

ウェブサイトのコンテンツを読むにはcurlをお勧めします。

PHPスクリプトのタイムアウトを回避するには、を使用できますset_time_limit。これの利点は、メソッドを呼び出すと以前のタイムアウトカウントダウンがリセットされるため、すべてのサーバー接続のタイムアウトを設定してスクリプトを終了できることです。パラメータとして0が渡された場合、時間制限は適用されません。

または、php構成プロパティmax_execution_timeでタイムアウトを設定できますが、これはクローラーだけでなくすべてのphpスクリプトに適用されることに注意してください。

http://php.net/manual/en/function.set-time-limit.php

于 2012-08-06T19:21:14.373 に答える
3

柔軟性が大幅に向上し、cURLを使用して圧縮とhttpキープアライブを有効にできるため、cURLを選択します。

しかし、なぜ車輪の再発明をするのでしょうか。PHPCrawlをチェックしてください。ソケット(fsockopen)を使用してURLをダウンロードしますが、一度に複数のクローラーをサポートし(Linuxの場合)、おそらくすべてのニーズを満たすクロールのオプションが多数あります。彼らはあなたのためにもタイムアウトを処理し、基本的なクローラーに利用できる良い例を持っています。

于 2012-08-06T19:21:36.290 に答える
2

ここで車輪の再発明を行うこともできますが、PHPCrawlSphiderのようなフレームワークを見てみませんか?(後者はあなたが探しているものと正確に一致しないかもしれませんが)

ドキュメントfile_get_contentsよると、サーバー上のファイルの読み取りに最適であるため、代わりに使用することを強くお勧めしますcurl。タイムアウトの問題を修正することに関してset_time_limitは、あなたが望むオプションです。set_time_limit(0)スクリプトがタイムアウトするのを防ぐ必要があります。

ただし、Apacheでもタイムアウトを設定する必要があります。を編集httpd.confし、読み取り行を変更しTimeoutTimeout 0、無限のタイムアウトを実現します。

于 2012-08-06T19:20:20.060 に答える