web-dev-qa-db-fra.com

Utilisation de python Requêtes avec des pages javascript

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?

29
biw

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.

27
sberry

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)
  • driver.find_element (s) _by_css_selector (css_selector) # Chaque élément qui correspond à ce sélecteur CSS
  • driver.find_element (s) _by_class_name (class_name) # Chaque élément avec la classe suivante
  • driver.find_element (s) _by_id (id) # Chaque élément avec l'ID suivant
  • driver.find_element (s) _by_link_text (link_text) # Chaque avec le texte du lien complet
  • driver.find_element (s) _by_partial_link_text (partial_link_text) # Tout avec un texte de lien partiel.
  • driver.find_element (s) _by_name (name) # Chaque élément où name = argument
  • driver.find_element (s) _by_tag_name (tag_name) # Chaque élément avec l'argument nom de balise

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:

  • elem.tag_name # Pourrait retourner le bouton dans un fichier.
  • elem.get_attribute ("id") # Renvoie l'ID d'un élément.
  • elem.text # Le texte intérieur d'un élément.
  • elem.clear () # Efface une entrée de texte.
  • elem.is_displayed () # True pour les éléments visibles, False pour les éléments invisibles.
  • elem.is_enabled () # True pour une entrée activée, False sinon.
  • elem.is_selected () # Ce bouton radio ou élément de case à cocher est-il sélectionné?
  • elem.location # Un dictionnaire représentant l'emplacement X et Y d'un élément à l'écran.
  • elem.click () # Cliquez sur elem.
  • elem.send_keys ("thelegend27") # Tapez thelegend27 dans elem (utile pour les entrées de texte)
  • elem.submit () # Soumettez le formulaire auquel elem participe.

Commandes spéciales:

  • driver.back () # Cliquez sur le bouton Retour.
  • driver.forward () # Cliquez sur le bouton Suivant.
  • driver.refresh () # Actualise la page.
  • driver.quit () # Fermez le navigateur, y compris tous les onglets.
  • foo = driver.execute_script ("return 'hello';") # Execute javascript (POURRAIT PRENDRE DES VALEURS DE RETOUR!)
16
Lil Taco

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.

11
marvb

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
0
John