Параметр page: смещение выдачи и почему pages надёжнее
· парсинг · пагинация
Вопрос от пользователей повторяется: «а можно начать не с первой страницы?» Можно - параметр
page для этого и есть. Но почти всегда это не та задача, которую человек на самом деле
решает, и почти всегда её лучше решить параметром pages. Разберём, чем они отличаются,
когда смещение действительно нужно и почему за глубиной ходить одним запросом надёжнее.
Два разных параметра
Их легко перепутать - имена отличаются одной буквой.
pages- сколько страниц собрать подряд. От 1 до 20, по умолчанию 1page- с какой страницы начать. Нумерация с нуля, по умолчанию 0
Вместе они задают окно выдачи. page=3&pages=5 - это страницы 3, 4, 5, 6 и 7.
Без page окно всегда начинается с начала выдачи, и в подавляющем большинстве задач
так и нужно.
Почему одним запросом надёжнее
Соблазн понятный: раз есть смещение, можно ходить постранично - сначала страница 0, потом 1, потом 2 - и складывать результат у себя. Так делают, когда переносят логику из интерфейса, где пагинация именно так и устроена. Но у API поисковой выдачи есть особенность, которой нет у обычного списка в базе.
Выдача динамическая. Между двумя вашими запросами поисковая система успевает пересчитать результаты: что-то поднимется, что-то опустится, что-то появится или исчезнет. Документ, стоявший десятым в первом запросе, во втором окажется одиннадцатым - и попадёт к вам дважды. Или наоборот, сдвинется вверх и не попадёт вовсе. Чем больше запросов вы склеиваете, тем заметнее расхождение.
Один запрос - один проход по выдаче. Когда вы просите pages=10,
страницы собираются подряд: одна сессия сбора, одно соединение, один исходящий адрес, одни и те же
параметры. Это ближе всего к тому, что увидел бы человек, листающий результаты подряд. Полной
неизменности выдачи не обещает никто - поисковая система вправе пересчитать её и внутри одной
сессии, - но окно между страницами тут секунды, а не столько, сколько занимает отдельный запрос
с вашей стороны.
Пагинация сама по себе тоже не бесплатна. Каждый отдельный запрос - это новый заход в поисковую систему: своё соединение, своё ожидание ответа. Десять запросов по одной странице обычно идут дольше, чем один запрос на десять страниц, и сильнее нагружают ваш лимит одновременных обращений.
Цена при этом одинаковая. Тарификация постраничная: 0.01 ₽ за страницу независимо от того, забрали вы десять страниц одним запросом или десятью. Так что выигрыша в деньгах у постраничного обхода нет - только проигрыш в качестве данных и во времени.
Когда смещение действительно нужно
Случаи есть, их немного.
- Точечная проверка глубины. Нужно посмотреть, что стоит на 15-й странице, и только
там.
page=15&pages=1- одна страница, 0.01 ₽, без сбора четырнадцати предыдущих - Догрузка после break_domain. Сбор остановился на домене, а вам понадобилось посмотреть, что было дальше - продолжить со смещения дешевле, чем собирать всё заново
- Возобновление после сбоя. Часть глубины уже собрана и сохранена, повторять её незачем
Общее у этих случаев одно: нужен конкретный кусок выдачи, а не сплошная глубина. Если нужна именно
сплошная - берите её через pages.
Максимальная глубина: 20 страниц
Предел один на все методы - 20 страниц, то есть 200 результатов. Считается он по сумме: смещение плюс
ширина окна. page=18&pages=5 просит страницы с 18-й по 22-ю, то есть глубже
двадцатой, и вернёт ошибку 422 - до списания денег, а не после.
Обойти предел сменой параметра не выйдет: он одинаково считается и для page, и для
параметров самих поисковых систем, о которых ниже. Двухсотый результат - последний доступный
в любом сочетании.
В XML-методах глубина считается так же, просто страница там своего размера. Смещение равно
page × groupby, а глубина - (page + 1) × groupby: смещение плюс сама
запрошенная страница. При groupby=100 доступны страницы 0 и 1 - те же 200 результатов.
Параметры поисковых систем: p, start и first
То же смещение принимается под именами, которыми его называют сами поисковые системы. Это удобно, если вы переносите готовый код, написанный под поисковую систему напрямую.
| Параметр | Метод | Что означает | Эквивалент page=2 | Максимум |
|---|---|---|---|---|
p |
/yandex | Номер страницы с нуля | p=2 |
19 |
start |
Номер результата с нуля, кратный 10 | start=20 |
190 | |
first |
/bing | Номер результата с единицы | first=21 |
191 |
Если передать и page, и параметр поисковой системы, используется второй. Значение уходит
в поисковую систему без изменений - и это единственный способ задать смещение, которое не попадает
на границу страницы.
Отдельный случай: Bing
У Яндекса и Google границы страниц стоят на своих местах, и page попадает куда
просили. У Bing они плавают: где закончить страницу, он решает сам.
page просит круглые границы: page=1 уходит в Bing как
first=11, page=2 - как first=21, и так далее. Обычно
страницы там и начинаются, так что запрос попадает примерно куда просили. Но если на странице
оказалось меньше результатов, следующая начнётся, скажем, с 19-го - и page на неё
уже не наведёшь, круглого числа для неё нет. Ровно на такую границу ставит только
first, а само число нужно взять из ссылки «Следующая страница» в выдаче Bing.
Поэтому смещение в Bing мы не рекомендуем: точное попадание не гарантируется. Для сплошной глубины
используйте pages - там пагинация идёт по ссылкам самого Bing и остаётся точной
на любой глубине.
Смещение и AI-ответ несовместимы
Параметр ai=1 вместе со смещением вернёт ошибку 422. Причина простая: AI-блок
поисковые системы рисуют над выдачей, на первой странице, и больше нигде. Со смещением его
там нет и быть не может.
Ошибка приходит до списания денег, так что запрос с такой парой параметров ничего не стоит. Подробнее про AI-блок - в статье про парсинг AI-выдачи.
Как это выглядит в запросах
# сплошная глубина: топ-100 одним запросом, 0.1 ₽
curl "https://jsonseo.ru/api/yandex?text=купить+ноутбук&pages=10&key=ВАШ_КЛЮЧ"
# точечная проверка: только 15-я страница, 0.01 ₽
curl "https://jsonseo.ru/api/yandex?text=купить+ноутбук&page=15&pages=1&key=ВАШ_КЛЮЧ"
# то же параметром Google
curl "https://jsonseo.ru/api/google?q=купить+ноутбук&start=150&pages=1&key=ВАШ_КЛЮЧ"
Коротко
- Нужна сплошная глубина -
pagesв одном запросе. Страницы меньше расходятся между собой, запрос обычно быстрее, цена та же - Нужен конкретный кусок выдачи -
pageсо смещением. Пропущенные страницы не собираются и не оплачиваются - Предел - 20 страниц, 200 результатов, по сумме смещения и ширины окна
- В Bing смещение приблизительное, точное значение задаётся через
first
Полное описание параметров - в документации. Ключ и баланс - в личном кабинете, при регистрации на счёт падают 10 ₽, этого хватает на тысячу страниц выдачи.