Войти

Показать полную графическую версию : [решено] Вытащить описание с Youtube


DJ Mogarych
03-08-2020, 16:18
Привет!
Собственно, сабж. Есть ролик, под ним описание. Как Invoke-WebRequest или PowerHTML может вытащить этот текст с сайта?

И главный вопрос - как можно научиться, в каком направлении искать? Тот же Invoke-WebRequest выдаёт 100500 методов:

$url = Invoke-WebRequest https://www.youtube.com/watch?v=HZTStHzWRxM
$url.parsedhtml


Положим, я в Файрфоксе нашёл нужный кусок:

<div id="description" slot="content" class="style-scope ytd-video-secondary-info-renderer"><yt-formatted-string class="content style-scope ytd-video-secondary-info-renderer" force-default-style="" split-lines=""><span dir="auto" class="style-scope yt-formatted-string">Don't know what its actual name is, so I just threw every word into this video's title and hoped that something stuck.
</span><a class="yt-simple-endpoint style-scope yt-formatted-string" spellcheck="false" href="/watch?v=HZTStHzWRxM&amp;t=0s" dir="auto">0:00</a><span dir="auto" class="style-scope yt-formatted-string"> - The new feature
</span><a class="yt-simple-endpoint style-scope yt-formatted-string" spellcheck="false" href="/watch?v=HZTStHzWRxM&amp;t=17s" dir="auto">0:17</a><span dir="auto" class="style-scope yt-formatted-string"> - Slow roll-out
</span><a class="yt-simple-endpoint style-scope yt-formatted-string" spellcheck="false" href="/watch?v=HZTStHzWRxM&amp;t=76s" dir="auto">1:16</a><span dir="auto" class="style-scope yt-formatted-string"> - How it works
</span><a class="yt-simple-endpoint style-scope yt-formatted-string" spellcheck="false" href="/watch?v=HZTStHzWRxM&amp;t=124s" dir="auto">2:04</a><span dir="auto" class="style-scope yt-formatted-string"> - Problems / suggestions for the future</span></yt-formatted-string></div>

Но как до этого добраться в Powershell?

Busla
03-08-2020, 17:04
как до этого добраться в Powershell »
от языка тут мало что зависит, пути везде одинаковые: DOM, xPath, XSLT

Fors1k
03-08-2020, 19:20
Вытащить описание с Youtube»
param(
$URL = 'https://www.youtube.com/watch?v=HZTStHzWRxM'
)cls

$URLcontent = (Iwr $URL -useb).content
$Description = ($URLcontent|sls '(?<="description":\{"simpleText":").*?(?="\},"lengthSeconds)').Matches.Value -split "\\n"

$Description

DJ Mogarych
03-08-2020, 21:06
Адова регулярка. А поизящнее никак? Ведь Invoke-WebRequest уже парсит страницу. Что-то типа

$url.parsedhtml.getElementsByName("description")

Не совсем то, но направление какое-то такое.

Busla
03-08-2020, 22:54
Такое "направление" называется Document Object Model - DOM.

Sham
04-08-2020, 02:13
1. у них есть API по ключу, откуда можно взять JSON или XML.
2. DOM динамический, такого span в сыром ответе нету.
3. Есть вариант вытащить JSON и взять оттуда.
if ((Invoke-WebRequest 'https://www.youtube.com/watch?v=HZTStHzWRxM'
).Content -match 'ytplayer\.config = ({.+?});') {
(($matches[1] | ConvertFrom-Json).args.player_response |
ConvertFrom-Json).videoDetails.shortDescription
}

p.s. так тоже работает, но это вроде бы неофициальный API
$youtube_video_id = 'HZTStHzWRxM'
$query_string = Invoke-WebRequest "https://www.youtube.com/get_video_info?video_id=${youtube_video_id}"
Add-Type -AssemblyName 'System.Web'
([System.Web.HttpUtility]::ParseQueryString($query_string).Get('player_response') | ConvertFrom-Json).videoDetails.shortDescription

Uragan66
04-08-2020, 09:00
А поизящнее никак? »
Таким кодом выходит поизящней, но текст описания неполный. Может какой-то параметр нужно добавить ?

$url = Invoke-WebRequest https://www.youtube.com/watch?v=HZTStHzWRxM
$url.parsedhtml.getElementsByName("description") | ForEach {$_.content}

YuS_2
05-08-2020, 22:25
Не совсем то, но направление какое-то такое. »
Проблема в том, что там нет сформированной страницы с законченной dom-структурой, там скрипты, которые создают страницу в браузере... так что, регулярку в руки и ура или предложенный выше API для парсинга...
Можно, конечно, попытаться даже парсить скрипты, но там есть только это (что можно распарсить с xpath, через PowerHTML):
<meta name="description" content="Don't know what its actual name is, so I just threw every word into this video's title and hoped that something stuck. 0:00 - The new feature 0:17 - Slow rol...">
$url = Invoke-WebRequest https://www.youtube.com/watch?v=HZTStHzWRxM
$content = $url.content
$html = $content|convertfrom-html
$a =($html.selectnodes('//meta[@name="description"]').attributes|? name -eq 'content').value
[net.webutility]::htmldecode($a)
т.е. можно выдернуть значение атрибута content, но подозреваю, что это не то, что требовалось...

ateka
09-08-2020, 17:40
Я не настоящий сварщик но я бы скачал бы при помощи youtube-dl json с описанием. А потом из json получил бы что нужно. Ютуб время от времени меняет дизайн страниц и если юзать youtube-dl то не придётся вручную переписывать код. Достаточно обновить youtube-dl.

set _url=https://www.youtube.com/watch?v=GfO-3Oir-qM&hd=1
youtube-dl %_url% --write-info-json --skip-download

DJ Mogarych
17-08-2020, 22:25
Да, после ydl надо так:

(gc 'C:\temp\file.info.json' |ConvertFrom-Json).description

Спасибо!

Uragan66
17-08-2020, 22:40
Да, после ydl надо так »
DJ Mogarych, а у Вас полное описание парсится с json ?
у меня получается текст описания неполный, как и по коду из этого поста - »

ateka
17-08-2020, 23:12
Да, после ydl надо так »
Я кстати вспомнил что описание в txt можно сохранить ключом--write-description #Write video description to a .description file
Внутри будет чистый текст.

DJ Mogarych
19-08-2020, 10:52
у Вас полное описание парсится с json ? »
Да, полное.
--write-description #Write video description to a .description file »
Супер!




© OSzone.net 2001-2012