Соскрести ссылки с https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/ADV990001 - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь почистить эту веб-страницу: https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/ADV990001, специально пытаюсь получить последний Article # из таблицы для Windows Server 2016 (или, наоборот, таблицу меньшего размера, получая соответствующуюНомер пакета SSU), который сегодня будет 4465659.

Я работаю над сценарием для автоматизации получения этого последнего обновления стека обслуживания, а также последнего накопительного обновления для Windows Server 2016. У меня естьСекция накопительного обновления работает, но тот же подход не дает результата по вышеуказанной ссылке.

Для справки, мой подход накопительного обновления приведен ниже.Он анализирует страницу, выполняет несколько настроек и в итоге получает KBID, который я могу вставить в скрипт загрузки, который, как я знаю, работает.Проблема, связанная с использованием этой ссылки выше, заключается в том, что содержимое страницы, по-видимому, динамически заполняется из другого места, поэтому я не могу получить никакого реального содержимого таблицы, возвращаемого в PowerShell, из которого я мог бы продолжить опрос.

Кроме того, мне нужно -UseBasicParsing, так как он выполняется на Windows Server, возможно, с IE вне изображения.

Спасибо!Мэтт

$buildVersion = "14393"
$kbID = (Invoke-WebRequest -Uri 'https://support.microsoft.com/en-us/help/4000825' -UseBasicParsing).RawContent -split "`n"
$kbID = ($kbID | Where-Object { $_ -like "*heading*$buildVersion*" } | Select-Object -First 1)
$kbID = ((($kbID -split "KB", 2)[1]) -split "\s", 2)[0]

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Вы не можете сделать это без вызова IE или использования какой-либо другой автоматизации пользовательского интерфейса.Если вы не зашли на страницу до того, как вам будет предложено принять первую страницу.

Как только вы нажмете этот URL: https://support.microsoft.com/en-us/help/4000825

.. вы окажетесь здесь:

https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/ADV990001

Когда главный источник этой страницы непосредственно не содержит таблицу, если вы осмотрите элемент таблицы, то увидите ссылки, и даже они приведут вас к Страница каталога MS в качестве поиска, с которым вам затем придется взаимодействовать (и если вы еще не заходили на эту страницу, это также заставит вас принять и эту страницу).Таким образом, этот материал обрабатывается только с помощью браузера.

Таким образом, это означает, что, просто добравшись до таблицы (исключая все шаги принятия), вы получите что-то похожее на приведенное ниже с использованием IE.Я не собираюсь действовать по этому первому URL, поскольку вы уже имеете дело с этим.

# Get all tables on a web page.
$Url1 = 'https://support.microsoft.com/en-us/help/4000825'
$Url2 = 'https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/ADV990001'

$ie = New-Object -com InternetExplorer.Application
while ($ie.Busy) {Sleep 1}

$ie.navigate($Url2)
while ($ie.Busy) {Sleep 1}

$KBTable = ForEach ($table in $ie.Document.getElementsByTagName('table')){ $table }
$KBPattern = 'https.*KB\d{7}'
[regex]::Matches(($KBTable | ConvertTo-Xml).Objects.Object.Property.'#text',$KBPattern).Value

# Results
https://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4093430
https://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4093430
https://catalog.update.microsoft.com/v7/site/Search.aspx?q=KB4465659

… тогда, конечно, поступайте с этими ссылками, как хотите.

0 голосов
/ 23 декабря 2018

Вы не можете сделать это с простым http-клиентом, потому что эта страница запускает некоторый javascript и более того, сначала перенаправляет вас на страницу eula, которую вы должны проверить / принять.Вы можете погулять по API, возвращая те же данные или другой источник со статическим html.

Если нет - вы все равно можете его автоматизировать, но вам нужно будет использовать реальный браузер.Я предполагаю, что самый популярный способ сделать это - использовать Selenium (он будет использовать FireFox, Chrome или IE).Возможно, есть какой-то другой безголовый браузер.

Ниже приведено решение с Firefox (установите его, если еще нет), но я верю, что вы можете сделать это и с другими браузерами.Вам также понадобится драйвер C # (WebDriver.dll, он находится внутри Selenium.WebDriver.3.14.0.nupkg) и Mozilla GeckoDriver (geckodriver.exe).Вы можете скачать его здесь: https://www.seleniumhq.org/download/

Поместите все файлы в одну папку с вашим скриптом PowerShell.Сценарий ниже:

Add-Type -Path "C:\stack\selenium\WebDriver.dll"

$driver = [OpenQA.Selenium.Firefox.FirefoxDriver]::new()

$driver.manage().timeouts().ImplicitWait = [timespan]::FromSeconds(5)

$driver.Navigate().GoToUrl("https://portal.msrc.microsoft.com/en-us/security-guidance/advisory/ADV990001")

$driver.FindElementByCssSelector(".ng-untouched").Click()  # check eula box 

$driver.FindElementByCssSelector(".btn-primary").Click()   # click accept button

#select rows of the seconds table
$data = $driver.FindElementsByTagName("table")[1].FindElementsByTagName("tr").text

$driver.quit()

$data | Select-String "Windows Server 2016"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...