我正在开发一个需要抓取用户提交的网站的一部分的应用程序。我想从网站上收集有用且可读的内容,绝对不是整个网站。如果我查看同样执行此操作的应用程序(例如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将WHOLE页面保存在内存中,因此这会占用大量的时间和资源。而且我认为在这么大的结果上做一个preg_match()也会花费很多时间。
有没有更好的方法来实现这一目标?
答案 0 :(得分:1)
我尝试将DomDocument :: loadHTMLFile作为One Trick Pony建议(谢谢!)
$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并确定它是否是有用的内容。