0

私はphp Webクローラーを持っていますが、localhostで実行すると、数ページ後にフリーズすることが多く、Webブラウザーに読み込み中のサインだけが表示されます。

コードを確認しましたが、エラーがある可能性があります..ただし、過去数時間コードを見た後、他の可能性を探る準備ができています.

私のスクレーパーが実行されているとき、さまざまなプロセスが開始および終了すると、情報がダンプされます。私も頻繁に flush(); します。ブラウザに最新のメッセージが表示されていることを確認します。(これにより、ブラウザにコンソール タイプの外観が与えられます)。

私が今 Apache の設定を調べている理由は、私のプログラムが常に同じ場所でフリーズするとは限らないからです。キューに追加する新しい URL の「a」タグを検索しているときにフリーズすることもあれば、この時点で xhtml データ自体をダウンロードするときにフリーズすることもあります。

 private function _getXhtml() {
        $curl = curl_init();
        if (!$curl) {
            throw new Exception('Unable to init curl. ' . curl_error($curl));
        }
        curl_setopt($curl, CURLOPT_URL, $this->_urlCurrent);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        // Faking user agent
        curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
        $xhtml = curl_exec($curl);
        if (!$xhtml) {
            $xhtml = null;
            echo 'PROBLEM' . $this->_urlCurrent . '<br />';
            //throw new Exception('Unable to read XHTML. ' . curl_error($curl));
        }
        curl_close($curl);
        return $xhtml;
    }

これらすべてに加えて、web スクレイピング用に localhost 環境を強化するために、apache の構成ファイルまたは PHP.ini に修正が加えられているかどうか疑問に思っています。

どんな助けでも大歓迎です。

アップデート:

Zend_Dom_Query に絞り込んだと思います。これが、アプリケーションがさまざまな段階でクラッシュする理由です (クロール リストの href を取得している場合や、ページ内の特定のものを「収集」するために探している場合があります)。

これが私の出力の例です。

ここでは、アプリケーションが最初のページでクラッシュしています.. URL の取得中に。

    string(25) "Scraping page number 0..." 
string(9) "Mining..." 
string(15) "Getting <a>...." 
string(24) "Finished getting <a>...." 
string(20) "Getting <a href>...." 
string(43) "Mining page http://www.a-site.co.uk/ ..." 
string(17) "New page found..." 
string(18) "Page confirmed...." 
string(29) "Finished Getting <a href>...." 
string(20) "Getting <a href>...." 
string(43) "Mining page http://www.a-site.co.uk/ ..." 
string(29) "Finished Getting <a href>...." 
string(20) "Getting <a href>...."

ここでは、要素の抽出中にアプリケーションが失敗しています

string(25) "Scraping page number 5..."
string(9) "Mining..."

//This bit loops for around 70 URLS
string(15) "Getting <a>...."
string(24) "Finished getting <a>...."
string(20) "Getting <a href>...."
string(48) "Mining page http://www.a-site.org ..."
string(29) "Finished Getting <a href>...."
//end loop

string(70) "Harvesting http://www.a.site.org/a-url-path/..."
string(19) "Harvesting html element..."
4

1 に答える 1

0

スクリプトは正常に見えるので、おそらくあなたがクロールしているサイトです追加してみてください

curl_setopt($curl, CURLOPT_CONNECTTIMEOUT ,5); //timeout in seconds.
curl_setopt($curl, CURLOPT_TIMEOUT, 30); //timeout in seconds.

スクレイパーを実際のブラウザーのように見せることもできます。個人的には、fiddler2 を使用して見つけることができる独自のヘッダーを使用してから、それらを curl で再作成します。

于 2013-02-04T13:16:44.050 に答える