3

J'ai un bloc de code, qui explore un site Web de hauteur infinie (Like FACEBOOK).Exécution de boucle synchrone en python

Le script Python sélénium demande à la page javascript d'aller au bas de la page pour charger la page plus bas. Mais finalement il arrive que la boucle fonctionne de manière asynchrone et que le limiteur de débit du site bloque le script.

J'ai besoin de la page pour attendre le chargement de la page, puis continuer, mais je n'ai pas réussi à le faire.

Les choses suivantes sont ce que j'ai essayé jusqu'à maintenant.

Le code est le suivant:

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)) 

La sortie est quelque chose comme

enter image description here

que j'interprété comme la boucle en cours d'exécution à plusieurs reprises lorsque la valeur est 43, 63... and so on.

J'ai aussi essayé de le rendre récursif, mais le résultat est toujours le même. Le code récursif est le suivant:

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 

Tout type de pourboire est apprécié.

+0

Après chaque rouleau avez-vous un élément sur lequel vous pouvez configurer une attente pour être visible après le chargement des nouvelles informations. Par exemple un texte d'instruction pour défiler plus ou une classe unique pour le dernier article de nouvelles etc etc ... – Grasshopper

+0

@Grasshopper Le problème est que je n'ai pas un nom de classe/id unique lors du défilement. Tout ce que j'ai sont des éléments d'un nom de classe particulier "news-text" –

+0

Que diriez-vous d'attendre tous les éléments de cette classe après chaque défilement? Ne pas connaître la méthode exacte en python mais en Java, vous pouvez attendre la visibilité ou la présence de tous les éléments pour un localisateur. – Grasshopper

Répondre

3

Vous pouvez définir les page_load_timeout pour rendre l'attente du pilote pour la page pour charger

driver.set_page_load_timeout(10) 

Une autre option est d'attendre que le nombre d'éléments à changer

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

Pouvez-vous expliquer votre réponse un peu plus? –

+0

@CodeGirl Le pilote attendra jusqu'à 10 secondes pour que la page se charge. Vous le définissez une fois après la création du pilote. – Guy

+0

Pas exactement ... Cela signifie que si la page ne se charge pas dans les 10 secondes, il y aura une erreur. Donc, si la page est chargée dans les 10 secondes, elle n'attendra pas cette heure. De plus, cela ne s'applique pas à un appel asynchrone comme ceux initiés par le défilement. – Grasshopper