Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Вытащить описание с Youtube (http://forum.oszone.net/showthread.php?t=346030)

DJ Mogarych 03-08-2020 16:18 2930062

Вытащить описание с Youtube
 
Привет!
Собственно, сабж. Есть ролик, под ним описание. Как 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 2930067

Цитата:

Цитата DJ Mogarych
как до этого добраться в Powershell »

от языка тут мало что зависит, пути везде одинаковые: DOM, xPath, XSLT

Fors1k 03-08-2020 19:20 2930071

Цитата:

Цитата DJ Mogarych
Вытащить описание с 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 2930081

Адова регулярка. А поизящнее никак? Ведь Invoke-WebRequest уже парсит страницу. Что-то типа
Код:

$url.parsedhtml.getElementsByName("description")
Не совсем то, но направление какое-то такое.

Busla 03-08-2020 22:54 2930089

Такое "направление" называется Document Object Model - DOM.

Sham 04-08-2020 02:13 2930100

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 2930105

Цитата:

Цитата DJ Mogarych
А поизящнее никак? »

Таким кодом выходит поизящней, но текст описания неполный. Может какой-то параметр нужно добавить ?

Код:

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


YuS_2 05-08-2020 22:25 2930262

Цитата:

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

Проблема в том, что там нет сформированной страницы с законченной 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 2930615

Я не настоящий сварщик но я бы скачал бы при помощи 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 2931491

Да, после ydl надо так:
Код:

(gc 'C:\temp\file.info.json' |ConvertFrom-Json).description
Спасибо!

Uragan66 17-08-2020 22:40 2931494

Цитата:

Цитата DJ Mogarych
Да, после ydl надо так »

DJ Mogarych, а у Вас полное описание парсится с json ?
у меня получается текст описания неполный, как и по коду из этого поста - »

ateka 17-08-2020 23:12 2931501

Цитата:

Цитата DJ Mogarych
Да, после ydl надо так »

Я кстати вспомнил что описание в txt можно сохранить ключом
Код:

--write-description #Write video description to a .description file
Внутри будет чистый текст.

DJ Mogarych 19-08-2020 10:52 2931628

Цитата:

Цитата Uragan66
у Вас полное описание парсится с json ? »

Да, полное.
Цитата:

Цитата ateka
--write-description #Write video description to a .description file »

Супер!


Время: 11:21.

Время: 11:21.
© OSzone.net 2001-