Categorias
codificação

É possível verificar automaticamente o status F4F (seguir) do Instagram?

olá.

Também estou experimentando várias coisas enquanto estudava engatinhar pela primeira vez.

Desta vez, gostaria de aplicá-lo ao Instagram, um dos SNS mais populares recentemente.

Para torná-lo interessante, estou tentando fazer o seguinte usando um pouco da psicologia humana.

Que tal isso? você não quer tentar 🙂

Às vezes as pessoas param de me seguir. TT

Agora, vamos fazer passo a passo.

Importe os módulos necessários

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

O módulo webdriver do pacote selenium inicia um navegador web e permite que você execute ações de acordo com comandos de script, e o módulo BeautifulSoup no pacote bs4 possui uma função que permite extrair facilmente o conteúdo desejado de dados HTML DOM.

Se os pacotes selenium e bs4 não existirem, instale-os digitando o seguinte na janela de comando.

pip install bs4
pip install selenium

E o Chrome webdriver pode ser baixado no link abaixo.

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

O resto são módulos básicos, então você pode importá-los e usá-los imediatamente.

entrar no Instagram

Agora abra o navegador Chrome e tente fazer login acessando o endereço do Instagram.

Vamos receber a entrada diretamente da janela de comando.

Por exemplo, suponha que você digite o seguinte na janela de comando.

python crawling_instagram.py sangminem 123456

onde sys.argv[0] se torna crawling_instagram.py , sys.argv[1] se torna sangminem e sys.argv[2] se torna 123456 .

Vamos usar isso para escrever o código para fazer login no Instagram, conforme mostrado abaixo.

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()

Abri o navegador da Web Chrome usando o chromedriver e conectei combinando o endereço do Instagram e o nome de usuário.

Cliquei no botão seguidor usando browser.execute_script para abrir a janela de login.

(Se você clicar quando não estiver conectado, a janela de login será exibida.)

Depois disso, coloquei uma espera de 2 segundos caso o carregamento fosse mais longo.

Em seguida, o tipo de entrada encontra as partes de nome de usuário e senha, e o método send_keys é usado para inserir o nome de usuário e a senha.

E encontrei o botão de login no formulário com xpath e chamei o método submit.

Você pode obter o xpath clicando com o botão direito do mouse no elemento que deseja encontrar na guia Elementos do desenvolvedor, que aparece quando você pressiona F12 no Chrome, e selecionando Copiar > Copiar xpath.

Aguarde 5 segundos para o próximo login.

Este é o código que escrevi para clicar no botão Fazer mais tarde usando o xpath novamente.

Uma vez que esta parte deve ser simplesmente ignorada, uma explicação detalhada será omitida.

Obter lista de seguidores

Agora que o login está completo, vamos implementar a lógica para obter o número de seguidores.

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)))

Depois de esperar 2 segundos novamente para evitar o mau funcionamento, cliquei no barton seguidor novamente.

E esta é a parte que espera por 1 segundo e obtém o nome de usuário do seguidor a sério.

Como precisamos obter todos os seguidores primeiro, implementamos a lógica para diminuir repetidamente a rolagem para carregar todos através da instrução while.

Se a altura de rolagem antiga e a nova altura de rolagem forem diferentes, significa que há mais para carregar, portanto, essa é uma sintaxe que continua se repetindo até que a altura de rolagem antiga e a nova altura de rolagem sejam as mesmas.

O nome da classe, que é o valor do argumento do método querySelectorAll, são os valores diretamente visualizados e importados da guia Elementos do Modo de Desenvolvedor.

Após o carregamento, importe os dados html através do módulo BeautifulSoup, verifique tags e classes com nomes de usuários, extraia todos eles e coloque-os em um array.

Peguei o comprimento do array com o método print e imprimi o número de seguidores na tela.

Obtenha sua lista a seguir

Em seguida, vamos obter o número de seguidores.

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)))

Clique no botão fechar usando xpath para fechar a janela do seguidor.

Então esperei meio segundo e cliquei no botão a seguir.

E então esperei 1 segundo novamente e obtive o nome de usuário que estava seguindo.

O padrão para obter um nome de usuário de seguidor é quase semelhante, então não vou entrar nisso novamente.

Obtenha apenas pessoas que você segue

Por fim, vamos comparar a lista de nomes de usuários de seguidores com a lista de nomes de usuários a seguir para encontrar os não seguidores.

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))

Com base no nome de usuário a seguir, verificamos a lista de todos os nomes de usuário seguidores um por um, contamos se houve e executamos repetidamente a lógica para sair.

Se a contagem for 0, significa que estou seguindo, mas não na lista de seguidores, então não fiz F4F e adicionei ao array de resultados.

Finalmente, a saída do array resultante atinge o propósito desejado.

Bem assim.

Eu segui, mas você não? ㅠ

Para referência, eu só sigo meus conhecidos, então não há muitas pessoas que não me seguem.

Simplesmente serviu ao seu propósito.

Compartilhamento completo da fonte

Se alguém quiser, por favor, compartilhe.

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))

Até a próxima com outro tópico. 🙂

(Cuidado) O nome da classe pode ser alterado de tempos em tempos, portanto, se o programa não funcionar, talvez seja necessário descobrir a estrutura de tags do Instagram para corrigi-lo.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

pt_PTPortuguês