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

我建议制作一个函数来进行实际的简单 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
}

希望有帮助。

于 2011-07-02T00:04:57.783 回答
1

你在这里做了很多,我对脚本超时并不感到惊讶。您下载多个网页,解析它们,在其中找到图像,然后下载这些图像……多少页,每页有多少图像?除非我们谈论的数字非常小,否则这是可以预料的。

鉴于此,我不确定您的问题到底是什么,但我假设它是“我该如何完成这项工作?”。你有几个选择,这真的取决于这是为了什么。如果刮掉一些网站是一次性的,增加内存和时间限制,也许把工作分块做一点,下次用更合适的东西写它;)

如果这是发生在服务器端的事情,它可能应该与用户交互异步发生 - 即,而不是用户请求某个页面,它必须在返回之前完成所有这些,这应该发生在后台。它甚至不必是 PHP,你可以有一个以任何语言运行的脚本,它可以通过传递的东西来抓取并执行它。

于 2011-02-01T14:11:23.463 回答