Bonjour,
Quel outil/langage conseilleriez-vous pour faire du web scraping rapide et efficace ?
Bonjour,
Quel outil/langage conseilleriez-vous pour faire du web scraping rapide et efficace ?
J’ai utilisé Scrapy (Python 2) récemment, ce framework est génial tant la mise en place est rapide.
Mon besoin était simple (extraire le contenu de balises portant une classe CSS particulière dans toutes les pages d’une sitemap) et c’était réglé en quelques lignes de code, la documentation est bien faite.
En Ruby j’utilise le Nokogiri gem, très efficace.
Lorsque la structure du site est complexe j’utilise l’extension Chrome de Kimono pour identifier les common patterns/css selectors qui m’intéressent.
Après avoir rajouté gem 'nokogiri'
et fait tourner bundle install
, créer une rake task (sur Rails créer un fichier: /lib/tasks/scrape.rake
).
Par exemple pour récupérer tous les sujets de discussion de Human Coders (NB: je ne fais pas ça généralement, mais la démo me paraissait intéressante!):
namespace :scrape_human_coders do
desc "Scraping list of topics"
task :get_topics => :environment do
require 'open-uri'
require 'nokogiri'
url = "https://forum.humancoders.com/"
document = open(url).read
html_doc = Nokogiri::HTML(document)
topics_format = "#main-outlet .topic-list a"
html_doc.css(topics_format).each_with_index do |topic, index|
if topic['href'][1] == "t"
puts topic.text
end
end
end
end
Ensuite il suffit de taper ’ rake scrape_human_coders:get_topics ’ et d’observer le résultat. Pour les sauver il suffit de remplacer la ligne puts
par Topic.create(:title => topic.text)
L’an dernier j’utilisais node.io pour nodeJS mais il n’est plus maintenu.
Entretemps j’ai trouvé ceci qui marche bien.et basé sur Cheerio :
https://scotch.io/tutorials/scraping-the-web-with-node-js
Je travaille chez Import.io qui propose une solution de scraping gratuite.
Si tu as une question, je suis dispo :)
J’ai plusieurs fois utilisé Goutte et j’ai toujours réussi à récupérer ce que je voulais
Je pense que le principal critère de choix c’est tes besoins en terme de perf (volume de page à scrapper) :
Si c’est des petits volumes (quelques pages par secondes ou moins) :
Si t’as des gros besoins et que multi-threader + distribuer ton scrapper ne suffit plus : apparement Go ça tabasse bien niveau perf pour du scrapping : http://blog.efounders.co/how-mentions-cto-has-built-a-scalable-product-that-handles-terabytes-of-data-and-crawls-the-web-in-real-time/
En Python j’utilise Requests + PyQuery.
Je ne connaissais pas Scrappy, je testerai la prochaine fois.
Je confirme l’extrême efficacité de Scrapy !
Salut,
Super example, merci!
J’ai une question qui s’eloigne un peu du sujet: est-il recommande de mettre du code directement dans les taches de rake ou faut-il plutot appeler des fonctions externes du fichier?
Merci
Salut,
J’utilise principalement Python donc Scrapy, Lxml, BeautifulSoup, PyQuery.
Très rarement, j’ai dû utilisé Mechanize pour faire des manipulations en étant authentifié. J’ai entendu parlé de Twill, une API pour simplifier l’usage de Mechanize.
Dès qu’il s’agit de code HTML généré par du JavaScript, j’utilise Casper.Js (Wrapper Python pour PhantomJS, SlimerJS, navigateurs “headless” basés sur Webkit et Gecko) ou Ghost.py (basé sur PyQt et Webkit).
en PHP5 / SF2 j’utilise DomCrawler : les sélecteurs jQuery implémentés pour PHP.
Marche au top.
En Java http://htmlunit.sourceforge.net/
Pour ce qui est des pages qui utilisent un framework JS, et ou il n’est pas possible de récupérer ce qui nous intérésse via l’API du site en question, selenium avec le wrapper phantomJS !