php - 用于测试页面上所有链接的递归函数
问题描述
我正在编写来自整个网站的爬虫链接,包括子页面,遇到了一个小问题。我想出了使用递归函数的想法,因为我要扫描的页面有几个层次。它的结构或多或少看起来像这样:
Level 1 reference
- Second level reference
-- Third level reference
-- Third level reference
- Second level reference
-- Third level reference
-- Third level reference
-- Third level reference
--- Level four reference
被测试的链接下是否隐藏了更多或更少的东西从来都不是很清楚,因此我想出了递归函数的想法。
它需要一个指向主页的链接,获取第一个链接,如果其中的链接数大于一个,则表示相同的功能。
不幸的是,出了点问题,我得到一个空的白板,我该如何解决?
function scanWebsite($url) {
$html = file_get_contents($url);
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$nodes = $xpath->query("/html/body//a");
$output = [];
foreach($nodes as $node) {
$url = $node->getAttribute("href");
if(count($nodes) > 1) {
scanWebsite("http://samplewebsite.com" .$url);
} else {
if(preg_match("/\/title\/.*\//", $url)) {
array_push($output, $url);
}
continue;
}
}
return $output;
}
echo '<pre>';
print_r(scanWebsite("http://samplewebsite.com"));
echo '</pre>';
解决方案
推荐阅读
- python - 如何使用 python 对使用 android 应用录制的音频执行应用内音频处理?
- python - 如何检查哪个线程首先返回结果
- ignite - 集群范围的未定义行为 [threadName=data-streamer-stripe
- android - FirebaseDatabase 查询 - 过滤日期高于现在的位置
- node.js - TypeError: trackerFn(...).registerTensor 不是函数
- plc - 在 Codesys 中,如何定义预处理器参数?
- c# - ListBox 未填充 BindingSource
- rust - 结果中的“T”代表什么
在锈? - amazon-web-services - 当 2 个 Java Lambda 函数相互通信时,它们是否必须在同一个 VPC 中?
- java - 我在 OnResume() 而不是 OnCreate() 中有我必要的代码,但是当我去另一个活动然后返回时,ListView 中的数组数据仍然消失