3
votes

Des données sont manquantes lors du scraping à l'aide de beautifulsoup4

En fait, je suis un débutant dans l'analyse des trucs avec Python Beautifulsoup4. J'étais en train de gratter ce site Web . J'ai besoin de Prix actuel par mil sur la première page.

J'ai déjà passé 3 heures avec ça. En cherchant la solution sur internet. J'ai appris qu'il existe une bibliothèque PyQT4 qui peut imiter comme un navigateur Web et charger le contenu, puis une fois le chargement terminé, vous pouvez extraire les données requises. Mais je suis tombé en panne.

A utilisé cette approche pour collecter les données au format texte brut. J'ai aussi essayé d'autres approches.

def parseMe(url):
    soup = getContent(url)
    source_code = requests.get(url)
    plaint_text = source_code.text
    soup = BeautifulSoup(plaint_text, 'html.parser')
    osrs_text = soup.find('div', class_='col-md-12 text-center')
    print(osrs_text.encode('utf-8'))

S'il vous plaît regardez cette image . Je pense que le problème vient des balises :: before et :: after. Ils apparaissent une fois la page chargée.
Toute aide sera très appréciée.


0 commentaires

4 Réponses :


1
votes

Vous devriez utiliser sélénium au lieu de `requests:

'Current Price Per Mil: 0.80USD'

Sortie:

from selenium import webdriver
from bs4 import BeautifulSoup

def parse(url):
    driver = webdriver.Chrome('D:\Programming\utilities\chromedriver.exe')
    driver.get('https://boglagold.com/buy-runescape-gold/')
    soup = BeautifulSoup(driver.page_source)
    return soup.find('h4', {'id': 'curr-price-per-mil-text'}).text

parse()

La raison est que la valeur de cet élément est obtenue via JavaScript, que les requêtes ne peuvent pas gérer. Cet extrait de code particulier utilise le pilote Chrome; si vous préférez, vous pouvez utiliser Firefox / un autre équivalent de navigateur (vous devrez installer la bibliothèque sélénium et rechercher vous-même le pilote Chrome).


0 commentaires

0
votes

Le problème est que le javascript ajoute dynamiquement les données que vous souhaitez supprimer sur ce site Web. Vous pouvez essayer d'exécuter JS côté client, attendre la récupération des données que vous souhaitez supprimer, puis récupérer le contenu du DOM - si vous souhaitez le faire de cette façon, veuillez consulter @ gmds répond à cette question. L'autre méthode consiste à vérifier quelles demandes le code javascript fait et laquelle contient les informations dont vous avez besoin. Ensuite, vous pouvez faire cette (ces) demande (s) en utilisant python et obtenir les données requises sans avoir besoin d'utiliser PyQT4 ou même BS4.


0 commentaires

1
votes

La page Web crée un XHR pour récupérer un fichier JSON contenant le prix mais

sellPrice 0.8
buyPrice 0.62

Sorties:

import requests

r = requests.get('https://api.boglagold.com/api/product/?id=osrs-gold&couponCode=null')
j = r.json()
# print(j)
print('sellPrice', j['sellPrice'])
print('buyPrice', j['buyPrice'])


0 commentaires

1
votes

Comme mentionné par les autres réponses, cette page ne contient que le texte Prix actuel par mil: et 0USD . La valeur au milieu - 0.8 - est obtenue dynamiquement avec JS à partir de l'url décrite ci-dessous (qui peut être obtenue en utilisant un processus décrit (par exemple) ici et dans de nombreux autres endroits . Ce site vérifie la présence de bots, vous avez donc pour utiliser une méthode décrite (par exemple) ici .

Donc tout ensemble:

0.8

Résultat:

url = 'https://api.boglagold.com/api/product/?id=osrs-gold&couponCode=null'
import requests
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'})

response.json()['sellPrice']


0 commentaires