CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

R | Web Scrapping

OutHoy
OutHoy
Niveau 6
09 mars 2022 à 06:47:12

Hello,

Je regardais un site un peu bancale pour récupérer des infos sur différentes armes d'un jeu, le site n'étant pas hyper ouf pour la recherche + le tri des critères je me suis dis pourquoi pas essayer de récupérer les infos en scrapant avec R (j'aime pas python).

Je connais le principe mais quand j'essaie un peu de naviguer dans le code html/css du site je vois que les infos que je veux sont toutes dans le /body et tout est foutu en vrac dans un tableau :
https://mhrise.kiranico.com/fr/data/weapons?scope=wp&value=13

https://image.noelshack.com/fichiers/2022/10/3/1646804689-capture-d-ecran-2022-03-09-a-06-44-39.png

L'info que je veux récupérer est le chiffre en bleu.

Le code de la zone me donne ca : https://image.noelshack.com/fichiers/2022/10/3/1646804759-capture-d-ecran-2022-03-09-a-06-44-39.png

Sauf que mon code me récupère tout le tableau avec les infos dans un vecteur et ca m'avance vraiment pas si derrière je dois passer 3 heures a affiner mon résultat.

Des amateurs de web scraping ici pour m'aider ?

Azerban
Azerban
Niveau 16
09 mars 2022 à 09:32:12

Il faut d'abord que tu récupères un tableau qui contient chaque tr de ton body et ensuite pour chaque tr (ligne) de ton body (tableau), tu extrais les données td qui t'intéressent en utilisant des sélecteurs CSS (en l’occurrence le nom de l'arme et les points j'imagine).

Je te mets le code Python si ça peut t'aider :

import requests
from bs4 import BeautifulSoup

url = "https://mhrise.kiranico.com/fr/data/weapons?scope=wp&value=13"
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0'}

response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")

# On récupère chaque nœud `tr` dans une liste.
weapons = soup.select("tbody.bg-white.divide-y.divide-gray-200 > tr.bg-white")

# Pour chaque noeud (chaque arme) dans la liste, on extrait le nom et les points via des sélecteurs CSS et on les affiche.
for weapon in weapons:
    name = weapon.select_one("td.text-left.px-6.py-4.whitespace-nowrap.text-sm.font-medium.text-gray-900 > div > a.text-blue-600").text.strip()
    points = int(weapon.select_one("td.text-center.px-6.py-4.whitespace-nowrap.text-sm.font-medium.text-gray-900 > div").text.strip())
    print({"name": name, "points": points})

Ce code affiche :

{'name': 'Fusarbalète Kamura', 'points': 50}
{'name': 'Fusarbalète Kamura II', 'points': 60}
{'name': 'Fusarbalète Kamura III', 'points': 90}
{'name': 'Fusarbalète Kamura IV', 'points': 130}
{'name': 'Fusarbalète Kamura V', 'points': 150}
{'name': 'Fusarbal. ninja Kamura', 'points': 170}
{'name': 'Œil occulte', 'points': 100}
{'name': 'Œil occulte II', 'points': 160}
{'name': 'Hibou de la nuit', 'points': 180}
{'name': 'Arbalète lumière', 'points': 160}
{'name': 'Arbalète lumière II', 'points': 170}
{'name': 'Araknabolt', 'points': 180}
{'name': 'Fusarbalète lotus', 'points': 100}
{'name': 'Fusarbalète lotus II', 'points': 170}
{'name': 'Grand fusarb. lotus', 'points': 180}
{'name': 'Seringue Khezu', 'points': 80}
{'name': 'Seringue Khezu II', 'points': 90}
{'name': 'Seringue Khezu III', 'points': 140}
...
OutHoy
OutHoy
Niveau 6
09 mars 2022 à 19:07:24

Merci pour ton retour, j'ai adapté en R et je tombe sur quasi le bon rendu j'ai plus qu'a affiné :)

OutHoy
OutHoy
Niveau 6
09 mars 2022 à 20:08:45

Petite question :

Quand tu récupère les zones a scrapper, tu as une façon de faire ?
Genre dans cet exemple, https://image.noelshack.com/fichiers/2022/10/3/1646852812-capture-d-ecran-2022-03-09-a-20-05-19.png

Tu sélectionnes la zone en bleu ? et qui te donne la zone dans la bulle jaune ?

Car j'ai essayé toutes les fonctions pour copier la zone mais a part prendre a la main le champ (avec le risque d'erreur afférent) je trouve pas d'autres façons de faire.

Azerban
Azerban
Niveau 16
09 mars 2022 à 21:38:15

Le 09 mars 2022 à 20:08:45 :
Petite question :

Quand tu récupère les zones a scrapper, tu as une façon de faire ?
Genre dans cet exemple, https://image.noelshack.com/fichiers/2022/10/3/1646852812-capture-d-ecran-2022-03-09-a-20-05-19.png

Tu sélectionnes la zone en bleu ? et qui te donne la zone dans la bulle jaune ?

Car j'ai essayé toutes les fonctions pour copier la zone mais a part prendre a la main le champ (avec le risque d'erreur afférent) je trouve pas d'autres façons de faire.

Il faut utiliser un sélecteur CSS, là tu peux sélection le nœud comme ça :

td.text-center.px-6.py-4.whitespace-nowrap.text-sm.font-medium.text-gray-900 > div

C'est un peu illisible et en plus dans ton cas on a plusieurs noeuds avec ce sélecteur CSS pour les classes.

Du coup tu peux sélectionner par exemple les td qui sont le deuxième child du parent (pour le nom) et le quatrième child du parent (pour les points). Dans le présent cas le parent de td est tr :

import requests
from bs4 import BeautifulSoup

url = "https://mhrise.kiranico.com/fr/data/weapons?scope=wp&value=13"
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0'}

response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")

# On récupère chaque nœud `tr` dans une liste.
weapons = soup.select("tbody.bg-white.divide-y.divide-gray-200 > tr.bg-white")

# Pour chaque noeud (chaque arme) dans la liste, on extrait le nom et les points via des sélecteurs CSS et on les affiche.
for weapon in weapons:
    name = weapon.select_one("td:nth-child(2) > div > a").text.strip()
    points = weapon.select_one("td:nth-child(4) > div").text.strip()
    print({"name": name, "points": points})
OutHoy
OutHoy
Niveau 6
11 mars 2022 à 11:36:39

Du coup j’ai pris le temps de bien décortiquer tout le site avec la structure du bail la.
J’ai pas touché au html / css depuis quasi 10 ans, et je voulais impérativement le faire en R pour progresser avec (et donc pas avec python)

J’ai repris ton code en guise de correction pour l’adapter en R et comprendre ce que tu avais fait.

Tout fonctionne comme je veux (si seulement ils avaient déclarés un id au tableau, c’était fait en 3 lignes de code 😪)

Ça sert à rien mais ça fonctionne. Merci 👍

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment