Crawler des données web avec BeautifulSoup

a marqué ce sujet comme résolu.

Malheureusement, ce tutoriel qui était en bêta a été supprimé par son auteur.

Tout le monde se secoue ! :D

J’ai commencé (jeudi 29 juin 2017 à 16h31) la rédaction d’un tutoriel au doux nom de « Crawler des données web avec BeautifulSoup » et j’ai pour objectif de proposer en validation un texte aux petits oignons. Je fais donc appel à votre bonté sans limites pour dénicher le moindre pépin, que ce soit à propos du fond ou de la forme. Vous pourrez consulter la bêta à votre guise à l’adresse suivante :

Merci !

C’est marrant, j’ai fait exactement la même chose de mon côté il y a quelques jours pour faire des stats. :D

Très bonne idée, ce tuto. Cependant, je crains qu’un débutant soit "impressionné" par le titre. Un débutant ne saura pas forcément ce que signifie "Crawler" (il sera peut-être plus habitué à "Parser" par exemple). Ce n’est qu’une humble suggestion, mais pourquoi pas un titre du style « Parser du HTML en Python avec BeautifulSoup » ?

PS : Si tu veux je peux t’envoyer le code que j’ai utilisé pour parser le HTML des contenus (titre, temps de lecture et licence). ;)

+1 -0

Pas con l’idée du titre je pense même qu’il faudrait que j’aille vers un titre du style "Récupérer les données d’une page Web en Python" qui ferrait encore moins peur à un débutant (après tout ce tuto est pour eux vu que je reste totalement dans le superficiel et les fonctions de base de BS)

Qu’en pensez vous ?

Salut ! Quelques retours (je ne passe pas sur l’orthographe ce coup-ci mais y’a du travail là aussi) :

Je te recommande (et te recommande de recommander à tes lecteurs) d’éviter urllib au profit de requests.

Aussi, tu devrais respecter PEP8 (au moins le strict minimum), c’est à dire montrer du code avec un minimum de cohérence dans le style. Là tu fais :

1
2
3
foo = 1
bar=2
baz= 3

C’est laid, ça nuit à la lecture du code.

Aussi, puisque tu présentes du code strictement Python 3, évite de mettre (et ne propose pas de mettre) # coding: utf-8 : c’est le défaut en Python 3.

Enfin, ce que tu appelles "crawling" est en réalité ce qu’on appelle "scraping". Tu extrais des données d’une page, tu ne visites pas des pages. On ne peut pas crawler des données. On peut crawler un site web, en revanche. Là ce que tu fais n’est pas crawler mais bien scraper.

+1 -0

Salut,

Bonne initiative ce tuto. :) Tu recherches des remarques sur le fond ou la forme ? Il y aura des parties additionnels ?

tleb

Sur les deux par contre moi je comptais m’arrêter là . C’était pour faire un tuto simple pour un besoin courant et pas poussé : beaucoup de gens veulent récupérer les données d’une page mais le fond à la main.

Je ne comptais pas viser des développeurs qui veulent découvrir BS pour directement crawler tout Linkedin ;)

Salut ! Quelques retours (je ne passe pas sur l’orthographe ce coup-ci mais y’a du travail là aussi) :

Je te recommande (et te recommande de recommander à tes lecteurs) d’éviter urllib au profit de requests.

Aussi, tu devrais respecter PEP8 (au moins le strict minimum), c’est à dire montrer du code avec un minimum de cohérence dans le style. Là tu fais :

1
2
3
foo = 1
bar=2
baz= 3

C’est laid, ça nuit à la lecture du code.

Aussi, puisque tu présentes du code strictement Python 3, évite de mettre (et ne propose pas de mettre) # coding: utf-8 : c’est le défaut en Python 3.

Enfin, ce que tu appelles "crawling" est en réalité ce qu’on appelle "scraping". Tu extrais des données d’une page, tu ne visites pas des pages. On ne peut pas crawler des données. On peut crawler un site web, en revanche. Là ce que tu fais n’est pas crawler mais bien scraper.

victor

Pour l’orthographe et le code pas de souci je vais corriger çà . Par contre pourquoi éviter urllib ?

Par contre pourquoi éviter urllib ?

alliocha1805

