1
votes

Obtenir la liste des likers pour un post Instagram - Python & Selenium

Je m'entraîne à l'exploration Web. Pour ce faire, je me suis lancé le défi d'obtenir la liste de toutes les personnes ayant aimé une publication sur instagram. Mon problème est que je suis coincé au point où je n'obtiens que les 11 premiers noms d'utilisateur de likers. Je ne trouve pas le bon moyen d'automatiser le processus de défilement tout en obtenant les likes.


Voici mon processus dans Jupyter Notebook (il ne fonctionne pas encore en tant que script):

from selenium import webdriver
import pandas as pd

driver = webdriver.Chrome()

driver.get('https://www.instagram.com/p/BuE82VfHRa6/')

userid_element = driver.find_elements_by_xpath('//*[@id="react-root"]/section/main/div/div/article/div[2]/section[2]/div/div/a')[0].click()

elems = driver.find_elements_by_xpath("//*[@id]/div/a")

users = []

for elem in elems:
    users.append(elem.get_attribute('title'))

print(users)

Avez-vous une idée?

Merci beaucoup


0 commentaires

5 Réponses :


1
votes

Veuillez essayer le code suivant et faites-moi savoir si cela fonctionne.

Title : kyliejenner
Title : saturdayshade28
Title : worldmeetzboy
Title : mrokon
Title : addieisaac
Title : addieisaac
Title : amber_doerksen
Title : amber_doerksen
Title : addieisaac
Title : zayn6117
Title : amber_doerksen
Title : amber_doerksen
Title : worldmeetzboy
Title : worldmeetzboy
Title : razvanpopic1301
Title : johanna.trmn
Title : johanna.trmn
Title : johanna.trmn
Title : americ.av
Title : gabriellcostta1.0
Title : gabriellcostta1.0
Title : gabriellcostta1.0
Title : worldmeetzboy
Title : enactusepi
Title : enactusepi
[u'kyliejenner', u'saturdayshade28', u'worldmeetzboy', u'mrokon', u'addieisaac', u'addieisaac', u'amber_doerksen', u'amber_doerksen', u'addieisaac', u'zayn6117', u'amber_doerksen', u'amber_doerksen', u'worldmeetzboy', u'worldmeetzboy', u'razvanpopic1301', u'johanna.trmn', u'johanna.trmn', u'johanna.trmn', u'americ.av', u'gabriellcostta1.0', u'gabriellcostta1.0', u'gabriellcostta1.0', u'worldmeetzboy', u'enactusepi', u'enactusepi']

production:-

from selenium import webdriver
driver = webdriver.Chrome()

driver.get('https://www.instagram.com/p/BuE82VfHRa6/')

elems = driver.find_elements_by_xpath("//a[@class='FPmhX notranslate TlrDj']")

users = []

for elem in elems:
    users.append(elem.get_attribute('title'))
    print('Title : ' +elem.get_attribute('title'))

print(users)


4 commentaires

