Возникли проблемы с извлечением динамического списка div при прокрутке вниз с помощью Webdriver (selenium и python)

Мне сложно понять, как получить обновленный динамический список при прокрутке страницы вниз с помощью Webdriver в Selenium и Python3. https://www.ubereats.com/stores/ это веб-сайт, который я пытаюсь очистить, и если сайт направляет вас на домашнюю страницу, введите любой город и щелкните, чтобы отобразить список ресторанов в div.

Интересно то, что если вы перейдете к проверке элемента, список <div class = "base_ ue-ff ...>..</div> изменится по мере того, как я прокручиваю страницу вниз, и даже если я прокручиваю страницу вниз с помощью веб-драйвера в selenium python, он по-прежнему извлекает старые данные, которые были извлечены в первое место. Ниже мой пример кода. Я также сделал функцию сна, чтобы данные загружались, но не было никакой разницы в извлечении данных.

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from urlib.request import urlopen
from importlib import reload
import re
import sys

driver = webdriver.Chrome(path_chrome_driver)
driver.get('https://www.ubereats.com')

wait_time_for_search_complete = float(np.random.uniform(1,2,1))
time.sleep(wait_time_for_search_complete)

input_city_name = driver.find_element_by_xpath("//input[@placeholder='Enter your delivery address']")

time_to_wait_to_enter_city_name = float(np.random.uniform(1, 2, 1))
time.sleep(time_to_wait_to_enter_city_name)

input_city_name.send_keys('Sydney')

time_to_wait_to_write_city = float(np.random.uniform(2, 3, 1))
time.sleep(time_to_wait_to_write_city)

select_first_in_dropdown = driver.find_element_by_xpath('//*[@id = "app-content"]/div/div[1]/div/div[1]/div[1]/div[2]/div/div/div[3]/div[1]/div/div/div[2]/div/div/button[1]')
select_first_in_dropdown.click()

time_to_wait_to_load_restaurants = float(np.random.uniform(2, 3, 1))
time.sleep(time_to_wait_to_load_restaurants)

current_page = driver.page_source
soup = BeautifulSoup(current_page,'html.parser')

height = 0
restaurant_site = []
while True:
  restaurant_information = ''
  restaurant_information = soup.find_all('a',['base_','ue-kl','ue-km','ue-kn','ue-ko'])
  time.sleep(5)
  for restaurant in restaurant_information:
    print(restaurant['href'])

  height += 1000
  driver.execute_script("window.scrollTo(0,"+ str(height) +")")
  driver.implicitly_wait(3)

Мне действительно трудно понять, как получить список ресторанов, когда я прокручиваю страницу вниз, поскольку div является динамическим. Я считаю, что это как-то связано с вызовом ajax, но если у вас есть альтернативное решение, дайте мне знать. Очень хочу решить эту проблему как можно скорее.

Спасибо!!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
274
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы просто забыли обновить HTML при прокрутке вниз. Исправить легко, просто переместите приведенный ниже код в цикл.

current_page = driver.page_source
soup = BeautifulSoup(current_page,'html.parser')

См. Пример ниже.

...
time_to_wait_to_load_restaurants = float(np.random.uniform(2, 3, 1))
time.sleep(time_to_wait_to_load_restaurants)

height = 0
restaurant_site = []
while True:
    current_page = driver.page_source
    soup = BeautifulSoup(current_page,'html.parser')
    restaurant_information = ''
    restaurant_information = soup.find_all('a',['base_','ue-kl','ue-km','ue-kn','ue-ko'])
    time.sleep(5)
    for restaurant in restaurant_information:
        print(restaurant['href'])

    height += 1000
    driver.execute_script("window.scrollTo(0,"+ str(height) +")")
    driver.implicitly_wait(3)

Другие вопросы по теме