Outils pour utilisateurs

Outils du site


issue154:python

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
issue154:python [2020/03/04 08:13] d52frissue154:python [2020/03/05 14:46] (Version actuelle) andre_domenech
Ligne 3: Ligne 3:
 My eighth article for Full Circle back in FCM#34 (February 2010) was about creating a very small and generic cookbook database. The fact that it is 10 years to the month since I first wrote about the database program hasn't escaped me.** My eighth article for Full Circle back in FCM#34 (February 2010) was about creating a very small and generic cookbook database. The fact that it is 10 years to the month since I first wrote about the database program hasn't escaped me.**
  
-Comme peuvent le savoir beaucoup d'entre vous qui lisez cet article depuis longtemps, la cuisine est une de mes occupations. Comme je suis le seul de la maison à cuisiner chaque soir, je peux dire que c'est mon occupation préférée.+Comme peuvent le savoir beaucoup d'entre vous qui lisez cette rubrique depuis longtemps, la cuisine est l'un de mes violons d'Ingres. Comme je suis le seul de la maison à cuisiner chaque soir, je peux dire que c'est mon occupation préférée.
  
-Mon huitième article, dans le numéro 34 du FCM (février 2010) parlait de la création d'une toute petite base de données générique de cuisine. Le fait que ça fait 10 ans ce mois-ci depuis que j'ai commencé à écrire cette base de données ne m'a pas échappé.+Mon huitième article, dans le numéro 34 du FCM (février 2010) parlait de la création d'une toute petite base de données générique de cuisine. Le fait quece mois-ci, ça fait 10 ans que j'ai commencé à parler de cette base de donnéesne m'a pas échappé.
  
 **Anyway, I've started re-writing the program, pretty much from scratch, and again using Page as the GUI designer. I wanted to give it a newer, sleeker look, with a nicer interface, and there have been many things that i've wanted to add for years, but just never got around to doing. Things like adding a way to have a picture of the finished product, a way to grab a recipe from one of the many recipe websites I search, and more. **Anyway, I've started re-writing the program, pretty much from scratch, and again using Page as the GUI designer. I wanted to give it a newer, sleeker look, with a nicer interface, and there have been many things that i've wanted to add for years, but just never got around to doing. Things like adding a way to have a picture of the finished product, a way to grab a recipe from one of the many recipe websites I search, and more.
Ligne 11: Ligne 11:
 While I'm still in the process of development and the UI is still somewhat in flux, I'm pretty proud of the new look and feel. Here's a quick screenshot of the main form of the program.** While I'm still in the process of development and the UI is still somewhat in flux, I'm pretty proud of the new look and feel. Here's a quick screenshot of the main form of the program.**
  
-Quoiqu'il en soit, j'ai commencé à réécrire le programme, à peu près tout, et à nouveau en utilisant Page comme environnement graphique de conception. Je voulais lui donner un aspect plus neuf, plus épuré, avec une interface plus jolie, et il y avait beaucoup de choses que je voulais ajouter depuis longtempsmais je n'avais pas pris le temps de la faire. des choses comme ajouter une façon d'avoir une photo du résultat, un manière de récupérer une recette d'un des nombreux sites Web de recettes dans lesquels je cherche, et encore plus.+Quoiqu'il en soit, j'ai commencé à réécrire le programme, de zéro, ou à peu près, et en utilisant à nouveau Page comme environnement graphique de conception. Je voulais lui donner un aspect plus neuf, plus épuré, avec une interface plus jolie, et il y beaucoup de choses que je veux ajouter depuis longtemps mais je n'ai jamais pris le temps de le faire. Des choses comme ajouter une façon d'avoir une photo du résultat, une manière de récupérer une recette d'un des nombreux sites Web de recettes sur lesquels je fais des recherches, et plus encore.
  
