Парсинг видео из выдачи: фильтры Яндекса, Google и Bing

· парсинг · видео

Поиск по видео — это выдача про чужие площадки: ни один из трёх поисковиков видео у себя не хранит, все они показывают карточки роликов с YouTube, VK, Rutube, TikTok и десятка других сайтов. Собирают её, чтобы понять, чьи ролики выходят по запросу, отследить своё видео в поиске, набрать список каналов по теме или просто найти материал.

Ниже — что в трёх поисковиках устроено одинаково и вынесено в общие параметры, а что своё у каждого. Методы: /api/yandex/video, /api/google/video и /api/bing/video.

Общая карточка ролика

Ролик все трое описывают примерно одним набором вещей, но с разной полнотой: площадку и канал называют не все, длительность один отдаёт числом, а двое подписью. Наружу уходит одна форма:


{
    "url": "https://www.youtube.com/watch?v=n0csRIDZegA",
    "title": "Как помыть кота, груминг кошек дома",
    "domain": "www.youtube.com",
    "thumbnail": "https://avatars.mds.yandex.net/get-video_thumb_fresh/877004/564x318_1",
    "duration": 1878,
    "durationText": "31:18",
    "published": 1607299200,
    "views": "1,5K",
    "provider": "YouTube"
}

url, title и domain есть всегда. Остальное появляется, только если поисковик это дал, — и появляется оно неравномерно, о чём ниже.

Длительность: и числом, и подписью

Яндекс отдаёт длительность числом секунд, Google и Bing — подписью вроде 31:18 или 3:11:25. Мы отдаём оба поля: duration в секундах и durationText так, как это написал поисковик. Для Google и Bing секунды считаются из подписи; если подпись не разобралась, поля duration не будет.

Это стоит учесть в коде: отсутствие duration означает «длина неизвестна», а не ноль. Подпись разбирается не всегда — у прямых эфиров вместо неё стоит LIVE, встречается и 4:12:30+. Фильтр вида duration < 600 выбросит такие ролики молча, вместе с длинными, а durationText у них при этом на месте.

Дата публикации: два поля

published — момент публикации в unix-секундах. Приходит от Яндекса.

publishedText — дата словами поисковика, на языке выдачи: «7 дек. 2020 г.», Nov 20, 2022, «5 мес. назад». Приходит от Google и Bing.

У одного ролика бывает либо одно поле, либо другое. Точный момент из «5 мес. назад» не восстанавливается, поэтому сортировка и отбор по дате возможны только по выдаче Яндекса; у Google и Bing дата годится для показа, но не для вычислений.

Что где пустует

Поле Яндекс Google Bing
thumbnail есть нет есть
duration (секунды) есть из подписи из подписи
published (unix) есть нет, только текст нет, только текст
views редко нет есть
provider есть нет есть
channel нет нет есть
description есть нет нет

Два замечания к таблице. В ответе /google/video поля thumbnail нет. А views у Яндекса приходит редко — отсутствие этого поля здесь обычное дело, а не признак ошибки.

Просмотры приходят строкой (6,8K, «Просмотров: 194,9тыс.»), а не числом: поисковики показывают только сокращение, и точного значения за ним нет — «194,9тыс.» это что угодно от 194 850 до 194 949.

Общие фильтры

Общих фильтров у видео четыре: длительность, качество, свежесть и площадка. Имя одно на три поисковика:

https://jsonseo.ru/api/yandex/video?key=ВАШ_КЛЮЧ&text=как+помыть+кота&duration=short&hd=1
https://jsonseo.ru/api/google/video?key=ВАШ_КЛЮЧ&q=как+помыть+кота&duration=long&freshness=year
https://jsonseo.ru/api/bing/video?key=ВАШ_КЛЮЧ&q=как+помыть+кота&site=youtube.com&count=100

Длительность: одно слово, три разные границы

Самая коварная часть. short, medium и long есть у всех трёх, но означают разное:

Значение Яндекс Google Bing
short до 10 минут до 4 минут до 5 минут
medium 10–65 минут 4–20 минут 5–20 минут
long больше 65 минут больше 20 минут больше 20 минут

Общий здесь смысл ступени, а не её длина: границы задают сами поисковики. Если сравнение между поисковиками должно быть строгим, отбирайте по duration в секундах уже в ответе: оно есть у всех трёх.

Качество, свежесть, площадка

hd=1 работает у всех, но по-разному устроен: у Яндекса это отдельный флаг, у Google — «высокое качество», у Bing — ступень разрешения 720p и выше. Роликов в ответе становится заметно меньше: фильтр отсекает всё, что поисковик не считает HD.

