web-dev-qa-db-fra.com

Web Scraping avec Scala

Je me demande simplement si quelqu'un connaît une bibliothèque de web-scraping qui tire parti de la syntaxe succincte de Scala. Jusqu'à présent, j'ai trouvé Chafe , mais cela semble mal documenté et maintenu. Je me demande si quelqu'un a fait du scraping avec Scala et a des conseils). (J'essaie de m'intégrer dans un framework Scala existant plutôt que d'utiliser un grattoir écrit, par exemple, en Python.)

34
Michael Tingley

Tout d'abord, il y a une pléthore de bibliothèques de scraping HTML dans JVM, tout ce que vous avez à faire est de pimp l'un d'entre eux (pimp my library pattern) .

Les quatre que j'ai utilisés sont:

  • HtmlUnit - émulera le navigateur et exécutera même Javascript
  • Jericho - Préserve la mise en forme et idéal si vous souhaitez modifier le HTML récupéré
  • NekoHtml
  • JSoup - ne fonctionne pas avec Scala. Peut fonctionner

J'ai utilisé du sélénium mais jamais pour le grattage. Scala a une enveloppe autour du sélénium .

Je recommanderais de pimping une bibliothèque Java) existante sur une bibliothèque à moitié cuite Scala lib.

12
Adam Gent

Je n'ai pas de recommandation spécifique à Scala, mais pour la JVM en général, j'ai eu un bon succès avec:

  • JSoup Vous pouvez utiliser des sélecteurs CSS pour "gratter" le document. Vraiment agréable de travailler avec.
  • Utilisez Tagsoup pour obtenir votre entrée HTML en XML, puis utilisez des processeurs XML pour "Scrape".

La route de Tagsoup fonctionne plutôt bien avec Scala puisque le XML intégré "dsl" de Scala est assez concis (si vous pouvez pardonner ses problèmes de perf et ses bizarreries d'API occasionnelles). De plus, Tagsoup gérera presque tout document indésirable que vous lui donnez.Il a également des subtilités comme la compréhension intégrée de nombreuses entités HTML sur lesquelles d'autres SAXParsers s'étoufferont comme non déclarées.

tl; dr - JSoup + sélecteurs CSS si possible, sinon Tagsoup + scala XML. Si slow is ok, tagsoup d'abord, puis jsoupez le résultat.

8
overthink

Je recommanderais Goose: https://github.com/jiminoc/goose

Ce n'est pas aussi général que vous pourriez avoir besoin, mais si vous récupérez le contenu d'un article à partir de sites populaires, cela peut fonctionner hors de la boîte. Il fournit également un cadre sur lequel vous pouvez travailler si vous souhaitez étendre leur code pour couvrir d'autres sites.

2
scalapeno