What's new
Runion

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

Скраппинг Instagram

Ar3s

Midle Weight
Депозит
$0
Добрый день. Была задача спарсить всех подписчиков определенных групп в инсте.
Сразу думал взять коммерческие продукты, но там или ограничения по количеству подписчиков либо безумные цены.
Далее рассматривал реализации браузерных вариантов. Они оказались не айс и имели такие же ограничения по объему подписчиков, да и повторить их в виде браузерного плагина я не смог.
Потом пытался написать сам парсер на selenium. Но есть проблема. Если открыть группу и скролить ее подписчиков - то нужно делать паузу между скроллингом, что бы браузер успевал отрисовывать данные. Спустя минут пятнадцать работы инстаграмм блочит меня, а я даже до 10% не дошел. Разбить это на несколько этапов или же на разные аккаунты не удалось. Список все-равно начинается с одних и тех же и долистать до нужного в списке не получается.
Я даже рассматривал вариант не парсить саму страницу а выдергивать данные из json который подгружается по мере скроллинга. Но проблема в том что если его запросить в самом браузере - то он не отдается. Нужно делать запрос именно в контексте открытой страницы. Такое ощущение что с ним где-то работает js на уровне браузера и контролирует что запрос был отправлен именно с открытой страницы инсты. Ну или я не понял как именно оно контролируется.
Подскажите как сделать задуманное? Или хотя бы дайте наводку в какую сторону копать?

Вот написанный мой код. Работает на небольших группах до пары тысяч подписчиков. Но на бигах с миллионами подписчиков оно не воркает.
Последнее редактирование: 18.01.2024
 
Ar3s сказал(а):
браузер успевал отрисовывать данные


А что отрисовывает, самое тяжёлое? Вангую, картинки/фото, подгружает. Их можно заблокировать, будет в несколько раз быстрее.
 
Года 3-4 назад парсил инсту используя так называемый private-API, т.е. снифал трафик android приложения и пилил простенький клиент на питоне.
 
Если отрубить подтягивание картинок профилей, которые парсятся и анимацию JS - то можно увеличить количество запросов в секунду. Но в таком случае бан профиля произойдет еще быстрее.
 
H2SO4 сказал(а):
Года 3-4 назад парсил инсту используя так называемый private-API, т.е. снифал трафик android приложения и пилил простенький клиент на питоне.

А не найдется ли сорцов или хотя бы описания запросов?
 
Ar3s сказал(а):
А не найдется ли сорцов или хотя бы описания запросов?

Сорцы за давностью лет уже не найти, вот нагуглил примерно тоже самое, прада давно не обновлялось https://github.com/ping/instagram_private_api
Там в примерах есть то что нужно вроде
 
Хм. А это может и работать. Надо проверить методу. Спасибо.
 
Ar3s сказал(а):
Подскажите как сделать задуманное? Или хотя бы дайте наводку в какую сторону копать?

Нет и не будет. Было много начинаний, зеркал с результатами парсинга и возможности анонимного поиска и платных и бесплатных, как мы понимаем их более нет, хотя каждый по любому когда-то находил результаты в поисковой выдаче. Meta активна в судах и следит, что бы ничего такого не выплывало, они рискуют этим с другим, и напротив закрываются от поисковой выдачи, сейчас лимиты жесткие и даже публикации групп, органов власти, субъектов властных полномочий в цитировании СМИ ряда стран, может только их можно прочесть, а так без входа, авторизации даже сранный facebook закрыт, это по части справедливости, что бы не пиздели потом, мол телефоны и аккаунты открытый доступ. Уже не такой что бы и открытый. ))
Решения есть, китайские, очень дорого, но аналитика хорошая по реляциям, рукопожатиям, аналитике контента, изображений и прочее. Скажем так, кто бизнес имеет и на уровне уже херней не страдает вроде парсинга, изобретения и орудования костылем, да и потом, опасно ведь. Я писал на эту тему и много, сколько они по гражданским искам ущерба выносят, вьетнамцев несчастных на 16 лямов зелени наказали, их нет, но уже и не будет в паблике, иначе... Словом, поверьте, ну его эту meta в пески Аризоны и поглубже. ))
 
