#python #selenium #web-scraping #beautifulsoup
#python #selenium #очистка веб-страниц #beautifulsoup
Вопрос:
Я использую Python и Selenium. Я хочу прокручивать представление по пикселям, а не по элементам. Суть в том, чтобы выполнять цикл до тех пор, пока я не прокручу список до конца. В качестве тренировки я пытался прокрутить весь список людей, которым понравился этот пост Instagram: https://www.instagram.com/p/BuT_u-UAKn1 / . Я знаю, как прокручивать элементы:
elements = driver.find_elements_by_xpath("//*[@id]/div/a")
driver.execute_script("return arguments[0].scrollIntoView();", elements[-1])
Но я хотел бы прокручивать по пикселям. Я попытался сделать следующее:
driver.execute_script("return arguments[0].scrollIntoView(true);", elements)
driver.execute_script("window.scrollBy(0,200);")
При этом возникает эта ошибка:
JavascriptException: Message: TypeError: arguments[0].scrollIntoView is not a function
Кто-нибудь знает, как перейти к просмотру по пикселям?
Спасибо
Ответ №1:
У меня сработало приведенное ниже.
#first move to the element
self.driver.execute_script("return arguments[0].scrollIntoView(true);", element)
#then scroll by x, y values, in this case 10 pixels up
self.driver.execute_script("window.scrollBy(0, -10);")
Когда вы говорите прокрутить на (0,200). Положительное число означает прокрутку ВНИЗ. Если вы хотите прокрутить ВВЕРХ, используйте отрицательное значение -200
Также смотрите документацию здесь: https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollBy
Если вы используете браузер, который не поддерживает scrollToOptions, переключитесь на лучший браузер с большей поддержкой.
Другим возможным решением является реализация WebDriverWait для отображения конкретного элемента в HTML DOM
element = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "element_css")))
self.driver.execute_script("return arguments[0].scrollIntoView(true);", element)
Также вы можете попробовать использовать ActionChains
element = driver.find_element_by_id("id") # the element you want to scroll to
ActionChains(driver).move_to_element(element).perform()
После перехода к элементу вы можете использовать код прокрутки
Вы также можете попробовать добавить смещение. Некоторые веб-страницы не будут загружать новое содержимое, если вы прокрутите их до самого низа. Некоторые веб-страницы загружают новое содержимое только по мере того, как вы доходите до конца страницы.
document.documentElement.scrollHeight-10
Менее традиционным способом было бы выполнить javascript в вашем коде.
Также попробуйте увеличить окно с помощью selenium. Иногда размер окна влияет на работу Selenium
driver.maximize_window()
findThis = driver.find_element_by_css_selector("CSS SELECTOR HERE")
jsScript = """
function move_up(element) {
element.scrollTop = element.scrollTop - 1000;
}
function move_down(element) {
console.log('Position before: ' element.scrollTop);
element.scrollTop = element.scrollTop 1000;
console.log('Position after: ' element.scrollTop);
}
move_up(arguments[0]);
"""
driver.execute_script(jsScript, findThis)