嗨,我正试图在powershell中进行蜘蛛爬行。 它会列出网络中的所有网址,并为每个网址显示所有网址,根据深度等等
我有这个
Function Get-DepthURL ($url, $depth){
$count = 0
Write-Host “URL” $url
$Test = Invoke-WebRequest -URI $url
[int]$top=[int]$depth
$link=$Test.Links | Foreach {$_.href
if ($top -ne 0){
[int]$top=[int]$top-[int]1
Get-DepthURL ("$link", $top)
}
$count = [int]$count+[int]1
}
Write-Host “Number of Hrefs on URL=” $count
}
问题是当我尝试在另一个网址上递归时
Get-DepthURL ("$link", $top)
变量$ link获取整个网络,我只想要我正在寻找的网址。
提前致谢
答案 0 :(得分:0)
现在脚本存在一些问题。
首先让它工作,因为循环逻辑不会像这样工作。如果您创建了一个额外的函数并将foreach用作迭代器而不是管道(它还允许您使用更好的控制台日志记录),那么分析发生的事情会更清楚:
function Process-Link([string]$link, [int] $depth){
write-host -ForegroundColor DarkMagenta $depth $link
$result = [System.uri]$link
if ($result.IsAbsoluteUri -and $depth -ge 0){
[int]$depth--
Get-DepthURL $link $depth
}
}
Function Get-DepthURL ([string]$url, [int]$depth){
$Test = Invoke-WebRequest -URI $url
Write-Host -ForegroundColor Cyan “$depth Found " $Test.Links.Count " Links in URL $url"
$Test.Links | foreach { $_.href }
foreach($link in $Test.Links){
Process-Link $link.href $depth
}
}
#Get-DepthURL "http://foldingair.blogspot.com" 1
Get-DepthURL "https://faculty.cs.byu.edu/~rodham/cs240/crawler/index.html" 1
不要低估您的抓取速度和广度,即使只有9个链接的非常简单的网址很快就会变成非常大的抓取。
如果有任何循环引用,它们将永远围成一圈,我会冒险猜测你抓取的页面有循环引用,大多数网站都有。
相对链接无法正确解析,因此会抛出错误,并且在原始代码中会导致循环中出现奇怪的事情。
最后请记住,链接可以是网络上的任何资源(图片,javascript,电影),链接可能是动态的,也可以通过javascript连接。