Annonce

Réduire
Aucune annonce.

Web Scraping is Beautiful

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Web Scraping is Beautiful




    Le webScraping est le "grattage Web (où Web récolte donnée Internet de l'extraction) est une technique de logiciel informatique de l'extraction d'informations à partir de sites web".

    Lorsque nous cherchons un bug, identifier sur un système une partie qui ne sera pas conforme au bon fonctionnement des logiciels qui tourne dessus, nous est amenée à récolter et à analyser des données.L'HTML analysé est facile en Python, en particulier avec l'aide de la bibliothèque Beautiful Soup.

    On a beaucoup d'autres librairies possibles pour ce type de pratique. J'ai voulu partager ce programme qui n'est pas optimisé au maximum de ses capacités, attention, je ne traite pas encore de tout. Je partagerai bientôt d'autres programmes travaillés en C++ et python voire même Perl qui nous permettra de travailler sur les couches réseaux.Mais chaque chose en son temps. Vous avez sur Hackdemics des tutoriels conséquents sur le sujet, ainsi que ceux que j'ai partagés dernièrement sur SSL/TLS et SMTP.

    Modules à installer, Dépendances :
    tldextract
    Beautiful Soup 4
    Requests


    Python V3.4

    Je sais que Fred sera réticent, c'est normal, chacun a leurs préférences, personnellement j'utilise le module sur le moment. Mais Beautiful a cette chance d'avoir depuis 2004 été de sauver par les programmeurs.
    Beautiful Soup se trouve au sommet des analyseurs Python comme lxml et html5lib, vous permettant d'essayer différentes stratégies d'analyse. On apprécie sa flexibilité et surtout sa librairie présentant de nombreuses fonctions facilement utilisables.


    Ce que j'essaie de montrer est qu'avec des connaissances l'on peut facilement établir des petits programmes afin de réaliser des techniques simples.Le code suivant a été réalisé en 2h de temps, je n'ai donc pas traité les erreurs (except), ni chercher à optimiser certaines parties, ni à extraire sur un fichier, mais surtout à créer rapidement un script utilisant beautiful, request et tdlextract afin que vous perceviez leurs utilisations au sein d'un programme.


    Si ces modules vous intéressent, ils peuvent être étendus plus sur un spectre d'action plus large que le mien.



    Code:
    #-------------------------------------------------------------------------------
    # Name:        Scraping URL 
    # Purpose:     Extract URL avec différentes techniques
    #
    # Author:      DM && Helios
    #
    # Created:     06/10/2015
    # Copyright:   (c) DMH 2015
    # Licence:     Free
    #-------------------------------------------------------------------------------
    
    
    # -*- coding: cp1252 -*-
    
    # -*- coding: UTF-8 -*-
    
    
    ##### Modules import #####
    
    from bs4 import BeautifulSoup
    import requests
    import urllib.request
    import re
    import tldextract
    import os
    
    ##### Mise en place des Fonctions #####
    ##### Utilisation de Beautiful afin de Parser une URL, simple et efficace #####
    def Scraping():
        url = input ("Entrer a website à Parser (www.site.com): ")
        r  = requests.get("http://" +url)
        data = r.text
        soup = BeautifulSoup(data, "html.parser")
        for link in soup.find_all('a'):
            print(link.get('href'))
    
    ##### Utilisation de tldextract et quelques unes de ces fonctions de bases, rapide et précise #####
    def Extract():
        Extract = input ("Entrer l'url d'un site à extraire : ")
        Ext = tldextract.extract(Extract)
        print (Ext, Ext.subdomain, Ext.domain, Ext.suffix, Ext.registered_domain, '.'.join(Ext[:2])) 
    
    
    ##### Request une star dans les modules tout comme urllib #####
    def ExtractHTML():
        url = input("Entrer l'URL du Website :")
        req = urllib.request.Request(url)
        resp = urllib.request.urlopen(req)
        respData = resp.read()
        print(respData)
    
    
    ##### On reprend les même sauf que l'on va préciser l'extraction de la page #####
    def ExtractOnly():
        url = input("Entrer l'URL du Website :")
        req = urllib.request.Request(url)
        resp = urllib.request.urlopen(req)
        respData = resp.read()
        balise = input ("Entrer les balises à extraire (p,a,...): ")
        balises = re.findall(r'<' + balise + '>(.*?)</' + balise + '>',str(respData)) # Tapez p pour récupéré ce qui se situe entre les balises p
        print (paragraphs)
    
    
    
    def menu():
        os.system("clear")
        print ("###################################################")
        print ("#               Scraping Website                  #")
        print ("#                Scrap & Extract                  #")
        print ("#               -----------------                 #")
        print ("#                DreAmuS/HelioS                   #")
        print ("###################################################")
        print ("")
        print (" [+] 1 - Scraping les Liens d'un website")
        print (" [+] 2 - Extraire les Noms de Domaines")
        print (" [+] 3 - Extraire HTML")
        print (" [+] 4 - Extraire une partie de l'URL")
        print (" [+] 5 - Quitter")
        print ("-------------------------------------------------)
        choix = int(input("Tapez Votre Choix >>> "))
    
        if (choix == 1):
            Scraping()
            menu()
        elif (choix ==2):
            Extract()
            menu()
        elif (choix == 3):
            ExtractHTML()
            menu()
        elif (choix == 4):
            ExtractOnly()
            menu()
        elif (choix == 5):
            quit
        else:
            menu()
    
    
    if __name__=="__main__":
        menu()

    1 - Scraping les Liens d'un website : On va scraper les liens en rapport avec le NDD
    2 - Extraire les Noms de Domaines : On va extraire les NDD en rapport
    3 - Extraire HTML : On va extraire l'url de la page demandé
    4 - Extraire une partie de l'URL : On va extraire une partie spécifique (exemple: on met l'url d'une page et p qui scrapera que ce qu'il y a entre <p> et </p>)
    5 - Quitter : On quitte le programme qui reviens en boucle


    Ainsi, vous verrez qu'il est possible d'utiliser cette première ébauche pour rajouter des modules et fonctions afin de par exemple comme l'avait à l'époque cet anglais en scrapant l'intégralité des fichiers d'une prison, en tâtonnant et en précisant son script sur les bonnes balises. Il avait ainsi sans avoir besoin de voir la page, enregistrer sous un fichier texte les fiches de tous les détenus, prouvant ainsi la puissance du Scraping devant des obstacles.

    La recherche de l'information, base de la communication web, est facilité au travers du langage Python .

    Dans son dernier poste, Fred nous expliquait comment avec Python et le module lxml, il avait pu récupérer les mp3 d'un site. Je souhaitais utiliser d'autres voies afin de vous montrer le potentiel de Python. Le Scraping peut être utilisé pour tous types d'action sur le web.
    La prochaine fois, je partagerais un script que je déploirais sur réseau avec sa version C++, perl et python.

    En espérant cela vous a plu.
    Dernière modification par DreAmuS, 07 octobre 2015, 11h27.

  • #2
    joli est facile à comprendre , codé proprement

    Commentaire


    • #3
      Super tuto Dreamus, comme toujours

      J'ajouterai juste que dans le cas du parsing de pages Web (un de mes grands dada, j'ai d'ailleurs un projet très intéressant à ce sujet sur le feu), le langage xPath est aussi très utile.

      Il permet de récupérer directement les parties intéressantes d'une forme de page Web spécifique.
      On peut ainsi faire un parser pour Twitter ou autres. Il suffit d'utiliser un moteur de récupération du code html puis de, dépendant de l'URL, le fournir à un parser générique ou plus particulier.

      Je pense d'ailleurs que beautifull soup permet d'utiliser xPath.

      Commentaire


      • #4
        Merci pour les remerciements, c'est très gentil de votre part twux et anonyme77.

        Par contre Beautiful soup ne comporte pas de fonction Xpath, il a un intermédiaire appeler findnext.

        Il faut aller chercher du côté de lxmlqui a déjà été traiter par Fred et qui possède la fonction xpathgrep. Je vous laisse regarder la documentation détaillé sur cette librairie aux multiples fonctions.

        Pour faire simple, on appelle la fonction à l'aide de :

        Code:
        from lxml import etree
        On a donc introduit notre librairie lxml et importé de chez elle etree qui contient : XPath et XSLT.

        La méthode est également simple :

        xpath va lancer des requêtes sur le chemin absolu ou relatif, ainsi on pourra travailler sur ses deux possibilités de la racine à l'intérieur de l'arbre (tree en anglais) d'où le terme etree.xpath (path pour le chemin emprunté) qui a pour méthode XPath ().

        En bref,XPATH correspond à un chemin permettant d'accéder à une donnée bien précise (nœud). Il peut être assimilé à un chemin de fichier complet dans Linux,Windows ou tout autre OS ou application.



        Donc ce n'est pas réservé simplement au langage web.

        Code:
        xml_file = etree.parse("./page.xml") #connexion au fichier XML
        Le terme parse ou parser signifie dans le milieu informatique manipuler des fichiers, les identifier, les recencer,...
        Une fois connecté au fichier XML, tel que vu précédemment,nous pouvons naviguer au sein des données grâce au XPATH. Nous le ferons grâce à un FOR :
        Une fois dans la boucle, nous utilisons alors la méthode xpath afin de récupérer les informations qui nous intéressent.

        Code:
        for balise in xml_file.xpath("/page2/profil"):
            nom = balise.xpath("nom")
            print (nom[0].text)
        Voici un tableau avec les principales méthodes à savoir pour utiliser correctement lxml mais surtout parser une page web.
        Méthodes Utilité
        .items() Récupère la liste des attributs
        .text Récupère le texte du nœud visé
        .tag Récupère le nom de la balise, du nœud
        .get("attribut") Récupère la valeur de l'attribut passé en paramètre

        Il existe en C des fonctions aussi, ou alors le fameux logiciel R qui permet également d'extraire les informations d'une page.

        Pour finir, le but de cet article était pour vous démontrer la facilité pour un programmeur débutant d'avoir accès aux données d'un site ou d'une page web avec peu de moyens : un pc, un OS, un accès internet et quelques connaissances en langage informatique.

        Vous voyez également que la connaissance en HTML, XML voit tout son intérêt dans cette partie, comme quoi il n'est pas à négliger tout langage qui permet de faire tourner une application.


        Petit mot de la fin :
        L'unique point faible de python reste sa rapidité d'exécution qui dépend directement de la machine hôte. Il faut alors y coupler des modules en C, avec lesquels Python s'interfacera sans aucun soucis, étant lui même codé en C. On utilisera pour cela le module CYTHON. Et si je traduit mot à mot l'entrée de lxml.etree on a :

        Depuis la version 1.1, lxml.etree fournit une API C public. Cela permet des extensions C externes d'accéder efficacement des fonctions et des classes de lxml publics, sans passer par l'API Python.

        L'API est décrite dans le fichier etreepublic.pxd, qui est directement c-importable par des modules d'extension mis en œuvre en Pyrex ou Cython.
        Effectivement, lxml permet donc de travailler plus rapidement que Beautiful, cependant comme je suis un adepte de ce module depuis longtemps, je pense que je continuerais de l'utiliser.

        Ce qui conclura ce chapitre. Merci de l'attention que vous apporter à cet article.
        Dernière modification par DreAmuS, 10 octobre 2015, 10h44.

        Commentaire


        • #5
          avec beautifulsoup c'est vrai que ça facilite mais ça fonctionne qu'avec du code HTML pure et propre alors qu'on en trouve rarement sur le net, les dev web font de leur mieux pour coder toujours vite donc soucis de code propre
          de ce fait j, je lisais un article de Korben http://korben.info/extraire-donnee-pages-web.html pensant enfin profiter de cette librairie pour tout type de traitement en partant d'un simple scraping a un script plus riche de crawl j'ai été décue de savoir qu'il n'y avait pas de version de de Scrapy sous python 3.4
          donc si quelqu'un a un moyen de le faire fonctionner, ça aidera beaucoup de personnes comme moi

          Commentaire


          • #6
            Je sais que Fred sera réticent, c'est normal, chacun a leurs préférences, personnellement j'utilise le module sur le moment. Mais Beautiful a cette chance d'avoir depuis 2004 été de sauver par les programmeurs.
            Je ne suis pas réticent à ce module Je ne l'utilise tout simplement pas, car je ne le trouve pas optimisé, sinon il est bien !

            Commentaire


            • #7
              En espérant cela vous a plu.[/QUOTE]

              Oui beaucoup merci mais je débute et ai un peu de mal pour appliquer:
              Concrètement je voudrai simplement extraire des données à partir de la page: "http://www.serenitystocks.com/stock/us/cat"
              par exemple: Defensive Price (Graham Number): $64.55

              j'ai réussi l'exercice de Fred avec les Beatles: magique le résultat final!
              Mais avec le code:
              tree = html.fromstring(data)
              print(tree)
              me rend quelquechose de plus que propre...
              retour:<Element html at 0x31a01b0>
              difficile de trouver des balises avec ça sur un autre site!
              Merci de m'aider à progresser

              Commentaire


              • #8
                Bon exemple, mais BeautifulSoup ne peut pas gratter le contenu Ajax et JavaScript.
                Vous devriez utiliser Selenium pour gratter JavaScript.
                Comme des exemples ici:
                Dernière modification par seco, 12 janvier 2019, 18h49.

                Commentaire

                Chargement...
                X