Vous n'êtes pas identifié(e).

  • Contributions :
  • Vos boîtes de messages privés sont vides.

🟣 Tuto : Ruby - scraper un annuaire pour remplir le sien :)


#1 2013-08-25 10:31:55

Mention conquering_lion
🥉 Grade : Scout

Auxiliaire10likes
Inscription : 2013-05-23
Messages : 275
Likes : 16

Tuto : Ruby - scraper un annuaire pour remplir le sien :)

étant en train de me construire une pyramide avec money site affilié tout en haut, j'ai choisi de faire un annuaire pour un de mes satellites (au nombre de 4). Et comme dis sur un thread ici, remplir son annuaire ou attendre que les gens viennent dessus n'est pas la meilleur solution.. Je me suis donc dis que je pouvais coder un truc pour scraper un annuaire, faire un flux xml en résultat, flux que je chargerais ensuite dans mon propre annuaire avec un bot (je lutte un peu sur cette dernière partie mais ce n'est pas le sujet)... voici donc une petite contrib (algo + code ) qui marche bien (scraper 900 références rapido c cool).


lib à inclure :

require 'uri'
require 'mechanize'
require 'nokogiri'
require 'logger'
require 'rexml/document'

création de l'agent mechanize :

     @agent = Mechanize.new do |a|
        a.user_agent_alias = 'Mac Safari'
        a.max_history = 0
        a.open_timeout = 15
        a.read_timeout = 4
        a.keep_alive = true
        a.log = Logger.new(STDOUT)
      end

J'envoi mon agent sur la page souhaité (je planque l'url pour passer sous le radar, pm si vous la voulez pour tester) :


    url = 'http://www.xxxxxxxx-xxx-xxx.fr/'
    page = @agent.get(url)    

Mes listes vides d'init :

    @list_url = []
    @list_href = []
    @list_title = []
    @list_desc = []

Récolte des url (catégorie et sous catégories). Pour info les liens sont en url relatives, donc obliger de rajouter le chemin absolu. De plus, obligé de passer par une méthode pour permettre la récursivité pour les sous catégories :

  def harverst_url(page)
    url =  'http://www.xxxxxxxx-xxx-xxx.fr/'
    page.links_with(:class => "catwdc").each do |zz|
      init = url    
      link = init + zz.href.to_s
      categ = @agent.get link
      @list_url << link
      harverst_url(categ)
    end
  end


La méthode de récolte des sites de l'annuaire, qu'on appelle avec un indice dans le cas où il y a plusieurs pages de pagination par catégorie :

  def harvest(page,count)
     url =  'http://www.xxxxxxxx-xxx-xxx.fr/'
     countup = count+1

     page.parser.xpath('//table[@class="sitetable"]/tr[2]/td/p').each do |site|
        elem = site.search('a._blank', '//a[@class="_blank"]')
        @list_href << elem.attribute('href')
        @list_title << elem.attribute('title')
        @list_desc << site.text
     end
     page.links_with(:text => countup.to_s).each do |paginate|
       next_page = @agent.get ( url+paginate.href)
       harvest(next_page,countup)
     end
  end


on appelle la méthode ci-dessus comme ceci, en bouclant sur les pages déjà récoltées :

    @list_url.each do |uri|
      parsing = @agent.get(uri)  
      harvest(parsing,1)
    end

Suite à cela, on a les listes @list_href, @list_title et @list_desc remplis. Suffit maintenant de charger ca dans le flux xml :


    finish = @list_href.length
    i = 0

    file_xml_out =File.open("data.xml",'a')
    doc = REXML::Document.new
    doc.add_element("entries")

    while i <= finish
      format_flow(doc, @list_href[i],@list_title[i],@list_desc[i])
      i = i + 1
    end
    file_xml_out.write doc
    file_xml_out.close


et la méthode qui formate le flux :

 def format_flow(doc,href_var,title_var,desc_var)

      data = doc.root.add_element("site")
     
      title = REXML::Element.new("title")
      title.text = title_var
      data.elements << title

      href = REXML::Element.new("href")
      href.text = href_var
      data.elements << href

      desc = REXML::Element.new("description")
      desc.text = desc_var
      data.elements << desc

      categ = REXML::Element.new("categorie")
      categ.text = "1"
      data.elements << categ
  end
 



voilà, tout ca fonctionne bien comme je l'écrivais plus haut, maintenant je galère à charger mon flux xml dans mon freeglobe ... tant pis, je continue et je vais coder un autre truc pour scraper un autre annuaire en attendant smile

si vous voulez de l'aide pour scraper un truc, hésitez pas à me pm

tuto ruby xml

Dernière modification par conquering_lion (2014-03-15 12:10:56)

0
J'aime ❤️

🔴 Hors ligne

#2 2013-08-25 10:49:04

Mention Andes
🥉 Grade : Scout

AuxiliaireIngénieur web
Inscription : 2012-07-31
Messages : 403
Likes : 0

Développement PHP
Développement JS
intégration Html Css
Networking SEO
Site Web

Re : Tuto : Ruby - scraper un annuaire pour remplir le sien :)

Sympa ton petit tuto, perso j'ai un log (j'ai plus le nom en tête) qui permet de scrapper n'importe quel site et de définir les éléments à récupérer sur la totalité du site, il permet aussi l'export d'un fichier sql (ou csv au choix). Si ca intèresse, je fais ma petite recherche pour retrouver le nom


J'ai le coeur d'un artiste et les dents d'un vélociraptor

0
J'aime ❤️

🔴 Hors ligne

#3 2013-08-25 15:32:58

Mention conquering_lion
🥉 Grade : Scout

Auxiliaire10likes
Inscription : 2013-05-23
Messages : 275
Likes : 16

Re : Tuto : Ruby - scraper un annuaire pour remplir le sien :)

merci smile

oui pourquoi pas pour le nom ! ca peut tjs servir
personnelement  j'aime bien coder pour me faire mes petits outils, une sorte de loisir vu que j'aime pas trop (du tout) la télé
donc ca m'occupe pendant que ma copine regarde la téloche smile


ah et pour le détail entre le post de ce matin et maintenant, je me suis décidé à changer de fusil d'épaule pour charger mes data, j'ai commencé à coder un truc pour charger à partir du flux xml direct dans mysql smile

0
J'aime ❤️

🔴 Hors ligne

#4 2013-08-27 07:15:40

Mention Andes
🥉 Grade : Scout

AuxiliaireIngénieur web
Inscription : 2012-07-31
Messages : 403
Likes : 0

Développement PHP
Développement JS
intégration Html Css
Networking SEO
Site Web

Re : Tuto : Ruby - scraper un annuaire pour remplir le sien :)

Voilà le site du logiciel en question : http://webextract.net/

wink


J'ai le coeur d'un artiste et les dents d'un vélociraptor

0
J'aime ❤️

🔴 Hors ligne

Pied de page des forums