Je suis un tutoriel en ligne ( https://www.analyticsvidhya.com/blog/2015/10/beginner-guide-web-scraping-beautiful-soup-python/ ) pour le web scraping d'une table html. Lorsque j'ai suivi le didacticiel, j'ai pu extraire les données de la table, mais j'ai essayé de récupérer les données à partir de celui-ci ( https://www.masslottery.com/games/lottery/search/results-history.html?game_id= 15 & mode = 2 & selected_date = 2019-03-04 & x = 12 & y = 11 ) site Web Je n'ai pas pu le faire.
J'ai déjà essayé d'utiliser scrapy mais j'ai obtenu les mêmes résultats.
Voici le code que j'ai utilisé.
<table cellspacing="0" class="zebra-body-only" <tbody id="target-area"> <tr class="odd"> <th>Draw #</th> <th>Draw Date</th> <th>Winning Number</th> <th>Bonus</th> </tr> <tr><td>2107238</td> <td>03/04/2019</td> <td>01-04-05-16-23-24-27-32-34-41-42-44-47-49-52-55-63-65-67-78</td><td>No Bonus</td> </tr> <tr class="odd"> <td>2107239</td> <td>03/04/2019</td> <td>04-05-11-15-19-20-23-24-25-28-41-45-52-63-64-68-71-72-73-76</td><td>4x</td> </tr> ....(And so on)
C'est ce que j'obtiens quand j'exécute ce code sur le terminal
<table cellspacing="0" class="zebra-body-only"> <tbody id="target-area"> </tbody> </table>
Bien que quand J'inspecte le site Web de la loterie de masse en utilisant google chrome c'est ce que je vois
import urllib.request wiki = "https://www.masslottery.com/games/lottery/search/results-history.html?game_id=15&mode=2&selected_date=2019-03-04&x=12&y=11" page = urllib.request.urlopen(wiki) from bs4 import BeautifulSoup soup = BeautifulSoup(page, "lxml") all_tables=soup.find_all('table') right_table=soup.find('table', class_='zebra-body-only') print(right_table)
Je veux pouvoir extraire les données de ce tableau.
3 Réponses :
Cela se produit parce que le site Web effectue un autre appel pour charger les résultats. Le lien initial ne charge que la page mais pas les résultats. En utilisant les outils de développement Chrome pour inspecter les demandes, vous serez en mesure de trouver la demande que vous devez répliquer pour obtenir les résultats.
Cela signifie que pour obtenir les résultats, vous pouvez simplement appeler la requête mentionnée ci-dessus et ne pas avoir à appeler la page Web du tout.
Heureusement, le point de terminaison que vous devez appeler est déjà dans un bon format JSON.
GET https://www.masslottery.com/data/json/search/dailygames/history/15/201903.json?_=1555083561238
Où je suppose que 1555083561238
est l'horodatage.
Et comment appeler ce point de terminaison? Désolé, je suis vraiment nouveau dans ce domaine.
puisqu'il s'agit d'une requête GET, remplacez simplement votre variable "wiki" par cette URL à la place. Vous voudrez peut-être consulter le package de requêtes python car il est plus détaillé pour appeler diverses URL avec différentes méthodes (GET, PUT, POST, etc.)
La page est dynamique, elle est donc rendue après que vous ayez fait la demande. Vous pouvez soit a) utiliser la solution par JC1 et accéder à la réponse json. Ou vous pouvez utiliser Seleneium pour simuler l'ouverture du navigateur, le rendu de la page, puis la saisie de la table:
import pandas as pd from selenium import webdriver url = 'https://www.masslottery.com/games/lottery/search/results-history.html?game_id=15&mode=2&selected_date=2019-03-04&x=12&y=11' driver = webdriver.Chrome() driver.get(url) page = driver.page_source # will return a list of dataframes tables = pd.read_html(page) # chose the dataframe you want from the list by it's position df = tables[0]
Aussi en remarque: généralement si je vois
code > balises, je vais laisser Pandas faire le travail à ma place (notez que je suis bloqué pour accéder au site, je ne peux donc pas les tester):
from bs4 import BeautifulSoup
from selenium import webdriver
url = 'https://www.masslottery.com/games/lottery/search/results-history.html?game_id=15&mode=2&selected_date=2019-03-04&x=12&y=11'
driver = webdriver.Chrome()
driver.get(url)
page = driver.page_source
soup = BeautifulSoup(page, "lxml")
all_tables=soup.find_all('table')
right_table=soup.find('table', class_='zebra-body-only')
oui, je sauvegarderais les données que vous obtenez dans un fichier pour voir si ce que vous recherchez est vraiment là. avec open ('stuff.html', 'w') comme f: f.write (response.text)
unicode, essayez: importer des codecs codecs.open (fp, 'w', 'utf-8') comme f:
si vous ne voyez pas ce que vous cherchez là-bas, vous devrez trouver la bonne URL à charger, vérifiez les options du développeur Chrome c'est généralement difficile
La solution la plus simple consiste à utiliser du sélénium assurez-vous d'attendre que ce que vous recherchez apparaisse sur la page (c'est dynamique)