Разбор PHP с simple_html_dom, пожалуйста, проверьте - PullRequest
0 голосов
/ 01 февраля 2011

Я сделал простой парсер для сохранения всех изображений на странице с простым 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 />';           
    }

}

Спасибо.

Ответы [ 2 ]

2 голосов
/ 02 июля 2011

Я предлагаю сделать функцию для выполнения простой простой обработки html dom. Я обычно использую следующий «шаблон» ... обратите внимание на раздел «очистить память». Очевидно, в PHP 5 есть утечка памяти ... по крайней мере, я где-то читал.

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
}

Надеюсь, это поможет.

1 голос
/ 01 февраля 2011

Вы делаете довольно много здесь, я не удивлен, что сценарий остановился. Вы загружаете несколько веб-страниц, анализируете их, находите в них изображения, а затем загружаете эти изображения ... сколько страниц и сколько изображений на странице? Если мы не говорим очень маленькие цифры, то этого следовало ожидать.

Я не уверен, что ваш вопрос на самом деле, учитывая это, но я предполагаю, что это "как я могу заставить эту работу?". У вас есть несколько вариантов, это действительно зависит от того, для чего это нужно. Если это одноразовый взлом, чтобы очистить некоторые сайты, увеличить память и ограничения по времени, возможно, немного разбить работу, а в следующий раз написать что-нибудь более подходящее;)

Если это происходит на стороне сервера, то, вероятно, это должно происходить асинхронно с взаимодействием с пользователем, то есть вместо того, чтобы пользователь запрашивал какую-либо страницу, которая должна сделать все это перед возвратом, это должно происходить в фоновом режиме. Это даже не должен был бы быть PHP, у вас мог бы быть скрипт, работающий на любом языке, который передает переданные вещи и делает это.

...