2
votes

Existe-t-il un moyen d'obtenir des informations sur les éléments à partir du menu d'inspection d'un site Web?

J'ai essayé d'obtenir la population mondiale à partir de ce site Web: https: //www.worldometer .info / population-mondiale / mais je ne peux obtenir que le code html, pas les données des nombres réels.

J'ai déjà essayé de trouver des enfants de l'objet dont j'ai essayé d'obtenir des données. J'ai aussi essayé de lister tout l'objet, mais rien ne semblait fonctionner.

'' 'juste importer des trucs' ''

(span class="rts-counter" rel="current_population">(span class="rts-nr-sign"></span>(span class="rts-nr-int rts-nr-10e9">7</span>(span class="rts-nr-thsep">,</span>(span class="rts-nr-int rts-nr-10e6">703</span>(span class="rts-nr-thsep">,</span>(span class="rts-nr-int rts-nr-10e3">227</span><span class="rts-nr-thsep">,</span>(span class="rts-nr-int rts-nr-10e0">630</span></span>

'' 'obtenir du HTML du site Web au texte' ''

(span class="rts-counter" rel="current_population">retrieving data... </span>

'' 'ici, il ne trouve qu'un seul objet qui est répertorié ci-dessous '' '

current_population = soup.find('div',{'class':'maincounter-number'}).find_all('span', recursive=False)

print(current_population)

Voici l'objet dans lequel les informations sont stockées:

r = requests.get('https://www.worldometers.info/world-population/')

soup = BeautifulSoup(r.text,'html.parser')

et en 'inspect-mode' vous pouvez voir ceci:

import urllib.request

import requests

from bs4 import BeautifulSoup

Je n'obtiens toujours que le premier, mais je veux obtenir le second depuis 'inspect-mode'.

Voici une image du mode d'inspection.


1 commentaires

L'API sur laquelle ce site Web s'appuie est sous licence. Il y a forcément des API publiques qui ont ces données.


3 Réponses :


1
votes

Le site Web que vous capturez est une application Web JavaScript. Le contenu de l'élément que vous voyez en mode d'inspection est le résultat de l'exécution d'un code JavaScript après le téléchargement de la page qui remplit cet élément. Avant l'exécution de JavaScript, l'élément ne contient que le texte "récupération des données ...", ce que vous voyez dans votre code Python. Ni la bibliothèque de requêtes Python ni BeautifulSoup n'exécutent JavaScript dans le HTML téléchargé - ils ne téléchargent et analysent que le HTML, et c'est pourquoi votre code ne voit que le texte initial.

Vous avez deux options:

  1. Inspectez le code JavaScript ou les appels du site Web et déterminez quelle URL HTTP la page appelle pour récupérer la valeur qu'elle met dans cet élément. Demandez à votre code Python d'extraire cette URL à la place et d'analyser la valeur de la réponse pour cette URL.
  2. Utilisez un moteur de navigateur complet. Cette réponse StackOverflow fournit une solution: Page JavaScript de Web-scraping avec Python

0 commentaires

1
votes

Vous allez avoir besoin d'une méthode permettant l'exécution de javascript telle que le sélénium car ce nombre est configuré via un compteur généré dans ce script: https://www.realtimestatistics.net/rts/RTSp.js

from selenium import webdriver

d = webdriver.Chrome()
d.get('https://www.worldometers.info/world-population/')
print(d.find_element_by_css_selector('[rel="current_population"]').text)

Vous pouvez essayer d'écrire votre propre version de cela script javascript mais je ne le recommanderais pas.

Je n'avais pas besoin d'un condition d'attente explicite pour le script sélénium mais qui pourrait être ajoutée.


2 commentaires

Je vous remercie! Cette méthode n'est pas très rapide, mais je ne pense pas qu'il y ait quelque chose à améliorer, non? En tout cas merci pour votre réponse :)


de rien. Sauf s'il existe une API dédiée qui serait plus rapide.



0
votes

Javascript est rendu sur le DOM, donc Beautiful Soup ne fonctionnera pas comme vous le souhaitez.

Vous devrez créer quelque chose qui laisse s'exécuter javascript (par exemple: navigateur) pour pouvoir créer votre propre navigateur en utilisant QT4 ou le comme. Sentdex avait un bon tutoriel là-dessus:

https: // www. youtube.com/watch?v=FSH77vnOGqU

Sinon, vous pouvez utiliser Selenium:

from selenium import webdriver
import time

drive = webdriver.Firefox()
drive.get('https://www.worldometers.info/world-population/')
time.sleep(5)
html = driver.page_source


0 commentaires