Bug dans mon extracteur de commentaires

Il y a des fois où on ne comprend vraiment pas ce qu’il se passe dans l’exécution d’un programme. Dans ma boucle principale, j’ai rajouté une section qui regarde s’il y a un problème avec le navigateur :

while 1:
    next_url = PageScraper(current_url)
    current_url = next_url
    if not current_url:
        driver.close()
        driver = webdriver.Firefox()
        current_url = [‘https://www.youtube.com/watch?v=…’]
        print « Le crawler est reparti! »

Or, ce qu’il s’est passé, c’est que cette partie du code s’est exécutée avant qu’il y ait une exception dans ma fonction PageScraper (autrement dit, alors que tout devait encore fonctionner). Qu’est-ce qui a bien pu se produire pour que curent_url soit nul? C’est vraiment complètement mystérieux.

Pour l’instant, je pense que je vais abandonner cette magie noire et simplement faire un bash script pour redémarrer l’ordi ainsi que mon programme automatiquement à un certain intervalle donné de temps, afin de permettre à la mémoire vive de se reposer un peu.

Pour rajouter de la robustesse, il faudrait aussi que j’essaie de faire en sorte que mon programme puisse détecter la version de YouTube (ancienne ou nouvelle) et qu’au lieu d’essayer de faire quoi que ce soit lorsque le navigateur bogue, qu’il redémarre tout au complet, en itérant le fichier de sortie.

J’ai rajouté un serveur VNC aussi (en suivant les instruction ici), pour pouvoir voir ce qui se passe à distance sans avoir à brancher un écran! Ça peut toujours être pratique, et probablement que je vais en avoir besoin de toute manière pour pouvoir faire marcher firefox sans écran physique connecté à l’ordi.

Ajout de robustesse pour mon extracteur de commentaires sur YouTube

Je vais bientôt faire une publication complète de ce projet dans une page à part, lorsque je serai prêt à le présenter au monde. En attendant, je vais simplement parler de l’ajout que j’ai effectué aujourd’hui. L’erreur que j’ai réglée était un problème de chargement de la page lorsque Firefox ne reconnaît pas le format vidéo. Il s’agit d’un problème avec HTML5 qui se produit avec quelques rares vidéos, mais statistiquement mon bot finit toujours par tomber dessus. YouTube affiche alors simplement une page blanche avec une boîte vidéo qui griche, impossible d’avoir accès aux autres suggestions de vidéos ou aux commentaires. Mon programme, qui fonctionne en extrayant les url des vidéos suggérées pour naviguer sur YouTube indéfiniment, cesse donc de fonctionner. Pour corriger cela, j’ai rajouté l’exception suivante :

last_urls = urls[1:len(urls)]
try:
    elements = driver.find_elements_by_css_selector(« a.yt-simple-endpoint.style-scope.ytd-compact-video-renderer »)
    urls = []
    for element in elements:
        urls.append(element.get_attribute(« href »))
except:
    urls = last_urls

Ainsi, à chaque vidéo, mon programme n’extrait non plus simplement la première vidéo suggérée mais toutes les vidéos suggérées (si c’est possible). La prochaine vidéo est donc la première de la liste, à moins qu’il y ait un bug avec la page et qu’aucune vidéo recommandée n’est visible. Le programme essaie alors la deuxième vidéo de la liste précédente, en espérant qu’elle ne provoque pas elle aussi une erreur de lecture. Puisqu’il n’y a environ une dizaine d’options dans la liste, c’est statistiquement improbable qu’aucune de ces vidéos ne fonctionne. Cela rajoute donc une bonne robustesse à mon programme, qui était parfois déjà capable de survivre plus de 24 heures sans s’arrêter. Voyons voir maintenant quel record il pourra faire!

Éventuellement j’aimerais utiliser phantomJS, ça marchait l’année passée, mais maintenant YouTube bloque ce genre de navigateur, il faut que je trouve une manière détournée de l’utiliser. Pour l’instant, je privilégie la robustesse à la rapidité. Il va falloir que je pense au remplissage des mémoires tampon et vives à long terme, puisque justement, après 24 heures d’utilisation continue, l’ordi commence à rusher un peu. Peut-être au moyen de redémarrage planifiés cela pourrait bien marcher. Je n’en suis pas encore là.