-Alors que je suis encore dans le processus de développement, et que l'interface utilisateur est toujours quelque peu en chantier, je suis assez fier de son nouvel aspect. Voici une rapide copie d'écran de la forme principale du programme.+Bien que je sois toujours dans le processus de développement, et que l'interface utilisateur soit toujours quelque peu en chantier, je suis assez fier de son nouvel aspect. Voici une rapide copie d'écran de la forme principale du programme.
  
 **As I said, one of the things that I was both excited and worried about was the webpage scraper. I've tried writing a generic scraper before with limited success, but never could wrap my head around it properly. Part of the problem was that other things with a higher priority level would come up just as I was starting to be comfortable with the process, and I would have to put the project on hold. By the time I got around to revisiting the project, I had to spend a good while trying to remember what I was doing and how I had done it. I ended up so frustrated I started searching the web for some tips and tricks that others posted that might give me a leg up on my learning process.** **As I said, one of the things that I was both excited and worried about was the webpage scraper. I've tried writing a generic scraper before with limited success, but never could wrap my head around it properly. Part of the problem was that other things with a higher priority level would come up just as I was starting to be comfortable with the process, and I would have to put the project on hold. By the time I got around to revisiting the project, I had to spend a good while trying to remember what I was doing and how I had done it. I ended up so frustrated I started searching the web for some tips and tricks that others posted that might give me a leg up on my learning process.**
  
-Comme je l'ai dit, l'extracteur de contenu d'unee page Web était une des choses qui, à la fois, me passionnait et m'horrifiait. J'ai déjà essayé d'écrire un extracteur générique avec un succès limité, mais je n'ai jamais pu comprendre pourquoi correctement. Une partie du problème venait du fait que d'autres choses, avec des niveaux de priorité plus hauts, sont arrivées juste au moment où je commençis à me sentir à l'aise avec le processus, et j'ai dû mettre le projet en attente. Quand j'ai essayé de me remettre sur le projet, j'ai dû passer un bon moment à essayer de me rappeler ce que j'avais fait et comment je l'avais fait. À la fin, j'étais tellement frustré que j'ai cherché quelques trucs et astuces sur le Web postés par d'autres et qui pourraient m'amener à abandonner mon processus d'apprentissage.+Comme je l'ai dit, l'extracteur de contenu d'une page Web était une des choses qui, à la fois, me passionnait et m'horrifiait. J'ai déjà essayé d'écrire un extracteur générique avec un succès limité, mais je n'ai jamais pu comprendre correctement pourquoi. Une partie du problème venait du fait que d'autres choses, avec des niveaux de priorité plus hauts, sont arrivées juste au moment où je commençais à me sentir à l'aise avec le processus, et j'ai dû mettre le projet en attente. Quand j'ai pu me remettre sur le projet, j'ai dû passer un bon moment à essayer de me rappeler ce que j'avais fait et comment je l'avais fait. À la fin, j'étais tellement frustré que j'ai cherché quelques trucs et astuces postés par d'autres sur le Web et qui pourraient m'aider à accélérer mon processus d'apprentissage.
  
 **I stumbled upon a really nice project called "recipe-scrapers" that seemed to be created just for my issue. It was a free and open source library for Python that provides custom scrapers for many cooking recipe websites, one of which is Allrecipes.com, which I end up on at least twice a week when I'm looking for new ideas for dinner recipes. At the time, there were about 20 sites that they supported and it seemed that they were very active in adding more sites. As of this writing, there are 41 different sites that are supported. **I stumbled upon a really nice project called "recipe-scrapers" that seemed to be created just for my issue. It was a free and open source library for Python that provides custom scrapers for many cooking recipe websites, one of which is Allrecipes.com, which I end up on at least twice a week when I'm looking for new ideas for dinner recipes. At the time, there were about 20 sites that they supported and it seemed that they were very active in adding more sites. As of this writing, there are 41 different sites that are supported.
Ligne 23: Ligne 23:
 Let's look at how to install the library and utilize it.** Let's look at how to install the library and utilize it.**
  
