我正在创建一个网站蜘蛛,它抓取网页上的所有链接以及该网页的html源代码。然后它会检查它找到的所有链接,并仅保留内部链接。接下来,它将转到每个内部页面并重复上述过程。
基本上,它的工作是抓取指定域下的所有页面并抓取每个页面的源代码。现在的原因是,我想运行一些检查以查看是否在任何页面上找到了这个或那个关键字,以及列出每个页面的元信息。
我想知道是否应该在每个页面的爬行阶段对html运行这些检查,或者我是否应该将所有html保存在数组中,并在最后运行检查。哪个性能会更好?
答案 0 :(得分:0)
如果您尝试保存所有数据(在内存中)以便以后处理,似乎很可能会遇到内存问题。您可以使用curl_multi_*
函数在提取时有效地处理。
答案 1 :(得分:0)
您应该使用phpQuery或QueryPath或此处列出的替代方案之一:How do you parse and process HTML/XML in PHP?
这简化了获取页面以及提取链接的过程。基本上你只需要:
$page = qp("http://example.org/"); // QueryPath
foreach ($page->find("a") as $link) {
print $link->attr("href");
// test if local link, then fetch next page ...
}
phpQuery还有一些简化抓取功能(将本地链接转换为绝对网址等)。但是你必须查阅文档。而且你可能还需要一个更好的递归appraoch,也许还有一个页面/ url堆栈可供使用:
$pool = array();
$pool[] = "http://example.com/first-url.html"; // to begin with
while ($url = array_pop($pool)) {
// fetch
// add found links to $pool[] = ...
// (but also make a $visited[] list, to avoid neverending loop)
}
这是你不应该过度优化的东西。将其作为独立脚本运行,并单独处理每个页面。