Hola.
También estoy probando varias cosas mientras estudio gatear por primera vez.
Esta vez, me gustaría aplicarlo a Instagram, uno de los SNS más populares recientemente.
Para hacerlo interesante, estoy tratando de hacer lo siguiente usando un poco de psicología humana.
¿Qué tal? no quieres probar 🙂
A veces la gente deja de seguirme. TT
Ahora, hagámoslo paso a paso.
Importar los módulos requeridos
import time
import sys
from selenium import webdriver
from bs4 import BeautifulSoup
El módulo webdriver del paquete selenium inicia un navegador web y le permite realizar acciones de acuerdo con los comandos del script, y el módulo BeautifulSoup en el paquete bs4 tiene una función que le permite extraer fácilmente los contenidos deseados de los datos HTML DOM.
Si los paquetes selenium y bs4 no existen, instálelos ingresando lo siguiente en la ventana de comandos.
pip install bs4
pip install selenium
Y el controlador web de Chrome se puede descargar desde el siguiente enlace.
https://sites.google.com/a/chromium.org/chromedriver/downloads
El resto son módulos básicos, por lo que puede importarlos y usarlos de inmediato.
iniciar sesión en instagram
Ahora abra el navegador Chrome e intente iniciar sesión accediendo a la dirección de Instagram.
Tomemos la entrada directamente desde la ventana de comandos.
Por ejemplo, suponga que escribe lo siguiente en la ventana de comandos.
python crawling_instagram.py sangminem 123456
donde sys.argv[0] se convierte en crawling_instagram.py , sys.argv[1] se convierte en sangminem y sys.argv[2] se convierte en 123456 .
Usemos esto para escribir código para iniciar sesión en Instagram como se muestra a continuación.
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()
Abrí el navegador web Chrome usando chromedriver y me conecté combinando la dirección de Instagram y el nombre de usuario.
Hice clic en el botón de seguidor usando browser.execute_script para abrir la ventana de inicio de sesión.
(Si hace clic cuando no ha iniciado sesión, se muestra la ventana de inicio de sesión).
Después de eso, puse una espera de 2 segundos en caso de que la carga fuera más larga.
A continuación, el tipo de entrada encuentra las partes del nombre de usuario y la contraseña, y el método send_keys se usa para ingresar el nombre de usuario y la contraseña.
Y encontré el botón de inicio de sesión en el formulario con xpath y llamé al método de envío.
Puede obtener xpath haciendo clic derecho en el elemento que desea encontrar en la pestaña Elementos del desarrollador, que aparece cuando presiona F12 en Chrome, y seleccionando Copiar> Copiar xpath.
Espere 5 segundos para el próximo inicio de sesión.
Este es el código que escribí para hacer clic en el botón Hacer más tarde usando xpath nuevamente.
Dado que esta parte simplemente debe omitirse, se omitirá una explicación detallada.
Obtener lista de seguidores
Ahora que el inicio de sesión está completo, implementemos la lógica para obtener la cantidad 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)))
Después de esperar 2 segundos nuevamente para evitar un mal funcionamiento, volví a hacer clic en el botón del seguidor.
Y esta es la parte que espera 1 segundo y obtiene el nombre de usuario del seguidor en serio.
Dado que primero necesitamos obtener a todos los seguidores, implementamos la lógica para bajar repetidamente el desplazamiento para cargar a todos a través de la instrucción while.
Si la altura de desplazamiento anterior y la altura de desplazamiento nueva son diferentes, significa que hay más para cargar, por lo que esta es una sintaxis que se sigue repitiendo hasta que la altura de desplazamiento anterior y la altura de desplazamiento nueva sean iguales.
El nombre de la clase, que es el valor del argumento del método querySelectorAll, son los valores que se ven e importan directamente desde la pestaña Elementos del modo desarrollador.
Después de cargar, importe datos html a través del módulo BeautifulSoup, verifique etiquetas y clases con nombres de usuario, extráigalos todos y colóquelos en una matriz.
Obtuve la longitud de la matriz con el método de impresión e imprimí la cantidad de seguidores en la pantalla.
Consigue tu siguiente lista
A continuación, obtengamos el 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)))
Haga clic en el botón Cerrar usando xpath para cerrar la ventana del seguidor.
Luego esperé medio segundo y presioné el siguiente botón.
Y luego esperé 1 segundo nuevamente y obtuve el nombre de usuario que estaba siguiendo.
El patrón para obtener un nombre de usuario de seguidor es casi similar, por lo que no volveré a entrar en esto.
Consigue solo a las personas que sigues
Finalmente, comparemos la lista de nombres de usuario de seguidores con la lista de los siguientes nombres de usuario para encontrar a los que no son 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))
Basándonos en el siguiente nombre de usuario, verificamos la lista de todos los nombres de usuario seguidores uno por uno, contamos si había y realizamos repetidamente la lógica para salir.
Si el conteo es 0, significa que estoy siguiendo pero no en la lista de seguidores, por lo que no lo hice F4F y lo agregué a la matriz de resultados.
Finalmente, generar la matriz resultante logra el propósito deseado.
Justo como esto
¿Yo te seguí pero tú no? ㅠ
Como referencia, solo sigo a mis conocidos, por lo que no hay muchas personas que no me sigan.
Simplemente cumplió su propósito.
Compartir fuente completa
Si alguien lo quiere, por favor comparta.
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))
Hasta la próxima con otro tema. 🙂
(Precaución) El nombre de la clase se puede cambiar de vez en cuando, por lo que si el programa no funciona, es posible que deba descubrir la estructura de la etiqueta de Instagram para solucionarlo.