Pourquoi pas ? Quelques raisons. Tout ça derrière une interface qui reste simple quand on veut faire quelque chose de simple mais qui donne accès à bien plus si nécessaire.

tleb

Et aussi parce que la doc d’urllib.request de Python 3 recommande carrément – et à raison – d’utiliser requests : https://docs.python.org/3/library/urllib.request.html . C’est un de ces cas pas très commun où une lib externe est meilleure et plus utilisée qu’un bout de la lib standard. Dans ce cas précis, si tu veux vraiment faire des trucs louches relativement bas niveau, t’auras peut-être (je dis bien peut-être) intérêt à te pencher sur urllib.

Mais pour un tuto aussi basique que le tiens, utiliser urllib n’a pas d’intérêt, au contraire c’est au détriment d’une super bibliothèque qui est le golden standard python. Les gens qu’un tuto comme le tiens intéressera peut-être ne sont pas les développeurs python, a priori. Plutôt des débutants à qui il vaut la peine de montrer les bons outils dès le début, de donner les bonnes habitudes.

+1 -0

Ok donc à part des problèmes de secu (et c’est important on est bien d’accord) je vois pas grand chose d’autres :) (genre réinventer la roue si ça fait plaisir à quelqu’un on va pas lui interdire ^^)

Bon sur ce je vais voir comment fonctionne cette magnifique librairie et modifier le tuto en conséquence :)

Ok donc à part des problèmes de secu (et c’est important on est bien d’accord) je vois pas grand chose d’autres :)

Et pourtant il y a plusieurs autres raisons évoquées dans ce paragraphe.

(genre réinventer la roue si ça fait plaisir à quelqu’un on va pas lui interdire ^^)

C’est pas comme ça que l’ingénierie informatique fonctionne. C’est pas une question de "on va pas lui interdire". C’est pas comme ça que la pédagogie fonctionne non plus. Si quelqu’un réinvente la roue dans un contexte professionnel, c’est presque toujours une connerie. Si quelqu’un écrit un tuto PHP/MySQL en 2017 et y montre qu’on utilise mysql_query, c’est une connerie.

Il y a une grosse différence entre montrer des bons exemples (ou indiquer qu’il s’agit de mauvais exemples quand il s’agit de mauvais exemples) et "interdire de s’amuser" (où "réinventer la roue" revient très généralement à "s’amuser" ou au syndrome du NIH). Je pense qu’un tuto doit soit montrer le bon exemple soit indiquer clairement qu’il s’agit de mauvais exemple.

+0 -0

Cool !

Trois remarques :

  • J’utiliserais "bibliothèque" à la place de "librairie" à l’écrit dans un tuto.
  • J’expliquerais pourquoi il y a (()) à la ligne suivante : writer.writerow((liste_titre[i],liste_description[i])). Pas besoin d’expliquer le concept en détail, tu peux mettre un petit mot et un lien vers un tuto/cours/doc l’expliquant.
  • Respecte PEP-8. Vraiment.
+1 -0

Et cette partie :

1
2
3
4
5
6
liste_titre = []

for elt in h3:
    titreh3 = elt.string
    titreh3 = titreh3.strip()
    liste_titre.append(titreh3)

n’est vraiment pas géniale. Les list comprehensions de Python nous permettent de faire :

1
titres = [elt.string.strip() for elt in h3]

Et au lieu de deux listes, j’aurai personnellement utilisé une liste de tuple, mais c’est un choix plutôt subjectif.

Bonjour les agrumes !

Merci pour les retours j’ai corrigé:

  • PEP-8 (d’après http://pep8online.com/ c’est bon à part une ligne de plus de 80 caractères mais clairement celle là ça serait dégueulasse de la couper
  • Compréhension de liste c’est effectivement plus propre
  • Bibliothèque plutôt que librairie

La beta est à l’adresse suivante :

Merci d’avance pour vos commentaires.

+0 -0

A propos de (()) tu as écrit :

Cette double parenthèse est dû au fait que cette méthode n’accepte qu’un tuple en paramètre. Pour en savoir plus si cela vous intéresse je ne peux que vous recommander la documentation officielle sur le sujet.

C’est faux. Tu donnes un lien vers la doc, et l’exemple donné par la doc est une liste, pas un tuple.

+0 -0
Ce sujet est verrouillé.