Мне сложно понять, как получить обновленный динамический список при прокрутке страницы вниз с помощью 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, но если у вас есть альтернативное решение, дайте мне знать. Очень хочу решить эту проблему как можно скорее.
Спасибо!!






Вы просто забыли обновить 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)