Использование Invoke-WebRequest для массива в PowerShell - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь написать скрипт, который будет извлекать URL-адреса состояния 100 из здесь , помещать их в массив, а затем писать пространство выполнения, которое использует Invoke-WebRequest для получения содержимого этих URL-адресов изаписывает это содержимое в файл.Вот код, который у меня есть:

#Importing Modules
Import-Module PoshRSJob

#variable declaration
$page = Invoke-WebRequest https://www.zyxware.com/articles/4344/list-of-fortune-500-companies-and-their-websites
$links = $page.Links
$tables = @($page.ParsedHtml.GetElementsByTagName("TABLE"))
$tableRows = $tables[0].Rows

#loops through the table to get only the top 100 urls.
$urlArray = @()

foreach ($tablerow in $tablerows) {
    $urlArray += New-Object PSObject -Property @{'URLName' = $tablerow.InnerHTML.Split('"')[1]}
    #Write-Host ($tablerow.innerHTML).Split('"')[1]
    $i++
    if ($i -eq 101) {break}
}

#Number of Runspaces to use
#$RunspaceThreads = 1

#Declaring Variables 
$ParamList = @($urlArray)
$webRequest = @()

$urlArray | start-rsjob -ScriptBlock {
    #$webRequest = (Invoke-WebRequest $using:ParamList)
    #Invoke-WebRequest $urlArray
    #Invoke-WebRequest {$urlArray}
    #Get-Content $urlArray
} 

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу получить Invoke-WebRequest или Get-Content, чтобы дать мне содержимоеURL, которые на самом деле содержатся в массиве.Вы можете видеть, что в блоке сценария я закомментировал некоторые строки, которые не работали.

Мой вопрос: используя пространство выполнения, что мне нужно сделать, чтобы получить данные со всех URL-адресов в массивеиспользуя Get-Content, а затем записать это в файл?

1 Ответ

0 голосов
/ 28 апреля 2018

Вы можете настроить текущий запрос, чтобы получить первые 100 названий компаний.Это пропускает пустую компанию на фронте.Попробуйте использовать [PSCustomObject] @{ URLName = $url }, который заменит устаревшую New-Object PSObject.

$urlArray = @()
$i = 0
foreach ($tablerow in $tablerows) {
    $url = $tablerow.InnerHTML.Split('"')[1]
    if ($url) {
        # Only add an object when the url exists
        $urlArray += [PSCustomObject] @{ URLName = $url }
        $i++
        if ($i -eq 100) {break}
    }
}

Для параллельного выполнения запросов используйте Start-RSJob с блоком сценария.Invoke-Webrequest затем выполняется параллельно.Обратите внимание, что в этом примере $_ относится к текущему элементу массива, который передается по конвейеру и состоит из объекта со свойством URLName, но вам нужно быть немного осторожнее с тем, какие переменные вы используете в блоке сценариев, потому что они могут не восстанавливатьсяони ожидают, что они будут такими.

# Run the webrequests in parallel
# $_ refers to a PSCustomObject with the @{ URLName = $url } property
$requests = ($urlArray | start-rsjob -ScriptBlock { Invoke-WebRequest -Uri $_.URLName })

Затем можно дождаться завершения всех заданий и выполнить некоторую постобработку результатов.Здесь пишется только длина содержимого сайта, потому что сами страницы являются длинными.

# Get the results
# $_.Content.Length gets the length of the content to not spam the output with garbage
$result = Get-RSjob | Receive-RSJob | ForEach { $_.Content.Length }
Write-Host $result
...