2017-04-09 8 views
0

Ich arbeite an einem Skript, das automatisch Preise für Spiele auf verschiedenen Websites vergleicht (Instantgaming, G2A, etc.). Das folgende Skript funktioniert für einige Websites, für andere jedoch nicht. Code sieht wie folgt aus:WebScraping - BS4 findet nur Tags

import bs4 
import requests 
res1 = requests.get('https://www.g2a.com/?search=dead%20by%20daylight') 
res1.raise_for_status() 
soup = bs4.BeautifulSoup(res1.text,'html.parser') 
elems = soup.find('div', {'id': 'content-landing'}) 
children = elems.find('div', {'class': 'mp-product-info'}) 
price = children.find('strong', {'class': 'mp-pi-price-min'}) 
price.text.strip() 

Das Problem ist, dass die Preisvariable den richtigen Tag

<strong class="mp-pi-price-min"></strong> 

enthält aber nicht den Preis nicht speichert (Nach dem Browser, es ist wie dieses :) aussehen sollte

<strong class="mp-pi-price-min">10,16€</strong> 

Wenn Sie denselben Code stattdessen mit einem CSS-Selector verwenden, wird das gleiche Ergebnis zurückgegeben.

Antwort

0

Wenn Sie Ihre Chrome-Entwicklertools oder Firebug öffnen, sehen Sie, dass beim Aufruf dieser Seite über XHR ein Service aufgerufen wird, der die Spiele und Preise zurückgibt.

Sie müssen stripe, was Sie nicht wollen, parsen Sie es als Json und erhalten Sie die Ergebnisse.

Hier ist ein Beispiel für diesen Anruf:

from bs4 import BeautifulSoup 
import requests 
import re 
import json 

response = requests.get('https://www.g2a.com/lucene/search/filter?jsoncallback=jQuery111002521088376353553_1491736907010&skip=28837%2C28838%2C28847%2C28849%2C28852%2C28856%2C28857%2C28858%2C28859%2C28860%2C28861%2C28862%2C28863%2C28867%2C28868%2C28869%2C29472%2C29473%2C29474%2C29475%2C29476%2C29482%2C29486%2C33104&minPrice=0.00&maxPrice=640.00&cn=&kr=&stock=all&event=&platform=0&search=dead+by+daylight&genre=0&cat=0&sortOrder=popularity+desc&start=0&rows=12&steam_app_id=&steam_category=&steam_prod_type=&includeOutOfStock=false&includeFreeGames=false&_=1491736907012') 
json_object = json.loads('{"data":%s}}' % (response.content.decode("utf-8").replace("jQuery111002521088376353553_1491736907010(", "")[:-2].replace("\'", ""))) 
for game in json_object["data"]["docs"]: 
    print ("Name: %s (Price: %s)" % (game["name"], game["minPrice"])) 

Es wird Druck:

Name: Dead by Daylight STEAM CD-KEY GLOBAL (Preis: 10,16)

Name: Dead von Tageslicht STEAM CD-KEY LATAM (Preis: 5)

Name: Dead von Tageslicht - Von Fleisch und Schlamm DLC STEAM CD-KEY GLOBAL (Preis: 4.99)

Name: Dead by Daylight Deluxe Edition STEAM CD-KEY GLOBAL (Preis: 13,99)

Name: Dead by Daylight STEAM CD-KEY RU/CIS (Preis: 4,95)

Name: Dead by Daylight - Die 80er Jahre Koffer DLC STEAM CD-KEY GLOBAL (Preis: 2,99)

Name: Dead by Daylight STEAM CD-KEY SEA (Preis: 6)

Beachten Sie auch, dass Sie ändern müssen werden &search=... Teil für das Spiel, das Sie suchen (urlencoded) und _= Teil für den aktuellen Unix-Zeitstempel.

+0

Funktioniert gut, danke! – Terrakx