привет! был опыт с инстаграмом и с private-api в том числе. selenium вообще не вариант. все можно сделать на запросах, но весь сок это подобрать правильные headers. у инсты дибильный код и бывает такое, что значение нужного хедера (key: value), то есть value может хранится в JSON строке в <script></script> теге самой страницы (и я не про csrf), то есть для выполнения запроса нужно сначала сделать запрос на instagram.com чтоб получить ключ (найти его в HTML коде), а далее выполнять запрос на бэк, и для каждого запроса ключ может обновляться. проще говоря нужно сидеть и упорно дебажить эти headers подбирать/удалять/соритровать нужные чтоб бэк выдавал 200 и искать где эти хедеры берутся. удачи!
 
bitnepobit сказал(а):
private-api в том числе.
bitnepobit сказал(а):
весь сок это подобрать правильные headers. у инсты дибильный код

Приватные api это что? Различные решения существуют аналитики, частного подхода к маркетинговым возможностям. Это приватно. Но. Если вы попробуете заработать чуть серьезней, суммы больше и где-то просекут, что например вы приватно можете и таки по факту можете работать с возрастом, нечто, что meta стережет и бережет и это не студенческие потуги, они о вас узнают всё и я не знаю чем это закончится. Найдутся советчики и информаторы всюду, никакой конспирологии.

То, что вы полагаете за дебильный код является рациональным решениям для понимания циркуляции трафика и немножечко потенциальных цукерманнов позубастей. )) Причина там не "дибильный" код, а необходимость разграничения. Insta это охуительно хитрая жопа, которая принципиально иначе работает на разных девайсах, системах с тем же контентом. ))
 
stepany4 сказал(а):
Приватные api это что? Различные решения существуют аналитики, частного подхода к маркетинговым возможностям. Это приватно. Но. Если вы попробуете заработать чуть серьезней, суммы больше и где-то просекут, что например вы приватно можете и таки по факту можете работать с возрастом, нечто, что meta стережет и бережет и это не студенческие потуги, они о вас узнают всё и я не знаю чем это закончится. Найдутся советчики и информаторы всюду, никакой конспирологии.

То, что вы полагаете за дебильный код является рациональным решениям для понимания циркуляции трафика и немножечко потенциальных цукерманнов позубастей. )) Причина там не "дибильный" код, а необходимость разграничения. Insta это охуительно хитрая жопа, которая принципиально иначе работает на разных девайсах, системах с тем же контентом. ))

Интегральная гипербола ректальной кибернетики
На твоей кровати ебутся педики
P.S MORGENSHTERN

(приват апи - это опенсорс либка)
 
Ну в общем прав был stepany4 . Парсер я написал. Пока тестил на котиках и дебажил - работало. Но стоило запустить в работу как тут же получил код ответа 400. И далее любые попытки что в ручном режиме что в дебаге уже ничего не дают. Первые 75 подписчиков я получаю а потом сразу же 400. Без предъявления причин. Хорошо хоть аккаунт при этом в баню не улетает как в случае с selenium.

bitnepobit может твой вариант будет дельным. Есть какие-то подробности/код/что угодно что наведет меня на верные поиски?
 
Скорее всего rate limit.
Посмотрите какие заголовки возвращает сервер.
 
int3 сказал(а):
Скорее всего rate limit.
Посмотрите какие заголовки возвращает сервер.

Внутри библиотеки я не вижу заголовков. Но я вижу json ответа на запрос api.user_followers



next_max_id обычно приходил простым числом. Сейчас с самого первого обращения он возвращается строкой. При этом строка всегда имеет первые три цифры, а затем вертикальный разделитель. Я вообще по-началу думал это base64 данные
use_clickable_see_more всегда приходил False. Сейчас приходит True.

Подозреваю, что использованный аккаунт находится под мониторингом системы наблюдения. И потому клиенту отдаются данные для проверки пользователя. Но у меня эти данные не обрабатываются никак.
Следовательно второй запрос всегда получает
ClientError Bad Request: unable to fetch followers (Code: 400, Response: {"message":"unable to fetch followers","status":"fail"})
 
Ar3s сказал(а):
Внутри библиотеки я не вижу заголовков. Но я вижу json ответа на запрос api.user_followers

Посмотреть вложение 75380

next_max_id обычно приходил простым числом. Сейчас с самого первого обращения он возвращается строкой. При этом строка всегда имеет первые три цифры, а затем вертикальный разделитель. Я вообще по-началу думал это base64 данные
use_clickable_see_more всегда приходил False. Сейчас приходит True.

