Получайте лайки из роликов Instagram

Пытаясь изучить закон Бенфорда, я пытаюсь получить список лайков на рекомендуемых роликах в Instagram. Итак, план состоит в том, чтобы просто открыть барабаны, получить количество лайков, перейти к следующему барабану и повторять, пока у меня не будет достаточно данных.

Я пытаюсь сделать это на Python с помощью Selenium Webdriver:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import pyautogui
import time

driver = webdriver.Chrome()
driver.get("https://www.instagram.com/")  # open instagram
time.sleep(2)
driver.find_element(By.XPATH, '//button[text() = "Allow all cookies"]').click()  # allow cookies
time.sleep(3)
user_field = driver.find_element(By.NAME, "username")  # enter username
user_field.send_keys("my_username")
user_field.send_keys(Keys.ENTER)
password_field = driver.find_element(By.NAME, "password")  # enter password
password_field.send_keys("my_password")
password_field.send_keys(Keys.ENTER)
time.sleep(5)
driver.get('https://www.instagram.com/reels')  # go to reels
for i in range(1, 5):  # swipe 5 reels then just wait
    time.sleep(5)
    # get how many likes the reel has (this doesn't seem to update)
    div_element = driver.find_element(By.CSS_SELECTOR, '.html-div.xe8uvvx.xdj266r.x11i5rnm.x1mh8g0r.xexx8yu.x4uap5.x18d9i69.xkhd6sd.x6s0dn4.x1ypdohk.x78zum5.xdt5ytf.xieb3on')
    # get likes by xpath (doesn't work crashes program)
    # div_element = driver.find_element(By.XPATH, '//*[@id = "mount_0_0_vZ"]/div/div/div[2]/div/div/div[1]/div[1]/div[2]/section/main/div[2]/div[9]/div/div[2]/div[1]/div/div/div/span/span')
    # get all the buttons (works but there is alot of other unnecessay data)
    # div_element = driver.find_element(By.XPATH, '//div[@role = "button"]')
    like_text = div_element.text
    print(like_text)  # print out the likes
    time.sleep(3)
    pyautogui.press('down')  # swipe to next reel

time.sleep(5000)

В коде я пытаюсь получить доступ к выделенному элементу диапазона на рисунке:

Этот блок промежутков кажется идентичным для всех остальных барабанов, за исключением количества одинаковых символов.

Но если я запускаю код, он не может обновить счетчик лайков, поэтому выводит:

165K
165K
165K
165K

Я пытался получить доступ к этому элементу разными методами (XPATH, CSS_SELECTOR, NAME, ID,...), некоторые из них терпят крах, другие ничего не возвращают. Есть идеи, что делать?

🤔 А знаете ли вы, что...
Python поддерживает динамическую типизацию, что облегчает разработку.


110
2

Ответы:

Проблема, с которой вы столкнулись, вероятно, связана с тем, что Instagram динамически загружает контент. Исходный HTML-код, который вы видите, может не содержать обновленного количества лайков для последующих роликов.

Используйте явные ожидания Вместо того, чтобы полагаться на фиксированные задержки time.sleep, используйте Selenium WebDriverWait с ожидаемым условием для ожидания обновления элемента счетчика лайков. Вы можете использовать ExpectedConditions.presence_of_element_located или ExpectedConditions.text_to_be_present_in_element в зависимости от ваших потребностей.

Демонстрационный псевдокод:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# ... Your Existing Code  ...
wait = WebDriverWait(driver, 10)  # Set a wait time of 10 seconds
like_element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.html-div.xe8uvvx...)))
like_text = like_element.text
print(like_text)

Решено

Как упоминалось в комментариях, возможно, старый ролик не удаляется из DOM при прокрутке. Поскольку find_element возвращает только первое совпадение, это значение никогда не изменится, если в DOM останутся более ранние ролики. Вместо этого попробуйте find_elements и получите желаемое значение.