3
votes

Selenium ne peut pas gratter le site de commerce électronique Shopee en utilisant python

Je ne parviens pas à obtenir le prix des produits sur Shopee (un site de commerce électronique).
J'ai jeté un coup d'œil au problème résolu par @dmitrybelyakov (lien: Scraping AJAX e -site de commerce utilisant python ).

Cette solution m'a aidé à obtenir le 'nom' du produit et le 'historique_soldé' mais je ne peux pas obtenir le prix du produit. Je ne trouve pas la valeur du prix dans la chaîne Json. Par conséquent, j'ai essayé d'utiliser le sélénium pour extraire des données avec xpath mais cela a semblé échouer.

Le lien du site ecommercial: https://shopee.com.my/search?keyword=h370m

Mon code:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="main"]/div/div[2]/div[2]/div/div/div/div[2]/div/div/div[2]/div[1]/div/a/div/div[2]/div[1]"}


0 commentaires

3 Réponses :


0
votes

Lors de la visite du site Web. Je tombe sur ce popup https://gyazo.com/0a9cd82e2c9879a1c834a82cb15020bd . Je suppose que pourquoi le sélénium ne peut pas détecter le xpath que vous recherchez, c'est parce que ce popup bloque l'élément.

juste après le démarrage de la session sélénium, essayez ceci:

popup=browserdriver.find_element_by_xpath('//*[@id="modal"]/div[1]/div[1]/div/div[3]/button[1]')
popup.click()


1 commentaires

Merci pour votre réponse! Malheureusement, cela ne fonctionne toujours pas!



3
votes

Vous pouvez utiliser les requêtes et l'API de recherche pour le site

for item in r['items']:
    print(item['name'], ' ', 'RM' + str(item['price']/100000))

Si vous voulez à peu près la même échelle:

import requests

headers = {
    'User-Agent': 'Mozilla/5',
    'Referer': 'https://shopee.com.my/search?keyword=h370m'
}

url = 'https://shopee.com.my/api/v2/search_items/?by=relevancy&keyword=h370m&limit=50&newest=0&order=desc&page_type=search'  
r = requests.get(url, headers = headers).json()

for item in r['items']:
    print(item['name'], ' ', item['price'])

p>


5 commentaires

Merci pour votre soutien! C'est très utile pour moi.


Votre code me donne exactement ce que je veux. Cependant, lorsque j'utilise votre code sans la ligne "'Referer': ' shopee.com.my/ search? keyword = h370m '", il serait impossible de donner la valeur du prix. Pourriez-vous m'expliquer davantage pour comprendre la différence entre avoir et ne pas avoir de Referer dans ce cas?


Le serveur s'attend à ce que certains en-têtes soient envoyés par le client. Dans ce cas, il attend l'en-tête Referer (la page qui aurait fait la demande pour cette information). L'API est plus rapide et plus fiable que l'utilisation d'un navigateur et devrait être votre premier choix lorsqu'elle est disponible.


J'ai appliqué votre guide pour essayer d'obtenir le nom et le prix de tous les produits d'un magasin spécifique. 'import requests i = 1 while i <20: headers = {' User-Agent ':' Mozilla / 5 ',' Referer ':' shopee.vn/shop/42575106/… '} url =' shopee.com.my/api/v2/search_items/… * i) + '& order = desc & page_ty‌ pe = shop' r = requests.get (url, headers = headers) .json () for item in r ['items']: print (item ['name'], '', article ['prix']) i = i + 1 '


Cela a juste fonctionné pour la première fois, mais les tentatives suivantes n'ont pas réussi à me donner le prix, donnez simplement le nom. Le résultat de ces tentatives est le suivant: Cooler Master Hyper 212 Turbo Black CPU Cooler (RR-212TK-16P None HAUTE QUALITÉ 3 PIN UK TO IEC C5 NOTEBOOK POWER CABLE WITH FUSE Aucun. Pourriez-vous m'expliquer pourquoi cela fonctionne juste pour la première fois quand j'applique la boucle dans votre solution pour analyser tous les produits d'un tel magasin?



1
votes

Pour extraire le prix des produits sur Shopee en utilisant Selenium et Python vous pouvez utiliser la solution suivante :

  • Bloc de code:

    ['430.00', '385.00', '435.00', '409.00', '479.00', '439.00', '479.00', '439.00', '439.00', '403.20', '369.00', '420.00', '479.00', '465.00', '465.00']
    Program Ended
    
  • Sortie de la console:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    options.add_argument('start-maximized')
    options.add_argument('disable-infobars')
    options.add_argument('--disable-extensions')
    browserdriver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    browserdriver.get('https://shopee.com.my/search?keyword=h370m')
    WebDriverWait(browserdriver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='shopee-modal__container']//button[text()='English']"))).click()
    print([my_element.text for my_element in WebDriverWait(browserdriver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//span[text()='RM']//following::span[1]")))])
    print("Program Ended")
    


8 commentaires

hier, votre code fonctionne correctement, mais aujourd'hui, je teste à nouveau et la sortie sort comme ceci: ' à 0x000002660D40D840> programme terminé'. S'il vous plaît, aidez-moi à le corriger! Merci.


@Huynh Cette solution devrait fonctionner parfaitement. Veuillez essayer de lancer l ' exécution du test dans un environnement de test propre avec WebDriver approprié et correspondant, c'est-à-dire ChromeDriver et Client Web c'est-à-dire versions de Google Chrome . Pour info, nous avons publié Chrome v74.x , donc vérifiez si Chrome a été mis à jour.


(Informations de session: chrome sans tête = 74.0.3729.108) (Informations sur le pilote: chromedriver = 74.0.3729.6) C'est ma version actuelle de Chromedriver et de Google Chrome. Malheureusement, cela ne fonctionne pas comme prévu. Il y a quelques jours à peine, cela fonctionnait bien mais pas maintenant. Je ne sais pas ce qui se passe!


@Huynh Nous avons poussé chrome = 74.0 hier et avons commencé à utiliser chromedriver = 74.0 à partir d'aujourd'hui. Trop tôt pour commenter. Je suis sûr que chrome = 73.0 et chromedriver = 73.0 fonctionneraient parfaitement.


Merci pour votre réponse rapide! Enfin, je trouve que votre code d'origine fonctionne bien mais la dernière version de votre code (éditée par Corey Goldberg) ne l'est pas. Désolé pour cet inconvénient!


@Huynh Annulé les modifications afin que la réponse réponde à votre question et serait utile aux futurs lecteurs.


Puis-je obtenir le nom du produit avec votre solution? J'ai essayé d'utiliser By.XPATH, ".//*[@class='_1JAmkB ']" ou By.XPATH, ".//*[@class='_1JAmkB '] / child :: div " mais la sortie était juste [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ' , '', '', '', '', ''] Programme terminé Pourriez-vous m'aider ici ou je dois ouvrir une autre question? Merci!


@Huynh Veuillez soulever une nouvelle question avec votre nouvelle exigence. Les contributeurs de Stackoverflow se feront un plaisir de vous aider.