Je veux gratter toutes les données d'une page implémentée par un scroll infini. Le code python suivant fonctionne.
for i in range(100):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5)
Cela signifie que chaque fois que je fais défiler vers le bas, je dois attendre 5 secondes, ce qui est généralement suffisant pour que la page termine le chargement du contenu nouvellement généré. Mais cela peut ne pas être efficace en termes de temps. La page peut finir de charger le nouveau contenu dans les 5 secondes. Comment puis-je détecter si la page a fini de charger le nouveau contenu à chaque fois que je fais défiler vers le bas? Si je peux détecter cela, je peux à nouveau faire défiler vers le bas pour voir plus de contenu une fois que je sais que la page a fini de charger. C'est plus efficace en temps.
python
selenium
execute-script
Apogne
la source
la source
Réponses:
Le
webdriver
va attendre qu'une page se charge par défaut via la.get()
méthode.Comme vous recherchez peut-être un élément spécifique comme l'a dit @ user227215, vous devriez utiliser
WebDriverWait
pour attendre un élément situé dans votre page:Je l'ai utilisé pour vérifier les alertes. Vous pouvez utiliser toute autre méthode de type pour trouver le localisateur.
MODIFIER 1:
Je dois mentionner que le
webdriver
va attendre qu'une page se charge par défaut. Il n'attend pas le chargement à l'intérieur des cadres ou les requêtes ajax. Cela signifie que lorsque vous utilisez.get('url')
, votre navigateur attendra que la page soit complètement chargée, puis passera à la commande suivante dans le code. Mais lorsque vous postez une demande ajax,webdriver
n'attendez pas et il est de votre responsabilité d'attendre un laps de temps approprié pour que la page ou une partie de la page se charge; il y a donc un module nomméexpected_conditions
.la source
browser.find_element_by_id('IdOfMyElement')
faitNoSuchElementException
monter a. La documentation dit de passer un tuple qui ressemble à ceci:(By.ID, 'IdOfMyElement')
. Voir ma réponseclick()
), lire du texte, etc. J'avais l'impression erronée que c'était juste a causé une attente, après quoi vous deviez toujours trouver l'élément. Si vous faites une attente, puis un élément de recherche après, le sélénium se trompera car il essaiera de trouver l'élément pendant que l'ancienne attente est toujours en cours de traitement (j'espère que cela a du sens). En bout de ligne, vous n'avez pas besoin de trouver l'élément après avoir utilisé WebDriverWait - c'est déjà un objet.Essayer de passer
find_element_by_id
au constructeur pourpresence_of_element_located
(comme indiqué dans la réponse acceptée ) a provoquéNoSuchElementException
une levée. J'ai dû utiliser la syntaxe du commentaire de fragles :Cela correspond à l' exemple de la documentation . Voici un lien vers la documentation de By .
la source
EC.presence_of_element_located((By.XPATH, "//*[@title='Check All Q1']"))
By
objet.Retrouvez ci-dessous 3 méthodes:
readyState
Vérification de l'état de la page prête (non fiable):
id
Comparaison des nouveaux identifiants de page avec l'ancien:
staleness_of
En utilisant la
staleness_of
méthode:Pour plus de détails, consultez le blog de Harry .
la source
self.driver.execute_script('return document.readyState;')
n'est pas fiable? Cela semble fonctionner parfaitement pour mon cas d'utilisation, qui attend qu'un fichier statique se charge dans un nouvel onglet (qui est ouvert via javascript dans un autre onglet au lieu de .get ()).Comme mentionné dans la réponse de David Cullen , j'ai toujours vu des recommandations d'utiliser une ligne comme la suivante:
Il était difficile pour moi de trouver quelque part tous les localisateurs possibles pouvant être utilisés avec le
By
, donc j'ai pensé qu'il serait utile de fournir la liste ici. Selon Web Scraping with Python par Ryan Mitchell:la source
Depuis selenium / webdriver / support / wait.py
la source
En passant, au lieu de faire défiler 100 fois vers le bas, vous pouvez vérifier s'il n'y a plus de modifications dans le DOM (nous sommes dans le cas où le bas de la page est chargé paresseux AJAX)
la source
Avez-vous essayé
driver.implicitly_wait
. C'est comme un paramètre pour le pilote, donc vous ne l'appelez qu'une seule fois dans la session et cela dit essentiellement au pilote d'attendre le laps de temps donné jusqu'à ce que chaque commande puisse être exécutée.Donc, si vous définissez un temps d'attente de 10 secondes, il exécutera la commande dès que possible, en attendant 10 secondes avant d'abandonner. J'ai utilisé cela dans des scénarios de défilement similaires, donc je ne vois pas pourquoi cela ne fonctionnerait pas dans votre cas. J'espère que cela est utile.
Pour pouvoir corriger cette réponse, je dois ajouter un nouveau texte. Veillez à utiliser un «w» minuscule dans
implicitly_wait
.la source
Que diriez-vous de mettre WebDriverWait dans la boucle While et d'attraper les exceptions.
la source
Ici, je l'ai fait en utilisant un formulaire assez simple:
la source
Vous pouvez le faire très simplement avec cette fonction:
et lorsque vous voulez faire quelque chose une fois le chargement de la page terminé, vous pouvez utiliser:
la source