Automatiser les requêtes Web à l'aide de curl?

13

J'ai des systèmes "corporatifs" que je dois utiliser au travail. Certains d'entre eux sont terribles, avec des cadres, des pop-ups et autres.

Je pensais à automatiser certaines choses en utilisant curl ou quelque chose comme ça. J'ai besoin de me connecter, de cliquer sur des hyperliens, de définir des données et de les publier.

Est-il possible d'utiliser curl? Ou vais-je mieux utiliser quelque chose comme le sélénium?

Quelqu'un vous utilise toujours MS-DOS
la source
1
J'utiliserais zope.testbrowser de Python pour cela.
phunehehe
2
Devez-vous pouvoir utiliser Javascript?
intuition
2
L'utilisation d'une session consiste simplement à envoyer l'ID de session à chaque demande. Soit dans un cookie soit dans le paramètre GET. wgetet curlpeut utiliser le fichier de cookies Netscape, donc si votre navigateur en utilise également un, il suffit peut-être de le spécifier au téléchargeur. Alors, quel type de navigateur utilisez-vous?
manatwork
2
Pas de chance pour une solution simple avec ceux-là. Firefox et Chrome utilisent SQLite, Opera a un format de fichier de données binaires. Il semble que vous devrez rechercher l'ID de session et le transmettre manuellement au téléchargeur.
manatwork

Réponses:

13

Oui, c'est parfaitement possible avec curl. Le plus important sera d'enregistrer et de recharger les cookies entre les utilisations de curl avec --cookie-jar. Vous pouvez également publier des données de formulaire selon vos besoins. J'utilise généralement un module complémentaire Firefox appelé Live HTTP Headers pour capturer ce qui se passe lorsque je navigue sur un site Web. Il enregistrera tous les en-têtes, mais aussi tous les messages de formulaire, ce qui est très utile lorsque vous essayez de savoir quoi faire avec curl. J'ai écrit des scripts bash automatisant diverses invocations de boucles et utilise des canaux et des fichiers temporaires (avec la permission de mktemp) pour effectuer un traitement limité sur la page Web, mais si je dois faire beaucoup de traitement de page Web, je passe généralement en Perl avec LibWWW.

pingouin359
la source
En plus des en-têtes HTTP Firefox Live, Safari et Chrome peuvent afficher les en-têtes ventilés par objet dans l'inspecteur Web.
bahamat
15

Pour les cas simples de téléchargement du contenu d'une page, utilisez curl ou wget . Les deux sont des outils de ligne de commande conçus pour télécharger des fichiers via HTTP et disposent de nombreuses options. Dans votre cas, vous devrez probablement faire ressembler ces outils à un navigateur; La réponse de Lutzky et la réponse de Penguin359 mentionnent certaines options curl et wget qui sont utiles à cet égard.

Parfois, lorsque vous devez vous connecter , il est beaucoup plus facile de vous connecter d'abord manuellement dans un navigateur Web, puis d' exporter les cookies du navigateur Web (des extensions comme allcookies ou Export Cookies for Firefox peuvent vous aider).

Si vous devez analyser le contenu de certaines pages ou formulaires , vous aurez peut-être besoin d'outils plus sophistiqués que curl et wget. Quelques bons outils sont Perl avec LWP(libwww) et HTML::TreeBuilder(HTML-Tree) ou Python avec des bibliothèques standard (en particulier httplibethtmllib ).

Pour les interactions plus complexes avec un site Web, la référence est WWW :: Mechanize de Perl . Cette bibliothèque Perl définit des fonctions de haut niveau pour interagir avec un site Web comme le fait un navigateur Web, y compris le POSTing, les formulaires, les cookies, mais pas Javascript. Si Perl n'est pas votre tasse de thé, cette bibliothèque a des imitations avec des capacités similaires dans d'autres langages, tels que Python mechanize et Ruby Mechanize .

Enfin, lorsque vous avez besoin de Javascript , l'approche habituelle consiste à utiliser un navigateur Web piloté par un framework d'automatisation de navigateur. Le sélénium et le watir sont des choix populaires; voir aussi Y a-t-il de bons outils en plus de SeleniumRC qui peuvent récupérer des pages Web, y compris du contenu post-peint par JavaScript?

Gilles 'SO- arrête d'être méchant'
la source
6

Mon préféré est wget, donc je vais donner un exemple avec ça. Ce que vous voulez faire, c'est répliquer votre session de navigateur aussi près que possible, utilisez donc les arguments de ligne de commande appropriés. Celles qui sont nécessaires dépendent de la précision avec laquelle le site vérifie votre navigateur. --referer(sic) est généralement suffisant, mais vous pourriez également avoir besoin de --user-agentet --load-cookies.

Cette technique consiste essentiellement à usurper le navigateur - vous essayez de vous wgetprésenter au site en tant que navigateur. Le plus gros problème auquel vous serez confronté est CAPTCHA, qui n'est pas présent dans l'exemple de site que vous avez donné. Assurez-vous également de respecter les politiques de synchronisation du site (45 secondes dans ce cas), sinon vous serez probablement bloqué.

Il n'est probablement pas possible de télécharger le même fichier sur différentes sessions - le site accorde des privilèges de téléchargement sur le fichier spécifique à une session spécifique.

Lutzky
la source
Bonne réponse avec des considérations complètes. Merci
xiaohan2012