1

Тема: парсер підписок instagram

Починав писати парсер на bs4 + request, але знайшов такий модуль як instaloader.
Все стало набагато простіше.

import instaloader

L = instaloader.Instaloader()

L.login("login", "password")

profile = instaloader.Profile.from_username(L.context, "nickname") # nickname of the person whose page you want to analyze

following = []
for followee in profile.get_followees():
    following.append(followee.username)

followers = []
for follower in profile.get_followers():
    followers.append(follower.username)

output = list(set(following) - set(followers))
for i in output:
    print("https://www.instagram.com/" + i + "/")

Але проблема в тому, що не хочу зловити бан від інсти (мені вже не можна відписуватись від людей через mozilla, хоч і з іншого акаунту).
Думав обходити все це такими способами:
Під'єднуватись через проксі

request = requests.get(url, proxies={"http":"http://10.10.1.10:3128"})

Ставити таймер на запити

response = requests.get(url, timeout=(10, 0.01))

Ну і під'єднуватись в якості браузера

user_agent = ('Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) '
              'Gecko/20100101 Firefox/50.0')
request = requests.get(url, headers={'User-Agent':user_agent})

Але так як я не використовую request - не знаю як все це зробити.
Instaloader і так входить в якості мого стандартного браузера (мозілли), як я зрозумів по повідомленню про новий вхід на gmail, але я не знаю як поставити проксі і таймер на запити (ну хіба що поставити таймер в самій програмі між залогіненням, отримання списку підписників і списку підписок, але не впевнений що це допоможе).
Думав просто встановити на ubuntu vpn і включати при запуску програми, але це виявилось не так вже й просто
+ те що я захочу поділитись цим кодом з друзями, або захочу скористатися не на своєму ноутбуці і знову виникнуть проблеми
P`s. Можливо ви знаєте ще якісь способи як застрахуватися від бану, або часткового блокування

2

Re: парсер підписок instagram

Шось таке.

import os

proxy = ''

os.environ['http_proxy'] = proxy 
os.environ['HTTP_PROXY'] = proxy
os.environ['https_proxy'] = proxy
os.environ['HTTPS_PROXY'] = proxy
Подякували: /KIT\, Eff1c2

3

Re: парсер підписок instagram

Привіт)
Написав на основі попереднього інший парсер.
Мета:
1) повинен зібрати список підписників певного акаунта (до 500000 підписників);
2) по кожному зних зібрати список підписок;
3) визначити спільні;
4) вивести їх по спаданню кількості спільних.

import instaloader
from time import sleep
from random import uniform

L = instaloader.Instaloader()

nikname = input("Input nikname or email: ")
try:
    L.load_session_from_file(nikname)
    sleep(2)
except:
    password = input("Input password: ")
    L.login(nikname, password)
    L.save_session_to_file("way/to/the/session")

parsing_user = input("Input the nickname of the account you want parse: ")

profile = instaloader.Profile.from_username(L.context, parsing_user)
followers = [follower for follower in profile.get_followers()]  # create list of followers
sleep(uniform(2, 5))

lists = []  # arr with all following
for i in followers:
    print(i)
    list = [followee for followee in i.get_followees()]  # list of following
    sleep(uniform(50, 100))
    lists.append(list)  # append in common array



arr_x = []  # arr for counters
arr = list(set(lists))  # array with non-repeating elements
for i in arr:
    counter = lists.count(i)
    if counter == 1:  # if there are no mutual followers - remove element
        arr.remove(i)
    else:
        arr_x.append(counter-1)

arr_y = sorted(arr_x, reverse=True)  # arr sorted counters
for i in arr_y:
    z = arr_x.index(i)  # define an index in an unsorted array
    print(arr[z], "Mutual followers: ", i)
    arr_x[z] = -1  # in order not to lose order - we do not delete an element, but change it to -1

Видає помилку "Too many queries in the last time. Need to wait 426 seconds, until 08:24.". Тобто занадто багато запитів. Поставив таймер у циклі (26 строка), але не допомогло. Вставивши прінти зрозумів, що ліміт досягається десь при 3му запиті get_followees() (ну і + перед тим запит get_followers()).
Що можна зробити в такій ситуації?
Були ідеї:
1) застосовувати кілька акаунтів почергово для парсингу, але це буде геморно + акаунтів потрібно буде ой як не мало.
2) змінити код бібліотеки Instaloader. Я просто думаю, що вона через цикл витягує кожного підписника окремо і тому так швидко досягає ліміту запитів. Але зрозумів, що я ще занадто зелений, щоб таке зробити.

4

Re: парсер підписок instagram

Eff1c написав:

я ще занадто зелений, щоб таке зробити.

В даному випадку справа не в тому хто на скільки зелений. Instagram (як і будь-яка інша велика соц. мережа) не дасть парсити так багато даних, бо така кількість даних може бути використана в цілях корисних для того хто парсить і шкідливих для тих кого зпарсили.

Подякували: Eff1c1

5

Re: парсер підписок instagram

спробуйте proxychains. Це класний ротатор айпі адрес. можна використати в ньому TOR або ще і додати власні айпі проксі. Тому тут вже впретесь в потребу якісних high anonymous проксі. Плюс не забувайте додавати хедери в http запити, щоб вони імітували браузер аля user-agent і тд. Зловіть запит який робить ваш бразуер до інстаграму (Browser DevConsole, Fiddler, Burp Suite) і використайте їх як базу для власих хедерів в скрипті.


запускаєте свій скрейпер аля
proxychains python scraper.py

Подякували: Eff1c1