-Je suis tombé sur un beau projet appelé « recipe-scrapers » qui semblait être créé juste pour ce numéro. C'est une bibliothèque gratuite et Open Source qui fournit des extracteurs personnalisés pour de nombreux sites Web de recettes de cuisine, dont l'un d'eux s'appelle  Allrecipes.com, sur lequel je me suis retrouvé au moins deux fois en une semaine pour trouver de nouvelles idées de recettes de dîners. À ce moment-là, il y avait environ 20 sites supportés et il semblait qu'ils s'activaient beaucoup à ajouter d'autres sites. Au moment où j'écris, il y a 41 sites différents qui sont supportés.+Je suis tombé sur un beau projet appelé « recipe-scrapers » qui semblait avoir été créé juste pour ce numéro. C'est une bibliothèque gratuite et Open Source qui fournit des extracteurs personnalisés pour de nombreux sites Web de recettes de cuisine, dont l'un d'eux s'appelle Allrecipes.com, sur lequel je me retrouve au moins deux fois par semaine quand je cherche de nouvelles idées de recettes de dîners. À ce moment-là, il y avait environ 20 sites supportés et il me semblait qu'ils s'activaient beaucoup à ajouter d'autres sites. Au moment où j'écris, il y a 41 sites différents qui sont supportés.
  
 Regardons comment installer et utiliser la bibliothèque. Regardons comment installer et utiliser la bibliothèque.
Ligne 35: Ligne 35:
 $ pip install -e .** $ pip install -e .**
  
-Le dépôt est situé à https://github.com/hhursev/recipe-scrapers. La page principale fournit une liste des sites de recettes supportés ainsi qu'un court exemple sur la façon d'utiliser la bibliothèque. Comme toujours, vous devez installer la bilbiothèque avant de pouvoir l'utiliser. Vous pouvez utiliser pip pour le faire...+Le dépôt est situé à https://github.com/hhursev/recipe-scrapers. La page principale fournit une liste des sites de recettes supportés ainsi qu'un court exemple sur la façon d'utiliser la bibliothèque. Comme toujours, vous devez installer la bibliothèque avant de pouvoir l'utiliser. Vous pouvez utiliser pip pour le faire :
  
 $ pip install recipe-scrapers $ pip install recipe-scrapers
  
-Vous pouvez aussi cloner ou télécharger le dépôt et, une fois qu'il est sur votre machine, aller dans le dossier principal (recipe-scrapers)  et utiliser pip pour l'installer directement depuis la source...+Vous pouvez aussi cloner ou télécharger le dépôt et, une fois qu'il est sur votre machine, aller dans le dossier principal (recipe-scrapers) et utiliser pip pour l'installer directement depuis la source :
  
 $ pip install -e $ pip install -e
Ligne 57: Ligne 57:
 Maintenant, ouvrez votre environnement de développement (IDE) ou votre éditeur préféré et créez un nouveau fichier. Appelons-le « scrapertest.py ». Maintenant, ouvrez votre environnement de développement (IDE) ou votre éditeur préféré et créez un nouveau fichier. Appelons-le « scrapertest.py ».
  
-Bien sûr, la première chose que vous devez faire est d'importer la bibliothèque...+Bien sûr, la première chose que vous devez faire est d'importer la bibliothèque :
  
 from recipe_scrapers import scrape_me from recipe_scrapers import scrape_me
  
-Ensuite, vous aurez besoin d'une page de recette que vous voudrez extraire. Vous devrez en trouver une qui soit simple, pas une page de catégories. Pour ce tutoriel, nous utiliserons une page de Allrecipes.com qui fournit la recette asiatique du Canard à l'orange https://www.allrecipes.com/recipe/61024/asian-orange-chicken/ . Ci-dessous à gauche, voici un aperçu rapide de ce à quoi ressemble cette page.+Ensuite, vous aurez besoin d'une page de recette que vous voudrez extraire. Vous devrez en trouver une qui soit simple, pas une page de catégories. Pour ce tutoriel, nous utiliserons une page de Allrecipes.com qui fournit la recette asiatique du Canard à l'orange https://www.allrecipes.com/recipe/61024/asian-orange-chicken/. Ci-dessous à gauche, voici un aperçu rapide de ce à quoi ressemble cette page.
  
 **The next thing that we should do is create a variable to hold the URL of the site page... **The next thing that we should do is create a variable to hold the URL of the site page...
Ligne 75: Ligne 75:
 Note: Some scrapers may provide more or less information depending on the site and if the author of the scraper included it.** Note: Some scrapers may provide more or less information depending on the site and if the author of the scraper included it.**
  
