Vous n'êtes pas identifié(e).
é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 :
création de l'agent mechanize :
J'envoi mon agent sur la page souhaité (je planque l'url pour passer sous le radar, pm si vous la voulez pour tester) :
Mes listes vides d'init :
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 :
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 :
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 :
Suite à cela, on a les listes @list_href, @list_title et @list_desc remplis. Suffit maintenant de charger ca dans le flux xml :
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 :
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
si vous voulez de l'aide pour scraper un truc, hésitez pas à me pm
Dernière modification par conquering_lion (2014-03-15 12:10:56)
🔴 Hors ligne
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
🔴 Hors ligne
merci
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
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
🔴 Hors ligne
Voilà le site du logiciel en question : http://webextract.net/
J'ai le coeur d'un artiste et les dents d'un vélociraptor
🔴 Hors ligne