Forum Linux.général récupérer une info variable sur un site avec CURL

Posté par . Licence CC by-sa.
0
8
sept.
2016

Bonjour,

Savez vous s'il est possible avec CURL de récupérer une info affichée sur une page web avec CURL.
Typiquement ça serait récupérer à la demande l'info du nombre d'annonce sur leboncoin.fr.
Quand on se connecte sur le site il dit "Trouvez la bonne affaire parmi 25 340 788 petites annonces", et moi j'aimerai sur un autre site récupérer le nombre d'annonce qui est affiché sur la page principale.

Merci de votre aide

  • # avec curl|wget grep awk....

    Posté par . Évalué à 1.

    tu peux greper la page obtenue sur "Trouvez la bonne affaire parmi" pour n'avoir plus que la ligne contenant la valeur et avec 2 awk tu obtiens ce que tu veux.

    grep "Trouvez la bonne affaire parmi" TON_FICHIER | awk -F">" '{ print $3 }' | awk -F"p" '{ print $1 }'
    Ce n'est pas forcément très pérenne, si la page change un peu, cela peut ne plus fonctionner.

  • # curl et xmlstarlet ou un truc dans le genre

    Posté par . Évalué à 2.

    toujours curl ou wget pour recuperer la page,
    puis awk/grep et consort comme expliqué plus haut,

    mais il y a aussi des outils (je ne connais que de nom) pour extraire une branche de la page xml/html
    trouver une balise et recuperer la valeur.

    pour ce qui est du changement de format de la page web, il faut peut-etre faire plus simple,
    plutot que la page web, peut-etre que l'URL du flux RSS te donnera aussi l'info, et ce flux devrait etre moins sensible au changement d'apparence du site

  • # Avec w3m et grep

    Posté par . Évalué à 1.

    Salut,

    $ w3m -dump -T text/html https://www.leboncoin.fr/ | grep -Po 'Trouvez la bonne affaire parmi \K[^[p]*'
    25 275 437

    • [^] # Re: Avec w3m et grep

      Posté par (page perso) . Évalué à 3.

      ou avec un peu d'analyse du HTML, avec Python 2.7, requests et BeautifulSoup
      Un script Python de quelques lignes

      #!/usr/bin/env python
      # -*- coding:utf-8 -*-
      import requests
      import bs4 as BeautifulSoup
      a = requests.get('http://www.leboncoin.fr')
      soup = BeautifulSoup.BeautifulSoup(a.text)
      print soup.h1.span.text[:-17]
      

      Ce qui peut donner

      $ python leboncoin.py
      25 282 849

      Multitasking — The art of doing twice as much as you should half as well as you could.

      • [^] # Re: Avec w3m et grep

        Posté par . Évalué à 1.

        Salut PALM123,

        Peux tu m'expliquer la dernière ligne ton code python stp?

        • [^] # Re: Avec w3m et grep

          Posté par (page perso) . Évalué à 2. Dernière modification le 12/09/16 à 13:59.

          Oui, j enlève les 17 derniers caractéres, c'est à dire
          petites annonces

          Multitasking — The art of doing twice as much as you should half as well as you could.

          • [^] # Re: Avec w3m et grep

            Posté par . Évalué à 1.

            Ah d'accord,
            mais comment sais tu que ça va tomber pil poil sur la ligne que tu veux?
            Car si je vais sur leboncoin.fr rien que sur la pages d'accueil y a pas mal de lignes.

            • [^] # Re: Avec w3m et grep

              Posté par . Évalué à 2.

              c'est la magie de la "beautifulsoup" ?
              :D

            • [^] # Re: Avec w3m et grep

              Posté par (page perso) . Évalué à 2. Dernière modification le 12/09/16 à 20:04.

              Ah je me doutais que j'aurais mieux fait de commenter mon script de 2 lignes (les 2 premières lignes servent à dire que c'est une script Python, on peut mettre tous les import sur une seule ligne, et on peut grouper les 3 dernières lignes en une seule, mais c'est peu lisible).

              Donc je vais sur le site leboncoin, je regarde le code source de la page (CTRL U avec Firefox par exemple), je cherche

              trouver la bonne affaire parmi

              il n'y en a qu'un, et donc je vois

              <section id="home" class="grid-3-1">
                  <section class="mapFrance">
                      <header class="mapFrance_header">
                          <h1 class="mapFrance_title no-border">Trouvez la bonne affaire parmi <span class="orange">25 402 168 petites annonces</span> sur leboncoin.</h1>
                          <section class="homeColLeft">
              

              BeautifulSoup a créé un arbre facile à utiliser, le plus simple, tu lances un prompt Python (python, bpython, Ipython…), tu tapes une à une les commandes, et cela donne

              >>> soup = BeautifulSoup.BeautifulSoup(a.text)
              >>> soup.h1
              <h1 class="mapFrance_title no-border">Trouvez la bonne affaire parmi <span class="orange">25 395 326 petites annonces</span> sur leboncoin.</h1>
              >>> soup.h1.span
              <span class="orange">25 395 326 petites annonces</span>
              >>> dir(soup.h1.span)
              ['HTML_FORMATTERS', 'XML_FORMATTERS', '__call__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__eq__', '__format__', '__getattr__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__iter__', '__len__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__unicode__', '__weakref__', '_all_strings', '_attr_value_as_string', '_attribute_checker', '_find_all', '_find_one', '_formatter_for_name', '_is_xml', '_lastRecursiveChild', '_last_descendant', '_select_debug', '_selector_combinators', '_should_pretty_print', '_tag_name_matches_and', 'append', 'attribselect_re', 'attrs', 'can_be_empty_element', 'childGenerator', 'children', 'clear', 'contents', 'decode', 'decode_contents', 'decompose', 'descendants', 'encode', 'encode_contents', 'extract', 'fetchNextSiblings', 'fetchParents', 'fetchPrevious', 'fetchPreviousSiblings', 'find', 'findAll', 'findAllNext', 'findAllPrevious', 'findChild', 'findChildren', 'findNext', 'findNextSibling', 'findNextSiblings', 'findParent', 'findParents', 'findPrevious', 'findPreviousSibling', 'findPreviousSiblings', 'find_all', 'find_all_next', 'find_all_previous', 'find_next', 'find_next_sibling', 'find_next_siblings', 'find_parent', 'find_parents', 'find_previous', 'find_previous_sibling', 'find_previous_siblings', 'format_string', 'get', 'getText', 'get_text', 'has_attr', 'has_key', 'hidden', 'index', 'insert', 'insert_after', 'insert_before', 'isSelfClosing', 'is_empty_element', 'name', 'namespace', 'next', 'nextGenerator', 'nextSibling', 'nextSiblingGenerator', 'next_element', 'next_elements', 'next_sibling', 'next_siblings', 'parent', 'parentGenerator', 'parents', 'parserClass', 'parser_class', 'prefix', 'prettify', 'previous', 'previousGenerator', 'previousSibling', 'previousSiblingGenerator', 'previous_element', 'previous_elements', 'previous_sibling', 'previous_siblings', 'recursiveChildGenerator', 'renderContents', 'replaceWith', 'replaceWithChildren', 'replace_with', 'replace_with_children', 'select', 'setup', 'string', 'strings', 'stripped_strings', 'tag_name_re', 'text', 'unwrap', 'wrap']
              >>> soup.h1.span.text
              u'25 395 326 petites annonces'
              >>> soup.h1.span.text[:-17]
              u'25 395 326'
              >>> 
              

              la commande dir(xxx) montre les méthodes disponibles, et donc j'ai
              text
              qui me renvoie juste le texte

              Multitasking — The art of doing twice as much as you should half as well as you could.

              • [^] # Re: Avec w3m et grep

                Posté par . Évalué à 1. Dernière modification le 13/09/16 à 00:36.

                Ok merci je crois que j'ai compris (en gros).
                Dans ta dernière ligne de code H1 fait référence à la balise "" et span à "".

                Cool merci

    • [^] # Re: Avec w3m et grep

      Posté par . Évalué à 1.

      Nickel merci

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.