-La chose suivante à faire est de créer une variable qui contient l'URL de la page du site...+Ensuite, il faut créer une variable qui contient l'URL de la page du site :
  
 site = 'https://www.allrecipes.com/recipe/61024/asian-orange-chicken/' site = 'https://www.allrecipes.com/recipe/61024/asian-orange-chicken/'
  
-Maintenant, nous créons une instance de l'extracteur et lui fournissons l'URL.+Maintenant, nous créons une instance de l'extracteur et lui fournissons l'URL :
  
 scraper = scrape_me(site) scraper = scrape_me(site)
  
-Une fois fait, nous pouvons commencer à fouiller dans les informations que l'extracteur à ramener. Chaque élément d'information est est gérée par une méthode séparée.+Une fois fait, nous pouvons commencer à fouiller dans les informations que l'extracteur ramène. Chaque élément d'information est géré par une méthode séparée.
  
 Note : certains extracteurs fournissent plus ou moins d'informations suivant le site et si l'auteur de l'extracteur l'a inclus. Note : certains extracteurs fournissent plus ou moins d'informations suivant le site et si l'auteur de l'extracteur l'a inclus.
Ligne 91: Ligne 91:
 When we run the program, the output looks like that shown on the next page, top.** When we run the program, the output looks like that shown on the next page, top.**
  
-À partir du code ci-dessus, nous serons capable d'obtenir le titre de la recette, le temps total de mise en œuvre de la recette, le nombre de couverts obtenus (rendements), une liste des ingrédients, les instructions et une URL de l'image, s'il y en a une disponible. Dans ce cas, nous devons mettre les données de chacun dans une variable. Maintenant (en bas à droite), imprimons les données dans un terminal.+À partir du code ci-dessus, nous serons capable d'obtenir le titre de la recette, le temps total de mise en œuvre de la recette, le nombre de couverts obtenus (rendements), une liste des ingrédients, les instructions et une URL de l'image, s'il y en a une de disponible. Dans ce cas, nous devons mettre les données de chaque partie de la recette dans une variable. Maintenant (en bas à droite), imprimons les données dans un terminal.
  
 Quand nous lançons le programme, la sortie ressemble à celle montrée sur la page suivante, en haut.  Quand nous lançons le programme, la sortie ressemble à celle montrée sur la page suivante, en haut. 
Ligne 108: Ligne 108:
 With this small change, our output now looks like that shown far right.** With this small change, our output now looks like that shown far right.**
  
-Il est évident que les ingrédients ressortent comme un liste Python ; aussi, changeons un peu le programme pour améliorer la lisibilité des données. Commentez la ligne qui imprime la liste comme une « globale » et remplacez-la par...+Il est évident que les ingrédients ressortent comme une liste Python ; aussi, changeons un peu le programme pour améliorer la lisibilité des données. Commentez la ligne qui imprime la liste comme une « globale » et remplacez-la par :
  
 # print(f'Ingredients: {ingredients}') # print(f'Ingredients: {ingredients}')
Ligne 132: Ligne 132:
 Be sure to indent the rest of the code so that it all falls under the if statement.** Be sure to indent the rest of the code so that it all falls under the if statement.**
  
-Maintenant, améliorons un peu le programme pour permettre à un utilisateur d'entrer l'URL pendant le fonctionnement, plutôt que de le coder en dur. Commentez la ligne qui assigne l'URL (site ='') et remplacez-la par...+Maintenant, améliorons un peu le programme pour permettre à un utilisateur d'entrer l'URL pendant le fonctionnement, plutôt que de le coder en dur. Commentez la ligne qui assigne l'URL (site ='') et remplacez-la par :
  
-site = input('Merci de saisir l'URL du site Web à extraire (une ligne vierge pour quitter) ->')+site = input ('Merci de saisir l'URL du site Web à extraire (une ligne vierge pour quitter) ->')
  
 if site != '': if site != '':
