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
5 Réponses :
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)
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?
Je suppose que le site instagram utilise au maximum 17 éléments utilisateur appréciés.
donc, c'est une boucle
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é.
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.
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
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)
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)
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)