freshness (day, week, month, year) есть у Google и Bing. У Яндекса — не есть: у него одна ступень «свежее», и она не настраивается. Родной параметр within принимает число, но окно от числа не зависит — within=1, 9 и 77 одинаково отдают ролики не старше примерно трёх суток. Общий freshness у Яндекса поэтому возвращает 422 и называет within — окно у него одно, и подогнать его под сутки, неделю или год нельзя.

site есть у Яндекса (родное имя host) и у Bing. У Google в видео площадка задаётся параметром tbs=srcf:, значение которого — gzip, упакованный в web-safe base64, а внутри список доступных доменов, который Google строит динамически под конкретный запрос и регион. Фиксированного списка значений там нет, собрать строку может только вызывающий, поэтому общий site у Google отвечает 422.

Как и в картинках, отказ здесь лучше молчания: незнакомое значение фильтра ни один из трёх поисковиков ошибкой не считает — он выбрасывает фильтр и отдаёт обычную страницу с честным 200. Отличить её от отфильтрованной снаружи нечем, а платят за обе одинаково.

Расширенные фильтры у каждого

Яндекс

Параметр Что делает
within=9 «Свежие» — ролики не старше примерно трёх суток. Число не срок, а признак включённости: интерфейс шлёт девятку
lang_filter=foreign ролики в нейросетевом переводе
nohost=www.youtube.com всё, кроме этой площадки

У Яндекса есть то, чего нет у двух других: исключение площадки — nohost=www.youtube.com убирает из выдачи всё с этого домена.

И ещё одна приятная особенность: в ответе Яндекс сам сообщает, какие фильтры он применил, — это его собственное эхо, а не копия отправленного фильтра. Работает не для всего: hd в него не попадает никогда, а lang_filter отражается любой строкой, что бы ему ни прислали. Зато duration и within оно судит честно: отвергнутое значение в эхо не появляется.

Страница у Яндекса — 20 позиций, из которых 16–20 результаты: остальное реклама, она в ответ не попадает. Заодно стоит знать, что title здесь яндексовский, а не с площадки: у VK и YouTube в нём обычно дописано название канала после тире, а описание часто оказывается шаблонным текстом площадки, а не тем, что написал автор.

Google

Запись Что делает
tbs=dur:s, dur:m, dur:l длительность: 0–4 минуты, 4–20, больше 20
tbs=qdr:h, d, w, m, y за час, сутки, неделю, месяц, год
tbs=hq:h высокое качество
tbs=cc:1 с субтитрами
tbs=srcf:… площадка; значение — gzip в web-safe base64, собирается вызывающим
lr=lang_ru язык ролика — отдельным параметром, не внутри tbs

У Google есть «за час» и субтитры — этого нет ни у Яндекса, ни у Bing. Взамен несколько записей, которые встречаются в справочниках, здесь не работают вовсе:

Страница у Google — десять роликов, смещение обычное, десятками.

Bing

Параметр Значения
resolution low, 360p, 480p, 720p, 1080p — «и выше»
price free, paid
short=1 только Shorts — короткие вертикальные ролики
qft сырая цепочка токенов +filterui:…

У Bing своего больше всех: пять ступеней разрешения вместо одного флага HD, платность и отбор только Shorts. Ни того, ни другого, ни третьего нет у Яндекса и Google.

И здесь же — самая полезная ручка во всех вертикалях: count, сколько карточек просить на страницу. У видео потолок 105, и это не опечатка: count=100&pages=1 отдаёт сто роликов за один запрос вместо восемнадцати, а цена считается страницами. Фильтры при этом работают как обычно: count=105&pages=2&duration=long вернёт две сотни роликов, и все длиннее двадцати минут.

Глубина у Bing считается не страницами, а карточками: дальше 700-й он не листает. Реальное дно обычно выше и зависит от запроса — конец выдачи виден по флагу exhausted.

Что стоит помнить

Про то, как устроена вертикаль картинок и чем она отличается, — соседняя статья: парсинг картинок из выдачи. Общие сложности парсинга выдачи разобраны в статье про парсер выдачи Яндекса.


Читайте дальше

Страны и языки в Google: параметры gl и hl

Москва в uule и gl=by дают белорусскую выдачу, а незнакомый hl Google молча превращает в английский. Разбираем, кто за что отвечает, и даём полные списки — те же, по которым API проверяет запросы.

Страны, рынки и языки в Bing: mkt, cc и setlang

Можно запросить Катар и получить московскую выдачу. Разбираем, кто из трёх параметров за что отвечает, и даём полные списки — те же, по которым API проверяет запросы.