Catégories
codage

Est-il possible de vérifier automatiquement le statut Instagram F4F (suivre) ?

bonjour.

J'essaie aussi diverses choses tout en étudiant le crawl pour la première fois.

Cette fois, je voudrais l'appliquer à Instagram, l'un des SNS les plus populaires récemment.

Pour le rendre intéressant, j'essaie de faire ce qui suit en utilisant un peu de psychologie humaine.

qu'en est-il? tu ne veux pas essayer 🙂

Parfois, les gens arrêtent de me suivre. TT

Maintenant, procédons étape par étape.

Importer les modules requis

import time
import sys
from selenium import webdriver
from bs4 import BeautifulSoup

Le module webdriver du package selenium lance un navigateur Web et vous permet d'effectuer des actions en fonction de commandes de script, et le module BeautifulSoup du package bs4 a une fonction qui vous permet d'extraire facilement le contenu souhaité des données HTML DOM.

Si les packages sélénium et bs4 n'existent pas, installez-les en saisissant ce qui suit dans la fenêtre de commande.

pip install bs4
pip install selenium

Et le pilote Web Chrome peut être téléchargé à partir du lien ci-dessous.

https://sites.google.com/a/chromium.org/chromedriver/downloads

Les autres sont des modules de base, vous pouvez donc les importer et les utiliser immédiatement.

connectez-vous à Instagram

Ouvrez maintenant le navigateur Chrome et essayez de vous connecter en accédant à l'adresse Instagram.

Prenons l'entrée directement à partir de la fenêtre de commande.

Par exemple, supposons que vous tapiez ce qui suit dans la fenêtre de commande.

python crawling_instagram.py sangminem 123456

où sys.argv[0] devient crawling_instagram.py , sys.argv[1] devient sangminem et sys.argv[2] devient 123456 .

Utilisons ceci pour écrire du code pour se connecter à Instagram comme indiqué ci-dessous.

browser = webdriver.Chrome('./chromedriver')
browser.get('https://www.instagram.com/'+sys.argv[1])
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(2)
browser.find_element_by_name('username').send_keys(sys.argv[1])
browser.find_element_by_name('password').send_keys(sys.argv[2])
browser.find_element_by_xpath('//*[@id="loginForm"]/div[1]/div[3]/button').submit()
time.sleep(5)
browser.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/div/div/button').click()

J'ai ouvert le navigateur Web Chrome à l'aide de chromedriver et je me suis connecté en combinant l'adresse Instagram et le nom d'utilisateur.

J'ai cliqué sur le bouton suiveur en utilisant browser.execute_script pour ouvrir la fenêtre de connexion.

(Si vous cliquez alors que vous n'êtes pas connecté, la fenêtre de connexion s'affiche.)

Après cela, j'ai mis 2 secondes d'attente au cas où le chargement serait plus long.

Ensuite, le type d'entrée trouve les parties nom d'utilisateur et mot de passe, et la méthode send_keys est utilisée pour saisir le nom d'utilisateur et le mot de passe.

Et j'ai trouvé le bouton de connexion dans le formulaire avec xpath et j'ai appelé la méthode submit.

Vous pouvez obtenir xpath en cliquant avec le bouton droit sur l'élément que vous souhaitez rechercher dans l'onglet Éléments du développeur, qui apparaît lorsque vous appuyez sur F12 dans Chrome, et en sélectionnant Copier > Copier xpath.

Attendez 5 secondes pour la prochaine connexion.

C'est le code que j'ai écrit pour cliquer sur le bouton Do plus tard en utilisant à nouveau xpath.

Puisque cette partie doit simplement être sautée, une explication détaillée sera omise.

Obtenir la liste des abonnés

Maintenant que la connexion est terminée, implémentons la logique pour obtenir le nombre d'abonnés.

time.sleep(2)
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('._aano')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('._aano')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followers = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followers_text = []
for follower in followers:
    followers_text.append(follower.get_text())
print("Number of followers: " + str(len(followers_text)))

Après avoir attendu à nouveau 2 secondes pour éviter tout dysfonctionnement, j'ai cliqué à nouveau sur le barton suiveur.

Et c'est la partie qui attend 1 seconde et obtient sérieusement le nom d'utilisateur du suiveur.

Comme nous devons d'abord obtenir tous les abonnés, nous avons implémenté la logique pour abaisser le défilement à plusieurs reprises afin de charger tout le monde via l'instruction while.

