#python #selenium
Вопрос:
Я хочу загрузить фотографии из Instagram через сайт ingramer. Вот мой код:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import os
time_to_scroll=50
os.chdir(r'C:UsersirDownloads')
image_src_list=set()
b = webdriver.Chrome()
b.get('https://ingramer.com/profiles/instagram-viewer')
time.sleep(3)
search=b.find_element_by_id('downloaderform-url')
search.send_keys('my-instagram-user')
search.submit()
while time_to_scroll:
time.sleep(10)
image_div=b.find_elements_by_xpath('/html/body/div[1]/main/div/div[4]/div/div/div/div/div/div/div')
for div in image_div:
try:
image=div.find_element_by_tag_name('img')
if image:
image_src_list.add(image.get_attribute("src"))
except:
print('sonthing missed')
nextpage=b.find_element_by_id("viewer-next-button")
b.execute_script("arguments[0].scrollIntoView()",nextpage)
nextpage.click()
nextpage.click()
time_to_scroll-=1
def downlad_image(urls):
count=0
for url in urls:
reponse = requests.get(url)
if reponse.status_code == 200:
with open(f"search{count 1}.jpg","wb") as file:
file.write(reponse.content)
count =1
downlad_image(image_src_list)
Но это дает такую ошибку:
Traceback (most recent call last):
File "D:tamrinpythontamrin.py", line 29, in <module>
nextpage.click()
File "C:UsersirAppDataLocalProgramsPythonPython38libsite-packagesseleniumwebdriverremotewebelement.py", line 80, in click
self._execute(Command.CLICK_ELEMENT)
File "C:UsersirAppDataLocalProgramsPythonPython38libsite-packagesseleniumwebdriverremotewebelement.py", line 633, in _execute
return self._parent.execute(command, params)
File "C:UsersirAppDataLocalProgramsPythonPython38libsite-packagesseleniumwebdriverremotewebdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:UsersirAppDataLocalProgramsPythonPython38libsite-packagesseleniumwebdriverremoteerrorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
(Session info: chrome=90.0.4430.93)
В чем проблема?
Комментарии:
1. Я не понимаю эту часть
while time_to_scroll:
и выше того, что вы определилиtime_to_scroll=50
. Так что в основном вы говоритеwhile 50:
. Что это должно сделать? Я не думаю, что он делает то, о чем ты думаешь.2. @jd2775 Это правда, я хотел прокрутить страницу вниз 50 раз, чтобы загрузить все фотографии, но я не знаю лучшего способа.
Ответ №1:
Это StaleElementReferenceException
происходит, когда вы определяете элемент, переходите на другую страницу в своем тесте, а затем пытаетесь снова использовать тот же элемент. Поскольку ошибка возникает в строке 39 (ваша вторая nextpage.click()
), я ожидаю, что первая nextpage.click
перейдет на другую страницу, и поскольку nextpage
элемент был определен на предыдущей странице, вы получите StaleElementReferenceException
В любом случае, я думаю , что вы можете обойти это, просто переопределив nextpage
что-то вроде этого (если селектор останется прежним).
nextpage=b.find_element_by_id("viewer-next-button")
b.execute_script("arguments[0].scrollIntoView()",nextpage)
nextpage.click()
nextpage=b.find_element_by_id("viewer-next-button")
nextpage.click()