J'essaie d'utiliser le framework Requests avec python ( http://docs.python-requests.org/en/latest/ ) mais la page que j'essaie accéder à utilise javascript pour récupérer les informations que je veux.
J'ai essayé de rechercher une solution sur le Web, mais le fait que je recherche avec le mot-clé javascript la plupart des choses que j'obtiens est de savoir comment gratter avec le langage javascript.
Est-il possible d'utiliser le framework de requêtes avec des pages utilisant javascript?
Vous allez devoir faire la même requête (en utilisant la bibliothèque Requests) que le javascript fait. Vous pouvez utiliser n'importe quel nombre d'outils (y compris ceux intégrés à Chrome et Firefox) pour inspecter la demande http qui provient de javascript et simplement faire cette demande vous-même à partir de Python.
Alors que Selenium peut sembler tentant et utile, il a un problème principal qui ne peut pas être résolu: les performances. En calculant tout ce que fait un navigateur, vous aurez besoin de beaucoup plus de puissance. Même PhantomJS ne fait pas concurrence à une simple demande. Je vous recommande de n'utiliser Selenium que lorsque vous devez vraiment cliquer sur les boutons. Si vous n'avez besoin que de javascript, je recommande PyQt (vérifiez https://www.youtube.com/watch?v=FSH77vnOGq pour l'apprendre).
Cependant, si vous souhaitez utiliser Selenium, je recommande Chrome sur PhantomJS. De nombreux utilisateurs ont des problèmes avec PhantomJS lorsqu'un site Web ne fonctionne tout simplement pas dans Phantom. Chrome peut aussi être sans tête (non graphique)!
Tout d'abord, assurez-vous d'avoir installé ChromeDriver, dont Selenium dépend pour utiliser Google Chrome.
Ensuite, assurez-vous d'avoir Google Chrome de la version 60 ou supérieure en le vérifiant dans l'URL chrome: // settings/help
Maintenant, tout ce que vous devez faire est le code suivant:
from Selenium.webdriver.chrome.options import Options
from Selenium import webdriver
chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=chrome_options)
Si vous ne savez pas comment utiliser Selenium, voici un bref aperçu:
driver.get("https://www.google.com") #Browser goes to google.com
Recherche d'éléments: utilisez la méthode ELEMENTS ou ELEMENT. Exemples:
driver.find_element_by_css_selector("div.logo-subtext") #Find your country in Google. (singular)
D'accord! J'ai trouvé un élément (ou une liste d'éléments). Mais que dois-je faire maintenant?
Voici les méthodes que vous pouvez faire sur un élément elem:
Commandes spéciales:
Bonne nouvelle: il existe désormais un module de requêtes qui prend en charge javascript: https://pypi.org/project/requests-html/
from requests_html import HTMLSession
session = HTMLSession()
r = session('http://www.yourjspage.com')
r.html.render() # this call executes the js in the page
En prime, cela enveloppe BeautifulSoup
, je pense, donc vous pouvez faire des choses comme
r.find('#myElementID').text
qui renvoie le contenu de l'élément HTML comme prévu.
Je n'ai pas assez de réputation pour commenter mais j'aimerais partager mon expérience en utilisant le package "requests_html".
Il télécharge en fait tout sur cette page Web vers le local pour tout exécuter. Pour moi, c'est extrêmement risqué. Voici la sortie:
r.html.render() # this call executes the js in the page
[W:pyppeteer.chromium_downloader] start chromium download.
Download may take a few minutes.
100%|██████████| 84299992/84299992 [00:18<00:00, 4644126.66it/s]
[W:pyppeteer.chromium_downloader]
chromium download done.
[W:pyppeteer.chromium_downloader] chromium extracted to: .../Library/Application Support/pyppeteer/local-chromium/575458