diff --git a/content/course/manipulation/04a_webscraping_TP/index.qmd b/content/course/manipulation/04a_webscraping_TP/index.qmd index c982e9eaa..ade9d9d97 100644 --- a/content/course/manipulation/04a_webscraping_TP/index.qmd +++ b/content/course/manipulation/04a_webscraping_TP/index.qmd @@ -1086,7 +1086,7 @@ Si vous êtes sur le SSP-Cloud, vous pouvez exécuter les commandes suivantes: ```{python} -#| eval: false +#| output: false !wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -O /tmp/chrome.deb !sudo apt-get update !sudo -E apt-get install -y /tmp/chrome.deb @@ -1104,7 +1104,7 @@ exemple, depuis une cellule de `Notebook`: ```{python} -#| eval: false +#| output: false !pip install selenium ``` @@ -1115,7 +1115,7 @@ cellule de `Notebook`: ```{python} -#| eval: false +#| output: false import sys sys.path.insert(0,'/usr/lib/chromium-browser/chromedriver') import selenium @@ -1124,10 +1124,11 @@ path_to_web_driver = "chromedriver" En premier lieu, il convient d'initialiser le comportement de `Selenium` en répliquant les paramètres -du navigateur: +du navigateur. Pour cela, on va d'abord initialiser +notre navigateur avec quelques options: ```{python} -#| eval: false +#| output: false import time from selenium import webdriver @@ -1137,23 +1138,30 @@ chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') #chrome_options.add_argument('--verbose') -#chrome_options.add_argument('--disable-dev-shm-usage') +``` + +```{python} +#| include: false +# specific pour usage dans docker container +chrome_options.add_argument('--disable-dev-shm-usage') +``` + +Puis on lance le navigateur: +```{python} browser = webdriver.Chrome(executable_path=path_to_web_driver, options=chrome_options) ``` On va sur le site de `Bing Actualités`, et on lui indique le mot clé que nous souhaitons chercher. +En l'occurrence, on s'intéresse aux actualités de Donald Trump. +Après avoir inspecté la page depuis les outils de développement du navigateur, +on voit que la barre de recherche est un élement du code appelé `q` (comme _query_). +On va ainsi demander à `selenium` de chercher cet élément: ```{python} -#| eval: false browser.get('https://www.bing.com/news') -# on cherche l'endroit où on peut remplir un formulaire -# en utilisant les outils du navigateur > inspecter les éléments de la page -# on voit que la barre de recherche est un élement du code appelé 'q' comme query -# on lui demande de chercher cet élément - search = browser.find_element("name", "q") print(search) print([search.text, search.tag_name, search.id]) @@ -1161,31 +1169,27 @@ print([search.text, search.tag_name, search.id]) # on envoie à cet endroit le mot qu'on aurait tapé dans la barre de recherche search.send_keys("Trump") -search_button = browser.find_element("xpath", "//input[@id='sb_form_go']") - -#search_button = browser.find_element("id", 'search_button_homepage') - +search_button = browser.find_element("xpath", "//input[@id='sb_form_go']") search_button.click() - -# on appuie sur le bouton "Entrée" Return en anglais -#search.send_keys(Keys.RETURN) ``` +`selenium` permet de capturer l'image qu'on verrait dans le navigateur +avec `get_screenshot_as_png`. Cela peut être utile pour vérifier qu'on +a fait la bonne action: + ```{python} -#| eval: false +#| output: false png = browser.get_screenshot_as_png() ``` ```{python} -#| eval: false from IPython.display import Image Image(png, width='500') ``` -On extrait les résultats. +Enfin, on peut extraire les résultats: ```{python} -#| eval: false from selenium.common.exceptions import StaleElementReferenceException links = browser.find_elements("xpath", "//div/a[@class='title'][@href]") @@ -1197,19 +1201,19 @@ for link in links: print("Issue with '{0}' and '{1}'".format(url, link)) print("It might be due to slow javascript which produces the HTML page.") results.append(url) - -len(results) ``` +Enfin, pour mettre fin à notre session, on demande +à `Python` de quitter le navigateur + ```{python} -#| eval: false -# on a une pause de 10 secondes pour aller voir ce qui se passe sur la page internet -# on demande de quitter le navigateur quand tout est fini browser.quit() ``` +On a obtenu les résultats suivants: + + ```{python} -#| eval: false print(results) ``` @@ -1265,7 +1269,7 @@ browser.quit() Pour cet exercice, on propose de scraper la liste des ministres français depuis le [site du gouvernement](https://www.gouvernement.fr/composition-du-gouvernement). L'objectif sera, _in fine_ de faire un graphique qui représente la distribution de leurs âges. La solution pour cet exercice a été proposée -par [@tttienthinh](https://github.com/tttienthinh) +par [Tien-Thinh](https://github.com/tttienthinh) et [Antoine Palazzolo](https://github.com/antoine-palazz). Pour être en mesure de faire cet exercice, il est