API для Instagram получить проблематично т.к. их родной API (который был до покупки их Facebook'ом) объявлен deprecated и по факту почти не работает, а новый, через Facebook, требует кучи подтверждений, да и вряд ли Facebook будут давать массово тянуть данные через API.
Однако в случае Instagram это в целом и не надо т.к. сайт написан на React'е (и, в отличие от кучи мяса в коде Facebook'а написан очень чисто и современно), поэтому по факту сам процесс сбора данных в их случае крайне прост:
- Делаете запрос на страницу профиля
- В полученной странице ищите переменную
_sharedData
- Разбираете её значение как JSON и достаёте нужную вам информацию, там будут первые посты со ссылками на их картинки
- Дальше идёте циклом про GraphSQL запросам (легко находятся через просмотр вкладки Network при скролле) и вытаскиваете остальное, данные курсора для интерации находятся в
end_cursor
.
При запросе к GraphQL API нужно учесть одну особенность. Сейчас Instagram требует "подписи" запросов, делается это примерно так:
headers.set('X-Instagram-GIS', md5(`${(window._sharedData || {}).rhx_gis}:${JSON.stringify(vard)}`));
Переменная
vars
, передаваемая в
JSON.stringify()
- это содержимое поля
variables
из GraphQL запроса.
Сам Instagram не банит за постоянные запросы, но если начинать наглеть - то включает throttling, начиная отдавать HTTP 429 в течении какого-то времени (до 5-10 минут), после чего всё движется дальше. Таким образом распараллеливание + прокси решают задачу довольно эффективно.