0

単純なhtml domを使用してページごとにすべての画像を保存し、画像クラスを取得するための単純なパーサーを作成しましたが、ページごとに渡すためにループ内にループを作成する必要があり、コードで何かがそのまま最適化されていないと思います非常に遅く、常にタイムアウトまたはメモリ超過が発生します。誰かがコードをざっと見ただけで、私が作った本当にばかげたものを見ることができますか?

ライブラリが含まれていないコードは次のとおりです...

$pageNumbers = array(); //Array to hold number of pages to parse

$url = 'http://sitename/category/'; //target url
$html = file_get_html($url);


//Simply detecting the paginator class and pushing into an array to find out how many pages to parse placing it into an array
foreach($html->find('td.nav .str') as $pn){
    array_push($pageNumbers, $pn->innertext);               
}

// initializing the get image class
$image = new GetImage;
$image->save_to = $pfolder.'/'; // save to folder, value from post request.

//Start reading pages array and parsing all images per page.
foreach($pageNumbers as $ppp){

    $target_url = 'http://sitename.com/category/'.$ppp; //Here i construct a page from an array to parse.
    $target_html = file_get_html($target_url); //Reading the page html to find all images inside next.

    //Final loop to find and save each image per page.
    foreach($target_html->find('img.clipart') as $element) {
        $image->source = url_to_absolute($target_url, $element->src);
        $get = $image->download('curl'); // using GD
        echo 'saved'.url_to_absolute($target_url, $element->src).'<br />';           
    }

}

ありがとうございました。

4

2 に答える 2

2

実際の単純なhtmldom処理を実行する関数を作成することをお勧めします。私は通常、次の「テンプレート」を使用します...「メモリのクリア」セクションに注意してください。どうやらPHP5にはメモリリークがあります...少なくともどこかでそれを読みました。

function scraping_page($iUrl)
{
    // create HTML DOM
    $html = file_get_html($iUrl);

    // get text elements
    $aObj = $html->find('img');

    // do something with the element objects

    // clean up memory (prevent memory leaks in PHP 5)
    $html->clear();  // **** very important ****
    unset($html);    // **** very important ****

    return;  // also can return something: array, string, whatever
}

お役に立てば幸いです。

于 2011-07-02T00:04:57.783 に答える
1

ここでかなり多くのことを行っていますが、スクリプトがタイムアウトしても驚かないでしょう。複数の Web ページをダウンロードし、それらを解析し、それらの画像を検索してから、それらの画像をダウンロードします... 何ページ、1 ページあたり何枚の画像ですか? 非常に小さな数字でない限り、これは当然のことです。

それを考えると、あなたの質問が実際に何であるかはわかりませんが、「これを機能させるにはどうすればよいですか?」だと思います。いくつかのオプションがありますが、これが何のためにあるかによって異なります。いくつかのサイトをスクレイピングするための 1 回限りのハックである場合は、メモリと時間の制限を増やし、作業を少しずつ分割して、次回はより適切な方法で記述します ;)

これがサーバー側で発生する場合は、おそらくユーザーの操作とは非同期に発生するはずです。つまり、ユーザーが何らかのページを要求し、戻る前にこれらすべてを実行する必要があるのではなく、バックグラウンドで発生するはずです。PHP である必要さえありません。スクレイプに渡されたものを取得して実行するスクリプトを任意の言語で実行することができます。

于 2011-02-01T14:11:23.463 に答える