1

我正在开发一个需要抓取用户提交的网站的一部分的应用程序。我想从网站上收集有用且可读的内容,而不是整个网站。如果我查看也执行此操作的应用程序(例如thinkery),我注意到它们以某种方式设法创建了一种抓取网站的方法,尝试猜测有用的内容是什么,以可读的格式显示它,它们做得非常快.

我一直在玩 cURL,我已经接近我想要的结果,但我有一些问题,想知道是否有人有更多的见解。

    $ch = curl_init('http://www.example.org');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // $content contains the whole website
    $content = curl_exec($ch);

    curl_close($ch);

使用上面非常简单的代码,我可以抓取整个网站,使用 preg_match() 我可以尝试查找包含字符串“content”、“summary”等的类、id 或属性的 div。

如果 preg_match() 有结果我可以相当猜测我找到了相关内容并将其保存为已保存页面的摘要。我遇到的问题是 cURL 将整个页面保存在内存中,因此这会占用大量时间和资源。而且我认为对如此大的结果执行 preg_match() 也会占用大量时间。

有没有更好的方法来实现这一目标?

4

1 回答 1

1

我按照 One Trick Pony 的建议尝试了 DomDocument::loadHTMLFile(谢谢!)

    $ch = curl_init('http://stackoverflow.com/questions/17180043/extracting-useful-readable-content-from-a-website');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $content = curl_exec($ch);
    curl_close($ch);
    $doc = new DOMDocument();
    @$doc->loadHTML($content);

    $div_elements = $doc->getElementsByTagName('div');

    if ($div_elements->length <> 0)
    {
        foreach ($div_elements as $div_element) 
        {
            if ($div_element->getAttribute('itemprop') == 'description')
            {
                var_dump($div_element->nodeValue);

            }
        }
    }

上面代码的结果是我在这个页面上的问题!剩下要做的就是找到一种良好且一致的方法来循环或查询 div 并确定它是否是有用的内容。

于 2013-06-18T23:12:37.540 回答