2017-04-21 1 views
0

Ich versuche, diese Spielwebseite (g2a [dot] com) zu kratzen, um eine Liste der besten Preise für die Spiele zu erhalten, die ich suche. Die Preise sind in der Regel in einer Tabelle (siehe Bild).Scraping g2a [dot] com mit BeautifulSoup

g2a printscreen

Mein Code auf den Tisch zu bekommen ist:

for gTitle in gameList: 
    page = urllib.request.urlopen('http://www.g2a.com/%s.html' %gTitle).read() 
    soup = BeautifulSoup(page, 'lxml') 
    table = soup.find('table',class_='mp-user-rating') 

Aber wenn ich die Tabelle drucken, finde ich, dass Python alle Tabellen auf der Website zusammen, ohne dass die Inhalte zusammengeführt hat:

>>> <table class="mp-user-rating jq-wh-offers wh-table"></table> 

Ist das ein Fehler oder mache ich etwas falsch? Ich benutze Python 3.6.1 mit BeautifulSoup4 und urllib. Ich würde diese gerne weiterverwenden, wenn möglich, aber ich bin offen für Veränderungen.

+3

Was Sie brauchen, wird mit Javascript generiert, Sie können es nicht mit BS bekommen. Erwägen Sie die Verwendung von Selen https://selenium-python.readthedocs.io/ –

Antwort

0

Ein Vorschlag von Pedro, ich habe versucht, Selenium und in der Tat hat es die Aufgabe erledigt. Danke Pedro! Für diejenigen, die interessiert sind, mein Code:

# importing packages 
from selenium import webdriver 

# game list 
gameList = ['mass-effect-andromeda-origin-cd-key-preorder-global',\ 
      'total-war-warhammer-steam-cd-key-preorder-global',\ 
      'starcraft-2-heart-of-the-swarm-cd-key-global-1'] 

# scraping 
chromePath = r"C:\Users\userName\Documents\Python\chromedriver.exe" 
for gTitle in gameList: 
    driver = webdriver.Chrome(chromePath) 
    driver.get('http://www.g2a.com/%s.html' %gTitle) 
    table = driver.find_element_by_xpath("""//*[@id="about-game"]/div/div[3]/div[1]/table/tbody""") 
    bestPrice = ''.join(list(table.text.split('\n'))[2][12:][:6]) 
    bestPrice = float(bestPrice.replace(",",".")) 
    print(bestPrice) 
0

Ich schaute in die Website. Es lädt eine Liste von Spielen, wenn Sie auf "LADEN MEHR" und fortan klicken. Wenn Sie in das Netzwerkregister Ihres Browsers schauen, während Sie das Element inspect ansehen und nur die "xhr" -Anfragen filtern, können Sie den API-Endpunkt sehen, den es trifft, um neue Spiele zu laden. Ich habe diesen API-Endpunkt als meine URL verwendet.

import requests,json 
pageNum = 0 # start with 0, (Also using lower than 0 will start it from 0) 
while True : 
    url = "https://www.g2a.com/lucene/search/filter?&minPrice=0.00&maxPrice=10000&cn=&kr=&stock=all&event=&platform=0&search=&genre=0&cat=0&sortOrder=popularity+desc&start={}&rows=12&steam_app_id=&steam_category=&steam_prod_type=&includeOutOfStock=&includeFreeGames=false&_=1492758607443".format(str(pageNum)) 

    games_list = json.loads(requests.get(url).text)['docs'] # `games_list` contains each game as a dictionary from where you can take out the required information. 

    if len(games_list) == 0: 
     break # we break off here when the maximum of start parameter is reached and the games_list is empty. 
    else: 
     pageNum += 12 # we use an increment of 12 because we observed an increment of 12 in the start parameter each time we click on "LOAD MORE"