IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

Possibilité de scrapping ? [Python 3.X]


Sujet :

Réseau/Web Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Master Data Manager
    Inscrit en
    Février 2017
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Master Data Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 113
    Par défaut Possibilité de scrapping ?
    Bonjour à tous.

    Contexte :

    J'ai régulièrement besoin de trouver des "nouveau" outils coupants puis les codifiées dans un ERP. Cela prend pas mal de temps, comme c'est fais à la main il y a risque d'erreur et je ne parle pas de la dégradation de ma santé mentale au cours de ce genre d'activité

    Voici plus en détail la procédure faite a la mano:

    - Je cherche par exemple "DSKM 2.5" sur le site https://www.toolsunited.com/App/EN/T...e,[],null]
    - Sur les premières lignes de résultat, je clique sur détail afin de trouver l'outil qui a les caractéristiques que je cherche.
    Nom : 2023-01-29 15_02_39-Window.png
Affichages : 306
Taille : 21,7 Ko

    - Une fois trouvé je collecte les caractéristiques.
    Nom : 2023-01-29 15_03_23-Window.png
Affichages : 311
Taille : 76,5 Ko


    L'idée est de faire un script qui va faire la recherche, collecter les premières lignes de résultat avec les détails des caractéristiques de chaque outil puis, dans un deuxième temps je sélectionnerai l'outil adéquat et cela me produira un fichier que je pourrai injecter dans l'erp sans risque d'erreur de recopie.

    Après quelques recherches et il semble que Python + Selenium soit adapté ce que je cherche à faire.

    J'ai donc fait des essais, mais je n'arrive pas à grand-chose.

    Je n'arrive pas à cliquer sur l'icône détail Nom : 2023-01-29 15_05_57-Window.png
Affichages : 449
Taille : 276 octets d'une ligne pour ouvrir la fenêtre "pop-up" avec les détails de l'outil... Bref, je galère pas mal du coup si quelqu'un pouvait me montrer comment collecter les détails sur une des lignes, cela m'aiderait pas mal à avancer.

    EDIT: Désolé, une seule des images s'affiche alors que j'en ai mis trois pour illustrer mon propos. Je ne vois pas pourquoi…
    Nom : TOOLSUNITED_800.gif
Affichages : 294
Taille : 1,91 Mo

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par Puppet_Master Voir le message
    Je n'arrive pas à cliquer sur l'icône détail Nom : 2023-01-29 15_05_57-Window.png
