如何使用 powershell 获取网站的 url 并查看该页面的所有链接(爬网)
How can i get the url of a website with powershell and look all the links of this page ( crawl)
您好,我正在尝试让蜘蛛在 Powershell 中爬行。
它列出了网络中所有 url 的列表,对于每个 url,它根据深度
查找所有 url 等等
我有这个
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
}
问题是当我尝试递归地进入另一个 url
Get-DepthURL ("$link", $top)
变量 $link 获取整个网络,我只想要我正在查找的 url。
提前致谢
您的脚本目前存在一些问题。
首先让它工作,因为循环逻辑不会像这样工作。此外,如果您创建了一个额外的函数并将 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 个链接的非常简单的 URL 也会很快变成非常大的抓取。
其他问题(我还没有解决)
如果有任何循环引用,它们将永远跟随在一个圆圈中,我敢猜测您正在抓取的页面有循环引用,大多数网站都有。
相对链接将无法正确解析,因此会抛出错误,并且在您的原始代码中会导致循环中发生奇怪的事情。
最后请记住,链接可以指向 Web 上的任何资源(图像、javascript、电影),并且链接本质上可能是动态的,并通过 javascript 连接起来。
您好,我正在尝试让蜘蛛在 Powershell 中爬行。 它列出了网络中所有 url 的列表,对于每个 url,它根据深度
查找所有 url 等等我有这个
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
}
问题是当我尝试递归地进入另一个 url
Get-DepthURL ("$link", $top)
变量 $link 获取整个网络,我只想要我正在查找的 url。
提前致谢
您的脚本目前存在一些问题。
首先让它工作,因为循环逻辑不会像这样工作。此外,如果您创建了一个额外的函数并将 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 个链接的非常简单的 URL 也会很快变成非常大的抓取。
其他问题(我还没有解决)
如果有任何循环引用,它们将永远跟随在一个圆圈中,我敢猜测您正在抓取的页面有循环引用,大多数网站都有。
相对链接将无法正确解析,因此会抛出错误,并且在您的原始代码中会导致循环中发生奇怪的事情。
最后请记住,链接可以指向 Web 上的任何资源(图像、javascript、电影),并且链接本质上可能是动态的,并通过 javascript 连接起来。