Парсинг видео из выдачи: фильтры Яндекса, 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 дата годится для показа, но не для вычислений.
Что где пустует
| Поле | Яндекс | 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 есть у всех
трёх, но означают разное:
| Значение | Яндекс | 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 в нём обычно дописано название канала после тире, а описание часто оказывается
шаблонным текстом площадки, а не тем, что написал автор.
| Запись | Что делает |
|---|---|
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. Взамен несколько записей, которые встречаются в справочниках, здесь не работают вовсе:
tbs=cdr:1,cd_min:…,cd_max:…— произвольный период. Под диапазоном «весь 2024» приезжают ролики любых лет, ровно те же, что без фильтра. Работает толькоqdrtbs=lr:lang_1ru— язык внутриtbs:lang_1ruиlang_1deдали одинаковую выдачу. Работает отдельныйlr=lang_ru, с ним наборы расходятся полностьюtbs=vd:hd(HD) иtbs=sbd:1(сортировка по дате) — ответ совпадает с ответом без фильтра. Для HD работаетhq:h
Страница у 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.
Что стоит помнить
- Сравнивать поисковики по фильтру нельзя, сравнивать по ответу можно.
Ступени длительности у всех разные, а
durationв секундах — одно и то же число - Дата у двух из трёх — текст. Если нужен момент времени, а не подпись, это либо Яндекс, либо разбор строки на своей стороне со всеми его рисками
- Ссылка ведёт на площадку. Плееры поисковиков наружу не отдаются: они
живут только внутри их страниц, и адрес в
url— единственное место, где ролик действительно играет - Реклама в результаты не попадает. У Яндекса часть позиций страницы занимают объявления — в ответе их нет, поэтому роликов приходит меньше двадцати
Про то, как устроена вертикаль картинок и чем она отличается, — соседняя статья: парсинг картинок из выдачи. Общие сложности парсинга выдачи разобраны в статье про парсер выдачи Яндекса.