Affichages : 449
Taille : 276 octets d'une ligne pour ouvrir la fenêtre "pop-up" avec les détails de l'outil... Bref, je galère pas mal du coup si quelqu'un pouvait me montrer comment collecter les détails sur une des lignes, cela m'aiderait pas mal à avancer.
    Ben commençons par le clique...

    Voici un exemple de code qui récupère tous les boutons puis demande sur lequel tu veux cliquer...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    import time
    from selenium import webdriver
     
    # driver = webdriver.Chrome()
    driver = webdriver.Firefox()
    driver.get("https://www.toolsunited.com/App/EN/TuMenu/ShowResult?search=[[%22Volltext%C2%A7dskm%202.5%22],%22Root%22,0,100,%22default%22,true,[],null]")
     
    time.sleep(5)
     
    details_btn =  driver.find_elements_by_class_name("borderlessBtnDiv")
     
    print(f"Il y a {len(details_btn)} boutons 'détails'...")
    num = int(input(f"Sur quel bouton veux-tu cliquer ? (Choisis un nombre entre 1 et {len(details_btn)}): "))
    details_btn[num-1].click()
    Dans cet exemple il y a 100 boutons mais apparemment on ne peut cliquer que sur ceux qui sont visibles...

    Pour les autres il faut faire défiler la scrollbar...

    Mais là tu as un exemple pour commencer...

  3. #3
    Membre éprouvé
    Homme Profil pro
    Master Data Manager
    Inscrit en
    Février 2017
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Master Data Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 113
    Par défaut
    Merci pour votre réponse @Beginner.

    J'ai un peu avancé…

    Quand j'essaie d'utiliser la méthode "find_elements_by_class_name("borderlessBtnDiv")", python me signale que la méthode n'existe pas sur l'objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        td_list = driver.find_elements_by_class_name("borderlessBtnDiv")
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    AttributeError: 'WebDriver' object has no attribute 'find_elements_by_class_name'
    Par contre, avec la méthode "find_elements(By.CSS_SELECTOR, "#gridForResultList tr td .borderlessBtnDiv")" cela fonctionne.

    Voici les bouts de code qui fonctionne. Ce n'est pas propre mais ce n'est que du test pour voir la faisabilité…


    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    from selenium import webdriver
    #from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.common.by import By
    #from selenium.webdriver.support.wait import WebDriverWait  
    import time
     
     
    driver = webdriver.Firefox()
    driver.implicitly_wait(30)
    driver.maximize_window()
     
     
    driver.get("https://www.toolsunited.com/App/EN/TuMenu/ShowResult?search=[[],%22Root%22,0,100,%22default%22,true,[],null]")
     
    # collecte la liste des boutons details
    #td_list = WebDriverWait(driver, 4).until(lambda driver: driver.find_elements(By.CSS_SELECTOR, "#gridForResultList tr td .borderlessBtnDiv"))
    #td_list = driver.find_elements_by_class_name("borderlessBtnDiv")
    td_list = driver.find_elements(By.CSS_SELECTOR, "#gridForResultList tr td .borderlessBtnDiv")
     
    #print(td_list)
     
    count = 0
    for td in td_list:
        count += 1
        td.click()
     
        # collecte les lignes
        lst_data = driver.find_elements(By.CSS_SELECTOR, "div .k-grid.k-widget.k-grid-display-block table tbody tr")
     
        # lecture des lignes
        with open("t"+str(count)+".csv", 'w') as f:
            for row in lst_data:
                columns = row.find_elements(By.TAG_NAME, "td")
                l = []
                for c in range(len(columns)):
                    l.append(columns[c].text)
                f.write(';'.join(l) + "\n")
     
     
        time.sleep(2)
        ferme = driver.find_element(By.XPATH, "//html//body//div[5]//div[1]//div//a[2]")
        print("ferme >>> ")
        ferme.click()
     
    driver.quit()


    Ça me récupère des choses non voulues et comme vous le mentionniez, impossible d'ouvrir un item non visible.

    A voir comment on peut scroller un peu à chaque item et mieux cibler le tableau des détails.

    Si vous avez des pistes je suis tout ouïe

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par Puppet_Master Voir le message
    Quand j'essaie d'utiliser la méthode "find_elements_by_class_name("borderlessBtnDiv")", python me signale que la méthode n'existe pas sur l'objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        td_list = driver.find_elements_by_class_name("borderlessBtnDiv")
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    AttributeError: 'WebDriver' object has no attribute 'find_elements_by_class_name'
    Par contre, avec la méthode "find_elements(By.CSS_SELECTOR, "#gridForResultList tr td .borderlessBtnDiv")" cela fonctionne.
    Oui c'est une autre syntaxe, je ne sais pas encore laquelle est nouvelle...

    Voici le code adapté à cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import time
    from selenium import webdriver
    from selenium.webdriver.common.by import By
     
    # driver = webdriver.Chrome()
    driver = webdriver.Firefox()
    driver.get("https://www.toolsunited.com/App/EN/TuMenu/ShowResult?search=[[%22Volltext%C2%A7dskm%202.5%22],%22Root%22,0,100,%22default%22,true,[],null]")
     
    time.sleep(3)
     
    # details_btn =  driver.find_elements_by_class_name("borderlessBtnDiv")
    details_btn = driver.find_elements(By.CLASS_NAME, 'borderlessBtnDiv')
    driver.execute_script("window.scrollTo(0,  document.documentElement.scrollHeight);")
     
    print(f"Il y a {len(details_btn)} boutons 'détails'...")
    num = int(input(f"Sur quel bouton veux-tu cliquer ? (Choisis un nombre entre 1 et {len(details_btn)}): "))
    details_btn[num-1].click()




    Citation Envoyé par Puppet_Master Voir le message
    ...impossible d'ouvrir un item non visible.

    A voir comment on peut scroller un peu à chaque item et mieux cibler le tableau des détails.
    Il suffit de faire défiler la scrollbar jusqu'au bout...

    Le nouveau code ci-dessus le fait mais cela utilise un bout de code en JavaScript...

    Ensuite on a accès à tous les éléments...

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Citation Envoyé par Puppet_Master Voir le message

    Par contre, avec la méthode "find_elements(By.CSS_SELECTOR, "#gridForResultList tr td .borderlessBtnDiv")" cela fonctionne.
    Oui on peut aussi utiliser "css selector"...

    Juste la class .borderlessBtnDiv c'est suffisant...


    Citation Envoyé par Puppet_Master Voir le message

    Ça me récupère des choses non voulues et comme vous le mentionniez,
    C'est quelle partie exactement que tu veux récupérer ?

  6. #6
    Membre éprouvé
    Homme Profil pro
    Master Data Manager
    Inscrit en
    Février 2017
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Master Data Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 113
    Par défaut
    Citation Envoyé par Beginner.
    Juste la class .borderlessBtnDiv c'est suffisant...


    Citation Envoyé par Beginner.
    C'est quelle partie exactement que tu veux récupérer ?

    A minima le tableau "BNN1 DIN4000", et le top serait d'avoir également le "302-01 ISO".

    Les images sur la droite du pop-up qui affiche les détails, sont-elles récupérables à votre avis ?

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Tu récupères trop de choses car les css selector est mal choisi je pense...

    Citation Envoyé par Puppet_Master Voir le message


    A minima le tableau "BNN1 DIN4000", et le top serait d'avoir également le "302-01 ISO".

    Les images sur la droite du pop-up qui affiche les détails, sont-elles récupérables à votre avis ?
    Peux-tu m'indiquer cela avec une image parce que là je ne vois pas...

    En tous cas il y a une table au milieu avec des tas infos... Faut-il prendre toute la table ou juste centaines lignes ?

    Citation Envoyé par Puppet_Master Voir le message
    Les images sur la droite du pop-up qui affiche les détails, sont-elles récupérables à votre avis ?
    lesquelles ? Une image pour voir... ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Possibilite de replication partielle ?
    Par Mupps dans le forum Requêtes
    Réponses: 5
    Dernier message: 19/03/2004, 15h54
  2. Recherche d'une possibilite
    Par Invité dans le forum Langage SQL
    Réponses: 8
    Dernier message: 29/01/2004, 23h46
  3. Les possibilité que C++ offre par rapport à Pascal Objet
    Par Riko dans le forum Langages de programmation
    Réponses: 13
    Dernier message: 01/02/2003, 21h38
  4. quels sont les possibilitées???
    Par lolo-d dans le forum OpenGL
    Réponses: 11
    Dernier message: 16/05/2002, 00h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo