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

Python Discussion :

Selenium Marmiton Structure [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut Selenium Marmiton Structure
    Bonjour,
    J'avais un programme, il y a longtemps, qui fonctionnait avec request et qui me téléchargeait les ingrédients et la recette lorsqu'une url marmiton était passée en argument.
    Cela ne fonctionne plus car le site change régulièrement de structure.
    J'aurais bien recommencé avec selenium mais je me trouve confronté au même type de pb avec une structure qui varie différemment d'une recette à l'autre au niveau du XPATH.
    Voici ce que j'ai commencé à faire et qui fonctionne pour une recette mais pas pour d'autres :
    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
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    plat = "carbo-soleil"
    url = "https://www.marmiton.org/recettes/recette_pates-a-la-carbonara-et-aux-legumes-du-soleil_58989.aspx"
     
    # plat = "cookies"
    # url = "https://www.marmiton.org/recettes/recette_cookies-maison_86989.aspx"
     
    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium.webdriver.chrome.service import Service
    from webdriver_manager.chrome import ChromeDriverManager
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
     
    driver.get(url)
     
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "didomi-notice-agree-button"))).click()
     
    images = driver.find_elements(by=By.XPATH, value='//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[3]/img')
    # print(images)
     
    import urllib
    src = []
    for img in images:
        src.append(img.get_attribute('src'))
    try:
        for i in range(10):   
            urllib.request.urlretrieve(str(src[i]),"{}-{}.jpg".format(plat,str(i)))
    except:
        pass
     
    divers1 = driver.find_elements(by=By.XPATH, value="/html/body/div[2]/div[3]/main/div/div/div[1]/div[1]/div[4]")
    divers1_splite = divers1[0].text.split("•")
    divers1_splite = [el.replace("\n","") for el in divers1_splite]
    duree_prep, niveau, cout = map(str,divers1_splite)
    # duree_prep, niveau, cout = [el for el in divers_splite]
    print("=====================")
    print(duree_prep, niveau, cout)
    print("=====================")
     
    nb_pers = driver.find_element(by=By.XPATH, value='//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[6]/div[2]/div[1]/div/span[1]')
    print("pour", nb_pers.text, "personnes")
    print("=====================")
     
    ingred = driver.find_elements(by=By.XPATH, value='//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[6]/div[4]/div[2]')
    oignon = """//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[6]/div[4]/div[2]/div[2]/div/span/span/div[2]/span/span[2]"""
    huile = """//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[6]/div[4]/div[2]/div[3]/div/span/span/div[2]/span/span[2]"""
    for el in ingred:
        print(el.text, end = ', ')
    print()
    print("=====================")
     
    ingredients = driver.find_elements(by=By.XPATH, value='//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[6]/div[4]')
    nb_ingred = len(ingredients)
     
    print("nb d'ingredients : ", nb_ingred)
    for el in ingredients:
        print(el.text, end = ' - ')
    print()
    print("=====================")
     
    print("essai try")
    try:
        for i in range(20):
            ingredients = driver.find_elements(by=By.XPATH, value='//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[6]/div[4]/div[2]/div[{}]'.format(str(i)))
            for el in ingredients:
                print(el.text, end = ' * ')
                print()
                print("-------------------------")
    except:
        pass
    print("=====================")
     
    print("recette :")
    print()
     
    tps_tot = driver.find_element(by=By.XPATH, value='//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[8]/div[1]').text
    print(tps_tot)
    liste_tps=[0,0,0]
    try:
        for i in range(1,4):
            tps = driver.find_elements(by=By.XPATH, value='//*[@id="__next"]/div[3]/main/div/div/div[1]/div[1]/div[8]/div[3]/div[{}]'.format(str(i)))
            for el in tps:
                liste_tps[i-1] = el.text.replace("\n","")
    except:
        pass
    print(liste_tps)
    tps_prep,tps_repos,tps_cuiss = [el for el in liste_tps]
    print("=====================")
     
    driver.close()
    Si vous avez des idées, je suis preneur.
    Le but étant de passer ensuite via LaTeX à une version pdf sous forme de fiche.
    Bonne fin de semaine à tous et toutes.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    il y a un module python dispo https://github.com/remaudcorentin-dev/python-marmiton
    Elle utilise plutôt les class pour trouver les infos, les classes doivent moins souvent bouger que les positionnements

  3. #3
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Cool !
    Un grand merci.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/02/2011, 12h13
  2. recuperation de la structure d'une base
    Par pascalT dans le forum 4D
    Réponses: 7
    Dernier message: 07/06/2006, 15h32
  3. [tables systèmes] extraction de la structure d'une base
    Par laffreuxthomas dans le forum Autres SGBD
    Réponses: 6
    Dernier message: 23/03/2006, 13h24
  4. Structure de données de type "RECORD"
    Par chaours dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/09/2002, 17h10
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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