Ligne 149: Ligne 149:
  
 With a bit more cleanup of the output portion of the code, it will be pretty nice. However, what happens when you enter a website that is not one of the sites that is supported by the library? Let’s look by trying a site that I know is not supported (below) https://www.jennycancook.com/recipes/custard-filled-paczki/** With a bit more cleanup of the output portion of the code, it will be pretty nice. However, what happens when you enter a website that is not one of the sites that is supported by the library? Let’s look by trying a site that I know is not supported (below) https://www.jennycancook.com/recipes/custard-filled-paczki/**
 +
 +Pour ce test, nous utiliserons une autre page de recettes bien connue, à nouveau sur Allrecipes.
 +https://www.allrecipes.com/recipe/8849/baked-chicken-nuggets/
 +
 +Maintenant, quand vous lancez le programme avec la nouvelle URL, votre sortie ressemble à ceci :
 +
 +Avec un peu plus d'ajustement de la partie de code pour la sortie, elle sera plutôt chouette. Cependant, qu'arrive-t-il si vous entrez un site Web qui n'est pas dans les sites Web supportés par la bibliothèque ? Regardons en essayant un site que je sais ne pas être supporté (ci-dessous) https://www.jennycancook.com/recipes/custard-filled-paczki/
  
 **This error is easy to avoid. All of the sites that are supported are stored in a dictionary named SCRAPERS. What we will want to do is grab the domain from the URL and see if it is in the SCRAPERS dictionary. We can do that by importing the urlparse library… **This error is easy to avoid. All of the sites that are supported are stored in a dictionary named SCRAPERS. What we will want to do is grab the domain from the URL and see if it is in the SCRAPERS dictionary. We can do that by importing the urlparse library…
Ligne 157: Ligne 164:
  
 Again, be sure to match the indentation level of the rest of the code. Finally, at the very end of the code, add the following two lines (below).** Again, be sure to match the indentation level of the rest of the code. Finally, at the very end of the code, add the following two lines (below).**
 +
 +Cette erreur est facile à éviter. Tous les sites qui sont supportés sont stockés dans un dictionnaire nommé SCRAPERS. Ce que nous ferons, c'est de récupérer le domaine dans l'URL et de voir s'il est dans le dictionnaire SCRAPERS. Nous pouvons le faire en important la bibliothèque urlparse :
 +
 +from urllib.parse import urlparse
 +
 +Assurez-vous de la placer tout en haut du fichier, juste sous l'autre déclaration d'import. Le code existant sera affiché ici en « not bold » (non gras) et le nouveau comme en « bold » (gras).
 +
 +À nouveau, vérifiez la bonne correspondance du niveau d'indentation avec le reste du code. Enfin, tout à la fin du code, ajoutez les deux lignes suivantes (ci-dessous).
  
 **Now when you run the program, using the unsupported URL, you’ll see the following… **Now when you run the program, using the unsupported URL, you’ll see the following…
Ligne 166: Ligne 181:
  
 That’s it.This base code can be easily worked into a GUI form as well. Here’s a shot of what my GUI scraper form looks like.** That’s it.This base code can be easily worked into a GUI form as well. Here’s a shot of what my GUI scraper form looks like.**
 +
 +Maintenant, quand vous lancerez le programme en utilisant une URL non supportée, vous verrez ce qui suit :
 +
 +Merci de saisir le site Web à extraire (laissez vierge pour quitter) ->https://www.jennycancook.com/recipes/custard-filled-paczki/
 +
 +Désolé, ce site Web n'est pas supporté actuellement.
 +
 +Voilà. Cette base de code peut facilement être mise dans une interface graphique. Voici une vue de ce à quoi ressemble mon extracteur en mode graphique.
  
 **As I usually do, I’ve put the code up on Pastebin at https://pastebin.com/t0t8a0fm **As I usually do, I’ve put the code up on Pastebin at https://pastebin.com/t0t8a0fm
Ligne 172: Ligne 195:
  
 Keep coding!** Keep coding!**
 +
 +Comme je le fais habutuellement, j'ai mis le code sur Pastebin à https://pastebin.com/t0t8a0fm
 +
 +Jusqu'à la prochaine fois,
 +
 +Continuez à coder !
issue154/python.1583305982.txt.gz · Dernière modification : 2020/03/04 08:13 de d52fr