3

У меня есть блок кода, который сканирует веб-сайт бесконечной высоты (Like FACEBOOK).Запуск цикла синхронно в python

Сценарий Selenium Python запрашивает у страницы javascript страницу в нижней части страницы, чтобы загрузить страницу ниже. Но в итоге бывает, что цикл работает асинхронно, а ограничитель скорости веб-сайта блокирует скрипт.

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

Следующее, что я пробовал до сих пор.

Код выглядит следующим образом:

while int(number_of_news) != int(len(news)) : 
    driver.execute_script("window.scrollTo(document.body.scrollHeight/2, document.body.scrollHeight);") 
    news = driver.find_elements_by_class_name("news-text") 
    print(len(news)) 

Выход нечто вроде

enter image description here

Что я интерпретировано как цикл выполняется несколько раз, когда значение 43, 63... and so on.

Я также попытался сделать его рекурсивным, но результат все тот же. Рекурсивный код выглядит следующим образом:

def call_news(_driver, _news, _number_of_news): 
    _driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
    _news = driver.find_elements_by_class_name("news-text") 
    print(len(_news)) 
    if int(len(_news)) != int(number_of_news) : 
     call_news(_driver, _news, _number_of_news) 
    else : 
     return _news 

Рассматривается любой вид наконечника.

+0

После каждого свитка у вас есть некоторый элемент, на котором вы можете настроить ожидание, чтобы быть видимым после загрузки новых новостей. Например, текст команды для прокрутки большего или какого-либо уникального класса для последнего элемента новостей и т. Д. И т. Д. – Grasshopper

+0

@Grasshopper Проблема в том, что при прокрутке у меня нет уникального имени класса/идентификатора. Все, что у меня есть, - это элементы определенного имени класса «news-text» –

+0

Как насчет ожидания всех элементов с этим классом после каждого прокрутки? Не знаю о точном методе в python, но в java вы можете ждать видимости или наличия всех элементов для локатора. – Grasshopper

ответ

3

Вы можете установить page_load_timeout сделать ожидание драйвера для страницы, чтобы загрузить

driver.set_page_load_timeout(10) 

Другой вариант заключается в ждать числа элементов для изменения

current_number_of_news = 0 
news = [] 
while int(number_of_news) != int(len(news)) : 
    driver.execute_script("window.scrollTo(document.body.scrollHeight/2, document.body.scrollHeight);") 
    while (current_number_of_news == len(news)) : 
     news = driver.find_elements_by_class_name("news-text") 
    current_number_of_news = len(news) 
    print(len(news)) 
+0

Не могли бы вы объяснить свой ответ немного больше. –

+0

@CodeGirl Это заставит водителя ждать 10 секунд для загрузки страницы. Вы определяете его один раз после создания драйвера. – Guy

+0

Не совсем ... Это означает, что если страница не загружается в течение 10 секунд, она выдает ошибку. Поэтому, если страница загружается в течение 10 секунд, она не будет ждать этого времени. Плюс это не относится к асинхронному вызову, подобному инициативам, прокручиваемым. – Grasshopper