Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


jack_nuclear, итак, по порядку.

Во-первых, это ни разу не «отдаётся страница для роботов». Это обычное содержимое, который получает любой клиент в ответ на свой http-запрос. Это надо Вам чётко и точно понимать.

Во-вторых, после того, как данное содержимое получено, для клиентов, наподобие wget.exe, curl.exe, менеджеров загрузки и т.п. всё закончено. По мета-тэгам (или строя свои собственные предположения при отсутствии оных) они определяют, что именно им, собственно, было передано, сохраняют (возможно, перекодировав) это содержимое в файл потребного формата и заканчивают на этом свою работу. Они не занимаются ни парсингом содержимого, ни его размещением в окне — рендеринг (если это содержимое — html), ни исполнением скриптов.

Другое дело — браузеры. Получив содержимое, они начинают его парсить, выявляя все внешние вставки (например, ссылки на таблицы стилей, ссылки на изображения, ссылки на скрипты и т.п.) и загружая их. После чего начинают размещение содержимого в своём окне. Затем, когда доходит дело, начинается исполнение скриптов, которое может вмешиваться непосредственно и в само содержимое html-страницы, подчас радикально меняя его. В том числе, появляющиеся в содержимом новые скрипты могут перезапускать весь процесс заново.

В Вашем примере именно это и происходит — ссылка с классом ModDetails_hidden--2Rtru не содержится непосредственно в полученном html-коде страницы, а генерируется скриптом на клиенте, исполняющемся в браузере.

Посему, можно сделать, например, так:
Скрытый текст
Код: Выделить весь код
Set-Variable -Name 'READYSTATE_COMPLETE' -Option 'Constant' -Value 4

$oIE = New-Object -ComObject 'InternetExplorer.Application'

$oIE.Navigate("https://wgmods.net/22/")

for($i = 0; $i -le 5; $i++) { 
    do {
        Start-Sleep -Milliseconds 100
    } until((-not $oIE.Busy) -and ($oIE.ReadyState -eq $READYSTATE_COMPLETE))
}

$oDocument = $oIE.Document
$oHtmlElement = $oDocument.GetElementsByClassName("ModDetails_hidden--2Rtru")[0]

Write-Host "HRef:     $($oHtmlElement.href)"

$oIE.Quit()


Предугадать заранее, сколько приседаний «Ку»:
Скрытый текст
Код: Выделить весь код
for($i = 0; $i -le 5; $i++) { 
    do {
        Start-Sleep -Milliseconds 100
    } until((-not $oIE.Busy) -and ($oIE.ReadyState -eq $READYSTATE_COMPLETE))
}

понадобится сделать, пока в теле страницы не появится потребный элемент, в общем и целом — невозможно.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:38, 15-12-2019 | #8