Я пытаюсь создать программу, извлекающую всех людей, за которыми я следую в Instagram. Я использую Python, Selenium и Chromedriver.
Для этого я сначала получаю количество подписчиков и нажимаю на кнопку «следующий»: `
nb_abonnements = int(webdriver.find_element_by_xpath('/html/body/span[1]/section[1]/main/div[1]/header/section[1]/ul/li[3]/a/span').text)
sleep(randrange(1,3))
abonnements = webdriver.find_element_by_xpath('/html/body/span[1]/section[1]/main/div[1]/header/section[1]/ul/li[3]/a')
abonnements.click()
Затем я использую следующий код, чтобы получить подписчиков и прокрутить всплывающую страницу на случай, если я не смогу ее найти:
followers_panel = webdriver.find_element_by_xpath('/html/body/div[3]/div/div/div[2]')
while i < nb_abonnements:
try:
print(i)
followed = webdriver.find_element_by_xpath('/html/body/div[3]/div/div/div[2]/ul/div/li[{}]/div/div[2]/div/div/div/a'.format(i+1)).text
#the followeds are in an ul-list
i += 1
followed_list.append(followed)
except NoSuchElementException:
webdriver.execute_script(
"arguments[0].scrollBy(0,400)",followers_panel
)
sleep(7)
Проблема в том, что как только мне исполнится 12, программа вызывает исключение и прокручивает. Оттуда он все еще не может найти следующего последователя и застрял в цикле, где он делает только прокрутку. Я проверил исходный код страницы IG, и оказалось, что путь все еще хорош, но, очевидно, я не могу получить доступ к элементам, как я делаю больше, вероятно, потому что ul-list, в котором я обращаюсь к ним, стал long (строка 5 программы).
Я не могу понять, как это решить. Я надеюсь, что вы окажете некоторую помощь.
ОБНОВЛЕНИЕ: DOM выглядит так:
html
body
span
script
...
div[3]
div
...
div
div
div[2]
ul
div
li
li
li
li
...
li
ul
- список подписчиков.
li
содержат информацию, которую я пытаюсь извлечь (имя пользователя). Даже когда я сам захожу на веб-страницу, открываю всплывающее окно, немного прокручиваю и позволяю всем загружаться, я не могу найти искомый элемент, набрав xpath в строке поиска DOM вручную. Хотя путь правильный, я могу проверить его, посмотрев на DOM.
Я пробовал различные веб-драйверы для селена, в настоящее время я использую chromedriver 2.45.615291. Я также установил явное ожидание для ожидания показа элемента (WebDriverWait(webdriver, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[3]/div/div/div[2]/ul/div/li[{}]/div/div[2]/div/div/div/a'.format(i+1))))
), но я просто получаю исключение тайм-аута: selenium.common.exceptions.TimeoutException: Message:
.
Похоже, что если список ul слишком длинный (то есть с того момента, как я прокрутил его достаточно, чтобы загрузить новых людей), я не могу получить доступ ни к одному элементу списка по его XPATH, даже к элементам, которые были уже загружены, прежде чем я начал прокручивать.