Я написал сценарий на питоне в сочетании с селеном, чтобы разобрать все имена кофейных магазинов, доступные на веб-странице. На веб-странице включен метод 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)
поскольку я уже получили успех, используя их.
Все, что мне нужно знать, как я могу вырваться из цикла, помещая какое-либо условие внутри.
Вы можете попробовать выполнить следующее условие: разбить цикл, если количество записей остается неизменным в течение таймаута:
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()
В while True
цикл сохранить логическую переменную done
набор в True. Если вы добавите элемент в список, установите значение false.
Вне перерыва цикла, если done = True
.
itemlist
: я думал, что это был список узлов, но это список строк ... Проверка обновлена