PHP解析与简单的_html_dom,请检查

PHP解析与简单的_html_dom,请检查,php,html,dom,parser-generator,Php,Html,Dom,Parser Generator,我用简单的html dom和get image类制作了一个简单的解析器,用于保存每页的所有图像,但为了逐页传递,我必须在循环中创建一个循环,我认为我的代码中有一些东西没有优化,因为它非常慢,并且总是超时或内存超出。有人能不能快速看一下代码,也许你会看到我做的一些非常愚蠢的事情 这是不包含库的代码 $pageNumbers = array(); //Array to hold number of pages to parse $url = 'http://sitename/category/';

我用简单的html dom和get image类制作了一个简单的解析器,用于保存每页的所有图像,但为了逐页传递,我必须在循环中创建一个循环,我认为我的代码中有一些东西没有优化,因为它非常慢,并且总是超时或内存超出。有人能不能快速看一下代码,也许你会看到我做的一些非常愚蠢的事情

这是不包含库的代码

$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 />';           
    }

}
$pageNumbers=array()//数组以容纳要分析的页数
$url='1http://sitename/category/'; //目标url
$html=file\u get\u html($url);
//只需检测paginator类并将其放入一个数组中,就可以找到要解析的页面数并将其放入一个数组中
foreach($html->find('td.nav.str')作为$pn){
数组推送($pageNumbers,$pn->innertext);
}
//初始化get image类
$image=newgetimage;
$image->save_to=$pfolder./';/保存到文件夹,值来自post请求。
//开始读取pages数组并解析每页的所有图像。
foreach(页码为$ppp){
$target\u url='1http://sitename.com/category/“.$ppp;//这里我从一个数组构造一个要解析的页面。
$target_html=file_get_html($target_url);//读取页面html以查找下一页中的所有图像。
//最终循环以查找和保存每页的每个图像。
foreach($target\u html->find('img.clipart')作为$element){
$image->source=url\u to\u absolute($target\u url,$element->src);
$get=$image->download('curl');//使用GD
回显“已保存”。url指向绝对值($target\uURL,$element->src)。“
”; } }

谢谢。

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

考虑到这一点,我不确定你的问题到底是什么,但我假设它是“我如何使这项工作有效?”。你有几个选择,这真的取决于这是为了什么。如果这是一个一次性的黑客行为,需要抓取一些站点,增加内存和时间限制,也许可以把工作分成几块做一点,下次再写一些更合适的内容;)


如果这是发生在服务器端的事情,那么它可能会异步发生在用户交互上,也就是说,而不是用户请求某个页面(返回之前必须执行所有这些操作),这应该发生在后台。它甚至不必是PHP,你可以用任何语言运行一个脚本,它可以把东西传递给scrape并执行它。

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

考虑到这一点,我不确定你的问题到底是什么,但我假设它是“我如何使这项工作有效?”。你有几个选择,这真的取决于这是为了什么。如果这是一个一次性的黑客行为,需要抓取一些站点,增加内存和时间限制,也许可以把工作分成几块做一点,下次再写一些更合适的内容;)


如果这是发生在服务器端的事情,那么它可能会异步发生在用户交互上,也就是说,而不是用户请求某个页面(返回之前必须执行所有这些操作),这应该发生在后台。它甚至不必是PHP,你可以用任何语言运行一个脚本,它可以把东西传递给scrape并执行它。

我建议创建一个函数来执行实际的简单html dom处理。 我通常使用以下“模板”。。。请注意“清除内存”部分。 显然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
}

希望能有所帮助。

我建议制作一个函数来完成实际的简单html dom处理。 我通常使用以下“模板”。。。请注意“清除内存”部分。 显然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
}

希望能有所帮助。

可能重复的可能重复的可能重复的感谢您指出我的代码很糟糕,基本上这就是问题,如果我只是用最糟糕的方式来做,尽管simple_html_dom类的存在正是为了我所做的,也许不是为了做这样的循环。那么从你的话来说,没有办法改进我到目前为止所做的?把整个东西删掉,从头开始?让我澄清一下,这并不糟糕。我一直在用Java+JSoup做刮片工作,如果我解决了这个问题,我的代码将与您的代码非常相似。这不是通常使用脚本语言处理的那种问题,脚本语言通常只有30秒的时间来完成任务。如果你能在比代码更高的层次上解释你的问题(例如,你到底想实现什么?),那么也许我可以就如何改进这一点提出更好的建议。我有分类,每个分类都分为页面,比如说,每个页面都有10个图像,我可以用img.clipart类来检测。所以,我们的想法是将这些图像废弃并保存到文件夹中。分类页面有一个分页器,所以我可以基本上找出分类中有多少页面,并一个接一个地从所有页面中删除图像。这是一次性的吗?在桌面上使用?或者这会在Web服务器上反复发生吗?谢谢你指出我的代码很糟糕,基本上这就是问题,如果我只是用最糟糕的方式来做,尽管simple_html_dom类的存在正是为了我所做的,也许不是为了做这样的循环。那么从你的话来说,没有办法改进我到目前为止所做的?把整个东西删掉,从头开始?让我澄清一下,这并不糟糕。我一直在用Java+JSoup做刮片工作,如果我在解决这个问题的话