Si l'ancienne hauteur de défilement et la nouvelle hauteur de défilement sont différentes, cela signifie qu'il y a plus à charger, il s'agit donc d'une syntaxe qui se répète jusqu'à ce que l'ancienne hauteur de défilement et la nouvelle hauteur de défilement soient identiques.

Le nom de la classe, qui est la valeur de l'argument de la méthode querySelectorAll, correspond aux valeurs directement visualisées et importées depuis l'onglet Developer Mode Elements.

Après le chargement, importez les données html via le module BeautifulSoup, vérifiez les balises et les classes avec les noms d'utilisateur, extrayez-les toutes et placez-les dans un tableau.

J'ai obtenu la longueur du tableau avec la méthode d'impression et j'ai imprimé le nombre d'abonnés à l'écran.

Obtenez votre liste suivante

Ensuite, obtenons le nombre d'abonnés.

browser.find_element_by_xpath('/html/body/div[4]/div/div/div[1]/div/div[2]/button').click()
time.sleep(0.5)
browser.execute_script("document.querySelectorAll('.-nal3')[2].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('._aano')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('._aano')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followings = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followings_text = []
for following in followings:
    followings_text.append(following.get_text())
print("Number of followings: " + str(len(followings_text)))

Cliquez sur le bouton de fermeture à l'aide de XPath pour fermer la fenêtre du suiveur.

Ensuite, j'ai attendu une demi-seconde et j'ai cliqué sur le bouton suivant.

Et puis j'ai encore attendu 1 seconde et j'ai obtenu le nom d'utilisateur que je suivais.

Le modèle pour obtenir un nom d'utilisateur suiveur est presque similaire, donc je n'y reviendrai pas.

Obtenez uniquement les personnes que vous suivez

Enfin, comparons la liste des noms d'utilisateurs suiveurs avec la liste des noms d'utilisateurs suivants pour trouver les non-suiveurs.

result = []
for following in followings_text:
    cnt = 0
    for follower in followers_text:
        if following == follower:
            cnt += 1
            break
    if cnt == 0:
        result.append(following)
print('List of people who did not F4F: '+str(result))

Sur la base du nom d'utilisateur suivant, nous avons vérifié la liste de tous les noms d'utilisateur suiveurs un par un, compté s'il y en avait et exécuté à plusieurs reprises la logique pour quitter.

Si le comptage est 0, cela signifie que je suis mais pas sur la liste des suiveurs, donc je ne l'ai pas F4F et je l'ai ajouté au tableau de résultats.

Enfin, la sortie du tableau résultant atteint l'objectif souhaité.

Juste comme ça.

J'ai suivi mais pas toi ? ㅠ

Pour référence, je ne fais que suivre mes connaissances, donc il n'y a pas beaucoup de gens qui ne me suivent pas.

Il a simplement servi son but.

Partage complet des sources

Si quelqu'un le veut, merci de le partager.

import time
import sys
from selenium import webdriver
from bs4 import BeautifulSoup
username = sys.argv[1]
browser = webdriver.Chrome('./chromedriver')
browser.get('https://www.instagram.com/'+username)
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(2)
browser.find_element_by_name('username').send_keys(sys.argv[1])
browser.find_element_by_name('password').send_keys(sys.argv[2])
browser.find_element_by_xpath('//*[@id="loginForm"]/div[1]/div[3]/button').submit()
time.sleep(5)
browser.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/div/div/button').click()
time.sleep(5)
if len(sys.argv) > 3:
    username = sys.argv[3]
print('Account: ' + username)
browser.get('https://www.instagram.com/'+username)
time.sleep(2)
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('.jSC57')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('.jSC57')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followers = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followers_text = []
for follower in followers:
    followers_text.append(follower.get_text())
print("Number of followers: " + str(len(followers_text)))
browser.find_element_by_xpath('/html/body/div[4]/div/div/div[1]/div/div[2]/button').click()
time.sleep(0.5)
browser.execute_script("document.querySelectorAll('.-nal3')[2].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('._aano')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('._aano')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followings = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followings_text = []
for following in followings:
    followings_text.append(following.get_text())
print("Number of followings: " + str(len(followings_text)))
result = []
for following in followings_text:
    cnt = 0
    for follower in followers_text:
        if following == follower:
            cnt += 1
            break
    if cnt == 0:
        result.append(following)
print('List of people who did not F4F: '+str(result))

A la prochaine avec un autre sujet. 🙂

(Attention) Le nom de la classe peut être modifié de temps à autre. Par conséquent, si le programme ne fonctionne pas, vous devrez peut-être déterminer vous-même la structure de la balise Instagram pour y remédier.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

fr_FRFrançais