Merci pour votre réponse :) En fait, il fait quelque chose mais ce que je recherche. Lors de l'exécution de ce script, j'obtiens les noms d'utilisateur des derniers commentaires. Ce que je recherche, c'est la liste de toutes les personnes ayant aimé le post ... Je pense que le processus consiste à cliquer sur ce x-path (// * [@ id] / div / a) et à faire défiler jusqu'à la fin de la liste pour obtenir tous les goûts.


Mais lorsque vous exécutez ce code, cela me donne tous les utilisateurs ayant lié la publication.


Ce faisant, vous obtenez la liste des derniers likers (liste sur le pan de droite). Mais je cherche à obtenir la liste des 2 437 535 likers. Lorsque vous cliquez sur "2,437,535 Likes", il y a une liste avec les noms d'utilisateur de tous les likers.


@KunduK Y a-t-il un moyen d'obtenir les noms complets des personnes qui ont aimé et commenté certaines publications sur Instagram?



1
votes

Je suppose que le site instagram utilise au maximum 17 éléments utilisateur appréciés.
donc, c'est une boucle

  1. obtenir la liste des éléments du Web
  2. enregistrer dans ma liste
  3. faites défiler vers le bas pour obtenir un nouvel élément
  4. vérifier, est ce dernier élément de défilement?
driver.get('https://www.instagram.com/p/BuE82VfHRa6/')

userid_element = driver.find_elements_by_xpath('//*[@id="react-root"]/section/main/div/div/article/div[2]/section[2]/div/div/a')[0].click()
time.sleep(2)

# here, you can see user list you want.
# you have to scroll down to download more data from instagram server.
# loop until last element with users table view height value.

users = []

height = driver.find_element_by_xpath("/html/body/div[3]/div/div[2]/div/div").value_of_css_property("padding-top")
match = False
while match==False:
    lastHeight = height

    # step 1
    elements = driver.find_elements_by_xpath("//*[@id]/div/a")

    # step 2
    for element in elements:
        if element.get_attribute('title') not in users:
            users.append(element.get_attribute('title'))

    # step 3
    driver.execute_script("return arguments[0].scrollIntoView();", elements[-1])
    time.sleep(1)

    # step 4
    height = driver.find_element_by_xpath("/html/body/div[3]/div/div[2]/div/div").value_of_css_property("padding-top")
    if lastHeight==height:
        match = True

print(users)
print(len(users))
driver.quit()

J'ai testé dans près de 100 articles aimés, et cela a fonctionné.


3 commentaires

Merci beaucoup d'être revenu vers moi. C'est certainement le processus pour faire défiler jusqu'à une liste. Mais cela ne fonctionne pas bien dans instagram pour moi, peut-être que la plate-forme est bonne pour détecter les robots d'exploration (?). Je devrais vérifier s'il est possible de définir la vitesse de défilement pour voir cela qui pourrait affecter le résultat. Merci quand même :)


@ GrégoiredeKermel au moins 0,1 seconde est nécessaire pour un fonctionnement normal dans mon environnement portable. plus de 2 500 000 articles nécessitent 2,9 heures ...... si j'utilise un pilote chrome sans tête , je ne sais pas s'il est plus rapide. ou je ne sais pas si cela aidera


Cela aide merci! J'ai remarqué qu'ils nous empêchent d'obtenir la liste totale des utilisateurs. Je pensais que nous modifions l'étape 3 en mettant le "time.sleep (0.2)" dans une variable, l'exécutons puis, en ajoutant une étape 3bis comme: "si le time.sleep est supérieur à 0.2, alors faites défiler vers le haut par 50 pixels, puis recommencez le processus jusqu'au prochain délai supplémentaire ou à la fin ". Ce faisant, je suis presque sûr que cela nous permettrait d'obtenir la liste complète.



0
votes

Je n'ai pas pu faire fonctionner le code comme indiqué dans la réponse de Predicty. Par conséquent, j'ai fait l'adaptation ci-dessous et cela me rapporte maintenant ~ 500 likers par article.

def get_post_likers(shortcode):
    chrome = ch.initialize()
    chrome.get('https://www.instagram.com/p/' + shortcode + '/')
    chrome.execute_script("window.scrollTo(0, 1080)") 
    url = "/p/" + shortcode + "/liked_by/"
    time.sleep(2)
    like_link = chrome.find_element_by_xpath('//a[@href="'+url+'"]')
    like_link.click()
    time.sleep(2)
    users = []
    pb = chrome.find_element_by_xpath("//div[@role = 'dialog']/div[2]/div[1]/div[1]").value_of_css_property("padding-bottom")
    match = False
    while match==False:
        lastHeight = pb

        # step 1
        elements = chrome.find_elements_by_xpath("//*[@id]/div/a")
        # step 2
        for element in elements:
            if element.get_attribute('title') not in users:
                users.append(element.get_attribute('title'))
        # step 3
        chrome.execute_script("return arguments[0].scrollIntoView();", elements[-1])
        time.sleep(1)
        # step 4
        pb = chrome.find_element_by_xpath("//div[@role = 'dialog']/div[2]/div[1]/div[1]").value_of_css_property("padding-bottom")
        if lastHeight==pb or len(users) >= 1500:
            match = True
    return users


0 commentaires

0
votes

Cela a fonctionné pour moi:

driver.get('https://www.instagram.com/p/BuE82VfHRa6/')

time.sleep(2)

userid_element = driver.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div[1]/article/div[3]/section[2]/div/div[2]/button').click()
time.sleep(2)



elems = driver.find_elements_by_xpath("//a[@class='FPmhX notranslate TlrDj']")

users = []


for i in range(10):
    i += 1
    if(i%10) == 9 :
        driver.find_element_by_xpath('/html/body/div[4]/div/div/div[2]/div').click()
        actionChain.key_down(Keys.SPACE).key_up(Keys.SPACE).perform()

    print('/html/body/div[4]/div/div/div[2]/div/div/div['+str(i)+']/div[2]/div[1]/div/a')
    Title = driver.find_element_by_xpath('/html/body/div[4]/div/div/div[2]/div/div/div['+str(i)+']/div[2]/div[1]/div/a').get_attribute('title')
    users.append(Title)
    print('Title : ' + Title)

print(users)


0 commentaires

0
votes

J'ai essayé toutes les solutions ci-dessus, mais aucune d'elles ne fonctionne. Je pense qu'ils sont dépassés.

Au lieu de cela, j'ai écrit le mien. Cela fonctionne parfaitement en 2020.

Ce code va à l'adresse "nom d'utilisateur" et prend le dernier message dans le profil et obtient les utilisateurs aimés.

def getPosts():
    hrefs_in_view = driver.find_elements_by_tag_name('a')
    # finding relevant hrefs
    hrefs_in_view = [elem.get_attribute('href') for elem in hrefs_in_view
         if '.com/p/' in elem.get_attribute('href')]
    
    return hrefs_in_view;





def getLikers(username,limit,post=1):
    driver.get('https://www.instagram.com/' + username)
    time.sleep(1)
    users=[]

    #Get Latest Post
    driver.get(getPosts()[post])
    
    time.sleep(2)
    #Open Dialog
    followersLinkX = driver.find_element_by_xpath('//button[@class="sqdOP yWX7d     _8A5w5    "]')
    followersLinkX.click()
    time.sleep(1)
    #Get Dialog
    xxx = driver.find_element_by_xpath('//div[@role="dialog"]/div[1]/div[2]/div[1]/div[1]')
    #Focus on and Scroll
    xxx.click()
    # step 3
    actionChain = webdriver.ActionChains(driver)

  

    count = 0
    
    while(count < limit):
        for i in range(1,1000):
            try:
                users.append("https://www.instagram.com/" + driver.find_element_by_xpath('//div[@role="dialog"]/div[1]/div[2]/div[1]/div[1]/div['+ str(i) +']/div[2]/div[1]/div[1]').text) 
                count+=1
            except:
                break
        actionChain.key_down(Keys.SPACE).key_up(Keys.SPACE).perform()
        time.sleep(0.5)  

    return users 

Pour likers = getLikers("deirvlon",100,1)


3 commentaires

J'ai essayé quelques solutions ici et la vôtre semble plus proche de ce à quoi ressemble le site Web d'Instagram aujourd'hui. Cependant, je ne peux pas récupérer les éléments utilisateur réels, il semble qu'il y ait maintenant une étendue, puis un objet «a». Pouvez-vous revoir et conseiller sur la façon de modifier? Je suis perplexe, merci!


Salut, j'ai vérifié à nouveau que cela fonctionne. S'il donne des erreurs, cela peut être dû à la vitesse de chargement d'Internet. Vous pouvez augmenter le temps de sommeil "time.sleep (0,5)" pour résoudre ce problème


Désolé, j'ai oublié d'ajouter la méthode "getPosts ()". Je pense que c'est le problème. Maintenant, j'ai mis à jour. J'espère que ça fonctionnera)