我正在编写一个代码,它是一个爬网程序,但我希望它能爬网所有具有相同基础的链接。例如,如果你设置了一个大深度,并且你的页面中有一个链接到你的推特,它会扫描推特,并给你像twitter.com.xxxxyyyzzz这样的结果。
我想要的是限制代码只能抓取具有相同基础的url。我不介意在一个新变量中再次设置域。
过滤结果并在最后只显示正确的链接不是合适的方式。想象一下,如果你找到1000个链接,而你只想要10个。
谢谢你的想法。(正确的代码在答案中)
修改
试试这个尺寸的
function crawl_page($url, $depth = 2) {
static $seen = array();
if (isset($seen[$url]) || $depth == 0) {
return;
}
$seen[$url] = true;
$parts = parse_url($url);
$dom = new DOMDocument('1.0');
if (!$parts || !@$dom->loadHTMLFile($url)) {
return;
}
$anchors = $dom->getElementsByTagName('a');
foreach ($anchors as $anchor) {
$href = $anchor->getAttribute('href');
$path = false;
if (0 !== strpos($href, 'http') && 0 !== strpos($href, 'javascript:')) {
$path = '/' . ltrim($href, '/');
if (extension_loaded('http')) {
$path = http_build_url($url, array('path' => $path));
}
else {
$href = "{$parts['scheme']}://";
if (isset($parts['user'])) {
$href .= $parts['user'];
if (isset($parts['pass'])) {
$href .= ":{$parts['pass']}";
}
$href .= '@';
}
$href .= $parts['host'];
if (isset($parts['port'])) {
$href .= ':' . $parts['port'];
}
$path = $href . $path;
}
}
else {
$href_parts = parse_url($href);
if($href_parts['host'] == $parts['host'] && $href_parts['scheme'] == $parts['scheme']) {
$path = $href;
}
}
if (!empty($path) && $depth - 1 != 0) {
crawl_page($path, $depth - 1);
}
}
echo "Crawled: {$url}n";
}