如何获得PowerShell网站的网址并查看此页面的所有链接(抓取)

时间:2016-04-08 19:32:53

标签: powershell web-crawler

嗨,我正试图在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获取整个网络,我只想要我正在寻找的网址。

提前致谢

1 个答案:

答案 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连接。