Подозреваю, что использованный аккаунт находится под мониторингом системы наблюдения. И потому клиенту отдаются данные для проверки пользователя. Но у меня эти данные не обрабатываются никак.
Следовательно второй запрос всегда получает
Нажмите, чтобы раскрыть...

первое что приходит в голову теперь надо поискать такой запрос, если use_clickable_see_more приходит true то нужно выполнить запрос (какой-то) в котором строка после разделителя будет идти каким-то параметром
имитация мобильного устройства выходит, как будто ты нажал кнопку посмотреть больше, а потом уже выполнять опять тот запрос на получение фоловеров
 
Ar3s
JavaScript:
Скопировать в буфер обмена
async request() {
const { body } = await this.client.request.send<AccountFollowersFeedResponse>({
url: `/api/v1/friendships/${this.id}/followers/`,
qs: {
max_id: this.nextMaxId,
search_surface: this.searchSurface,
order: this.order,
query: this.query,
enable_groups: this.enableGroups,
},
});
this.state = body;
return body;
}


JavaScript:
Скопировать в буфер обмена
export interface AccountFollowersFeedResponse {
sections: null;
users: AccountFollowersFeedResponseUsersItem[];
big_list: boolean;
next_max_id: string;
page_size: number;
status: string;
}
export class AccountFollowersFeedResponseUsersItem extends ProfileEntity {
pk: number;
username: string;
full_name: string;
is_private: boolean;
profile_pic_url: string;
profile_pic_id?: string;
is_verified: boolean;
has_anonymous_profile_picture: boolean;
latest_reel_media?: number;
}

instagram-private-api/src/feeds/account-followers.feed.ts at master · dilame/instagram-private-api
NodeJS Instagram private API SDK. Written in TypeScript. - dilame/instagram-private-api
github.com
- фукнция в либке чтоб получить фолловеров посмотри поможет
тебе этот next_max_id нужно походу в каждый запрос пихать исходя из каждого прошлого
 
bitnepobit сказал(а):
тебе этот next_max_id нужно походу в каждый запрос пихать исходя из каждого прошлого

Так я и сую

Python:
Скопировать в буфер обмена
def instaworker(api, target):
# Получение id пользователя по его никнейму
user_info = api.username_info(target)
user_id = user_info['user']['pk']
follower_count = user_info['user']['follower_count']
PBAR = tqdm(total=follower_count, desc='Получение подписчиков', unit_scale=True)

stop = True
max_id = False
tmp_max_id = 0
# Получение ранг-токена
rank_token = api.generate_uuid()
while stop:
# Получение списка подписчиков пользователя
if max_id:
followers = api.user_followers(user_id, rank_token, max_id=max_id)
else:
followers = api.user_followers(user_id, rank_token)
# Получение следующего max_id
try:
max_id = int(followers['next_max_id'])
except:
max_id = False

# Альтернативная система подсчета
tmp_max_id += len(followers['users'])
if not max_id:
max_id = tmp_max_id

# Проверка наличия следующей страницы с подписчиками
try:
stop = followers['big_list']
except:
stop = False

# Добавление подписчиков в список
try:
for follower in followers['users']:
follower_list.append(follower)
PBAR.update(1)
except:
print('Произошла ошибка при добавлении подписчиков в список')
print(followers)

# Рандомный слип
time.sleep(randint(5, 15))


PBAR.clear()
PBAR.close()
# Сохранение списка подписчиков в файл
with open(f'{target}.txt', 'w') as f:
json.dump(follower_list, f)

max_id = int(followers['next_max_id']) - в случае если в json мне возвращается не число а строка - у меня случается эксепшен и я сую туда альтернативный счетчик, который работает по длине ответа.
 
Ar3s сказал(а):
повторить их в виде браузерного плагина я не смог
Нужно делать запрос именно в контексте открытой страницы.
Подскажите как сделать задуманное? Или хотя бы дайте наводку в какую сторону копать?

А почему не смог? Выглядит так, что именно расширение для браузера нужно делать. У него будет полный доступ к присланному json-у и не нужно будет тревожить сервер левыми запросами. Сам не умеешь - найми пакистанцев за $10 в час писать.
 
alex778 сказал(а):
Сам не умеешь - найми пакистанцев за $10 в час писать.

Потому что:
1. Оно по итогу обойдется овер-дохера денег. И никакими 100-300$ там не пахнет. По итогу выстрелит тысячи в 2 баксов
2. Потому что иногда надо разминать мозг и самому что-то пытаться делать. Иначе отупеешь наглухо.
 
Top