Невозможно выйти из цикла, когда браузер достигает нижней части веб-страницы

1

Я написал сценарий на питоне в сочетании с селеном, чтобы разобрать все имена кофейных магазинов, доступные на веб-странице. На веб-странице включен метод lazyloading, поэтому я могу видеть 40 имен в каждом прокрутке. Если я прокручиваю 2 раза, число видимых имен равно 80 и так далее.

На этой веб-странице доступно 125 имен. Мой нижеприведенный скрипт может дойти до нижней части этой страницы, обрабатывая все прокрутки, но не может выйти из цикла, чтобы распечатать содержимое.

Это мой сценарий до сих пор:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 4)
driver.get("https://www.yellowpages.ca/search/si/1/coffee/all%20states")

itemlist = []
while True:
    for elem in wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME,"listing__name--link"))):
        if elem.text not in itemlist:
            itemlist.append(elem.text)

    try:
        driver.execute_script("arguments[0].scrollIntoView();",elem)
    except Exception:break

for item in itemlist:
    print(item)

driver.quit()

Содержимое этой страницы не генерируется динамически, поэтому я могу получить их все, используя requests только изменяющие количество этой части /si/1/coffee/ url. Тем не менее, я хотел бы получить их, используя свиток контроля селена.

Postscript: я не хочу решать с помощью driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") или for item in range(3): elem.send_keys(Keys.END) поскольку я уже получили успех, используя их.

Все, что мне нужно знать, как я могу вырваться из цикла, помещая какое-либо условие внутри.

Теги:
python-3.x
web-scraping
selenium
selenium-webdriver

2 ответа

3
Лучший ответ

Вы можете попробовать выполнить следующее условие: разбить цикл, если количество записей остается неизменным в течение таймаута:

itemlist = []
while True:
    for elem in wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME,"listing__name--link"))):
        if elem.text not in itemlist:
            itemlist.append(elem.text)
    current_len = len(driver.find_elements_by_class_name("listing__name--link"))
    try:
        driver.execute_script("arguments[0].scrollIntoView();",elem)
        wait.until(lambda driver: len(driver.find_elements_by_class_name("listing__name--link")) > current_len)
    except Exception:break

for item in itemlist:
    print(item)

driver.quit()
  • 0
    Приятно снова найти вас в курсе @sir Andersson. Я попробовал ваш сценарий, но цикл все еще включен. Сценарий не может вырваться из этого.
  • 0
    @ Toto, да, я был смущен itemlist : я думал, что это был список узлов, но это список строк ... Проверка обновлена
Показать ещё 1 комментарий
0

В while True цикл сохранить логическую переменную done набор в True. Если вы добавите элемент в список, установите значение false.

Вне перерыва цикла, если done = True.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню