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.
Voici une liste de navigateurs sans tête que je connais:
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.)
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é.
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 () .
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.
PhantomJS est un navigateur Web Headit sans tête que vous pouvez créer un script avec JavaScript.
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.
Si vous utilisez PHP - essayez http://mink.behat.org/
À 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.
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.
libCURL pourrait être utilisé pour créer quelque chose comme ça.
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.
.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é.
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.