web-dev-qa-db-fra.com

navigateur internet sans tête?

Je voudrais faire ce qui suit. Connectez-vous à un site Web, cliquez sur quelques liens spécifiques, puis cliquez sur un lien de téléchargement. Je voudrais l'exécuter en tant que tâche planifiée sous Windows ou tâche cron sous Linux. Je ne suis pas pointilleux sur la langue que j'utilise, mais j'aimerais que cela fonctionne sans mettre une fenêtre de navigateur à l'écran si possible.

68
Jared

Voici une liste de navigateurs sans tête que je connais:

  • HtmlUnit - Java. Moteur de navigateur personnalisé. Support JavaScript limité/émulé DOM. Open source.
  • Ghost - Python uniquement. Basé sur WebKit. Prise en charge complète de JavaScript. Open source.
  • Twill - Python/ligne de commande. Moteur de navigateur personnalisé. Pas de JavaScript. Open source.
  • PhantomJS - Ligne de commande/toutes les plateformes. Basé sur WebKit. Prise en charge complète de JavaScript. Open source.
  • Awesomium - C++ /. NET/toutes les plateformes. À base de chrome. Prise en charge complète de JavaScript. Commercial/gratuit.
  • SimpleBrowser - .NET 4/C #. Moteur de navigateur personnalisé. Pas de support JavaScript. Open source.
  • ZombieJS - Node.js. Moteur de navigateur personnalisé. Prise en charge JavaScript/DOM émulé. Open source. Basé sur jsdom .
  • EnvJS - JavaScript via Java/Rhino. Moteur de navigateur personnalisé. Prise en charge JavaScript/DOM émulé. Open source.
  • Watir-webdriver avec gem sans tête - Ruby via WebDriver. Prise en charge complète de JS via les navigateurs (Firefox/Chrome/Safari/IE).
  • Spynner - Python uniquement. PyQT et WebKit.
  • jsdom - Node.js. Moteur de navigateur personnalisé. Prend en charge JS via DOM émulé. Open source.
  • TrifleJS - port de PhantomJS utilisant MSIE (Trident) et V8. Open source.
  • i4j - Pure Java 8. Une bibliothèque d'encapsulation autour du moteur JavaFx WebKit, y compris les modes sans tête.
  • Chromium Embedded Framework - Version embarquée complète et à jour de Chromium avec un rendu hors écran si nécessaire. C/C++, avec des wrappers .NET (et d'autres langages). Comme il s'agit de Chromium, il prend en charge tout . Licence BSD.
  • Selenium WebDriver - Prise en charge complète de JavaScript via les navigateurs (Firefox, IE, Chrome, Safari, Opera). Officiellement pris en charge liaisons sont C #, Java, JavaScript, Haskell, Perl, Ruby, PHP, Python, Objective-C et R. Des liaisons non officielles sont disponibles pour Qt et - Aller . Open source.

Les navigateurs sans tête qui prennent en charge JavaScript via un DOM émulé ont généralement des problèmes avec certains sites qui utilisent des fonctionnalités de navigateur plus avancées/obscures, ou qui ont des fonctionnalités qui ont des dépendances visuelles (par exemple via des positions CSS et ainsi de suite), donc alors que la prise en charge JavaScript pure dans ces les navigateurs sont généralement complets, la fonctionnalité de navigateur réellement prise en charge ne doit être considérée que comme partielle.

(Remarque: la version originale de cet article ne mentionnait que HtmlUnit, d'où les commentaires. Si vous connaissez d'autres implémentations de navigateur sans tête et avez des droits d'édition, n'hésitez pas à éditer cet article et à les ajouter.)

148
Nathan Ridley

Découvrez twill , un langage de script très pratique pour exactement ce que vous recherchez. À partir de exemples :

setlocal username <your username>
setlocal password <your password>

go http://www.slashdot.org/
formvalue 1 unickname $username
formvalue 1 upasswd $password
submit

code 200     # make sure form submission is correct!

Il y a aussi une API Python si vous recherchez plus de flexibilité.

5
orip

Jetez un œil à PhantomJS , un framework d'automatisation basé sur JavaScript disponible pour Windows, Mac OS X, Linux, d'autres systèmes * ix .

En utilisant PhantomJS, vous pouvez faire des choses comme ceci:

console.log('Loading a web page');

var page = new WebPage();
var url = "http://www.phantomjs.org/";

page.open(url, function (status) {
    // perform your task once the page is ready ...
    phantom.exit();
});

Ou évaluez le titre d'une page :

var page = require('webpage').create();
page.open(url, function (status) {
    var title = page.evaluate(function () {
        return document.title;
    });
    console.log('Page title is ' + title);
});

Exemples de Quickstart de PhantomJS page. Vous pouvez même rendre une page en PNG, JPEG ou PDF en utilisant la méthode render () .

3
SteAp

J'ai déjà fait cela en utilisant le contrôle ActiveX d'Internet Explorer (WebBrowser, MSHTML). Vous pouvez l'instancier sans le rendre visible.

Cela peut être fait avec n'importe quel langage prenant en charge COM (Delphi, VB6, VB.net, C #, C++, ...)

Bien sûr, c'est une solution rapide et sale et peut ne pas être appropriée dans votre situation.

2
Daniel Rikowski

PhantomJS est un navigateur Web Headit sans tête que vous pouvez créer un script avec JavaScript.

2
xn.

Node.js avec YUI sur le serveur. Découvrez cette vidéo: http://www.yuiblog.com/blog/2010/09/29/video-glass-node/

Le gars dans cette vidéo Dav Glass montre un exemple de la façon dont il utilise node pour récupérer une page de Digg. Il a ensuite attaché YUI au DOM qu'il a saisi et peut le manipuler complètement.

1
j03m

Si vous utilisez PHP - essayez http://mink.behat.org/

1
everzet

À l'exception du téléchargement automatique du fichier (car il s'agit d'une boîte de dialogue), un formulaire gagnant avec le contrôle Web intégré le fera.

Vous pouvez regarder Watin et Watin Recorder . Ils peuvent vous aider avec le code C # qui peut vous connecter à votre site Web, naviguer vers une URL et peut-être même aider à automatiser le téléchargement du fichier.

YMMV cependant.

1
Wayne

Si les liens sont connus (par exemple, vous n'avez pas à les rechercher sur la page), vous pouvez probablement utiliser wget . Je crois que cela fera la gestion de l'État sur plusieurs récupérations.

Si vous êtes un peu plus entreprenant, alors je me plongerais dans les nouveaux goodies dans Python 3. . Ils ont refait l'interface à leur pile HTTP et, à mon humble avis, ont une interface très agréable qui est sensible à ce type de script.

1
D.Shawley

libCURL pourrait être utilisé pour créer quelque chose comme ça.

0
Adam Pierce

Ne pouvez-vous pas simplement utiliser un gestionnaire de téléchargement?

Il y en a de meilleurs, mais FlashGet a une intégration de navigateur et prend en charge l'authentification. Vous pouvez vous connecter, cliquer sur un tas de liens et les mettre en file d'attente et planifier le téléchargement.

Vous pouvez écrire quelque chose qui, par exemple, agit comme un proxy qui attrape des liens spécifiques et les met en file d'attente pour un téléchargement ultérieur, ou un bookmarklet Javascript qui modifie les liens pour aller à "http://localhost:1234/download_queuer?url=" + $link.href et avoir cette file d'attente pour les téléchargements - mais vous réinventeriez la roue du gestionnaire de téléchargement, et avec l'authentification, cela peut être plus compliqué.

Ou, si vous souhaitez que le bit "connexion, cliquez sur les liens" soit également automatisé - examinez capture d'écran .. Fondamentalement, vous chargez la page via une bibliothèque HTTP, trouvez les liens de téléchargement et téléchargez-les. .

Exemple légèrement simplifié, utilisant Python:

import urllib
from BeautifulSoup import BeautifulSoup
src = urllib.urlopen("http://%s:%[email protected]" % ("username", "password"))
soup = BeautifulSoup(src)

for link_tag in soup.findAll("a"):
    link = link_tag["href"]
    filename = link.split("/")[-1] # get everything after last /
    urllib.urlretrieve(link, filename)

Cela téléchargerait chaque lien sur example.com, après s'être authentifié avec le nom d'utilisateur/mot de passe "nom d'utilisateur" et "mot de passe". Vous pouvez, bien sûr, trouver des liens plus spécifiques en utilisant BeautifulSoup's les sélecteurs HTML (par exemple, vous pouvez trouver tous les liens avec la classe "download", ou les URL commençant par http://cdn.example.com).

Vous pouvez faire de même dans presque toutes les langues.

0
dbr

.NET contient System.Windows.Forms.WebBrowser . Vous pouvez en créer une instance, l'envoyer à une URL, puis analyser facilement le code HTML sur cette page. Vous pouvez ensuite suivre les liens que vous avez trouvés, etc.

Je n'ai travaillé avec cet objet que de manière minimale, donc je ne suis pas un expert, mais si vous êtes déjà familier avec .NET, cela vaut probablement la peine d'être étudié.

0
goric

Vous pouvez utiliser Watir avec Ruby ou Watin avec mono.

0
Paco

Vous pouvez également utiliser Live Http Headers (extension Firefox) pour enregistrer les en-têtes envoyés au site (Connexion -> Liens -> Lien de téléchargement), puis les répliquer avec php à l'aide de fsockopen. La seule chose que vous devrez probablement modifier est la valeur du cookie que vous recevez de la page de connexion.

0
Alekc