2 votes

Problème d'exploration des magasins de jeux à l'aide de Scrapy - le HTML change s'il y a une réduction et la gestion des nullités.

J'essaie d'utiliser Scrapy pour explorer une série de magasins de jeux et j'ai rencontré le même problème avec chacun d'eux. J'utilise XPath, et le code HTML pour les prix des jeux change selon que le prix est simplement indiqué comme suit £ 20.09 ou £ 20.09 avec une ligne qui le traverse et ensuite £ 14.49 pour montrer la réduction. Je suis heureux d'avoir deux colonnes, was 20.09 (qui contiendrait des valeurs nulles) et une après now 14.49 mais je n'arrive pas à trouver comment avoir une valeur nulle au lieu qu'elle remplace toutes les valeurs suivantes.

C'est mon code pour le site web cdkeys - https://www.cdkeys.com/pc/games?limit=50 qui propose des jeux avec et sans remises.

allowed_urls = ['https://www.cdkeys.com/pc/games?limit=50?']
start_urls = ['https://www.cdkeys.com/pc/games/{pageno}?limit=50'.format(pageno=pageno)
    for pageno in range(1, 10)]

def parse(self, response):
    Games = response.xpath('//*[@id="root-wrapper"]/div/div[1]/div[2]/div[3]/div[2]/div[2]/ul/li/h2/a/text()').extract()
    Prices = response.xpath('//span[starts-with(@id, "product-price-")]/span[1]/span/text()').extract()
    for i, (Game, Price) in enumerate(zip(Games, Prices)):
        yield {'index': i, 'Game': Game, 'Price':Price}

Le problème réside dans le XPath pour les prix, je peux soit obtenir la liste des seuls prix réduits, soit une liste des prix uniquement pour les jeux sans réduction puisque le HTML est très différent pour ces catégories.

Ce qui m'empêche de créer simplement deux listes est que, puisque j'utilise zip y enumerate il itère simplement à travers le premier x de jeux jusqu'à ce qu'il n'y ait plus de prix, au lieu de lier chaque jeu au prix correspondant.

Vous pouvez m'aider à afficher uniquement le prix correct dans la fenêtre de l'application. Prices ou trouver un moyen d'avoir des valeurs vides au lieu de remplacer les valeurs suivantes serait très apprécié. Je suis nouveau dans le monde de Python et de l'exploration du Web et j'essaie juste de me faire une idée de tout cela.

1voto

alecxe Points 50783

Je m'y prendrais différemment : j'itérerais sur les articles du produit un par un, puis je trouverais les noms des jeux, les prix normaux et les prix réduits :

def parse(self, response):
    for game in response.css("ul.products-grid li.item"):
        name = game.css("h2.product-name > a::text").extract_first()
        old_price = game.css(".regular-price .price::text,.old-price .price::text").extract_first()
        discount_price = game.css(".special-price .price::text").extract_first()

        yield {
            "name": name,
            "old_price": old_price,
            "discount_price": discount_price
        }

Pour la première page, vous obtiendrez le résultat suivant :

{'old_price': u'$ 13.59', 'name': u'Stellaris: Utopia PC DLC', 'discount_price': None}
{'old_price': u' $ 9.49 ', 'name': u'Insurgency PC', 'discount_price': u' $ 1.99 '}
...
{'old_price': u' $ 81.59 ', 'name': u'Call of Duty Black Ops II 2 Digital Deluxe Edition PC ', 'discount_price': u' $ 13.59 '}

Notez comment l'ancien prix est rempli avec et sans remises.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X