Очистка веб-страниц с помощью Python: Как перейти к просмотру по пикселям?

#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)