8
votes

Télécharger le fichier en utilisant IE de Python

J'essaie de télécharger le fichier avec Python en utilisant IE:

from win32com.client import DispatchWithEvents

class EventHandler(object):
    def OnDownloadBegin(self):
        pass

ie = DispatchWithEvents("InternetExplorer.Application", EventHandler)

ie.Visible = 0

ie.Navigate('http://website/file.xml')


2 commentaires

Je crois que c'est un comportement défini par l'utilisateur dans les préférences.


J'ai regardé les API de MSDN.MicRosoft. Com / FR-US / Bibliothèque / AA752084% 28V.85% 29.aspx # et msdn.microsoft.com/en-us/library/aa752085%28vs.85%29.aspx# et je ne pense pas qu'il soit possible de sauvegarder le fichier .


8 Réponses :


1
votes

Vous n'avez pas besoin d'utiliser IE. Vous pouvez utiliser quelque chose comme xxx

update: Je vois que vous avez mis à jour votre question. Si vous avez besoin d'utiliser un navigateur, alors cette réponse ne vous convient pas.

Mise à jour supplémentaire: Lorsque vous cliquez sur le bouton généré par JavaScript, si l'URL récupéré est pas calculé par le JavaScript, et seul le bouton est, vous pouvez peut-être récupérer cette URL via urllib2 . D'autre part, vous devrez peut-être également passer un cookie de session de votre session authentifiée.


6 commentaires

Il / elle a dit "Je dois utiliser un navigateur, pas l'urlication ou la mécanisée, car avant de télécharger le fichier, j'ai besoin de passer de nombreuses choses Ajax."


Ce n'était pas dans la question initiale.


Avant de commencer à télécharger, j'ai besoin de vous connecter sur le site Web. Ensuite, cliquez sur certains liens qui démarreront des scripts Java. Les scripts écrivent du contenu du site Web (sans recharger). Ceci crée un nouveau bouton sur le site Web qui permet de télécharger mon fichier ... Donc je ne pense pas que je puisse utiliser urlib2 ...


Malheureusement, "bouton" est: Exporter sélectionné


@Adam: Vous pouvez utiliser Urllib, mais cela signifie inspecter et inverser l'ingénierie des appels JavaScript et Ajax. En plus d'être douloureux, il est fragile: si le site change vos pauses d'applications. Envisagez de demander au propriétaire du site de fournir une interface alternative mieux adaptée à l'automatisation (comme WebServices), si cela n'est pas possible, bonne chance!


Merci Paulo. Je ne travaille plus sur cela. Les choses Ajax m'ont tué. ;) Mais qui sait. Peut-être que je vais revenir. :)



1
votes

Si vous ne pouvez pas contrôler Internet Explorer à l'aide de son interface COM, je suggère d'utiliser le AutoIt Com pour contrôler son interface graphique de Python.


1 commentaires

Autolt a l'air agréable. Mais je veux écrire une petite application qui vient d'obtenir ce fichier et d'utiliser des données de celui-ci. Je préfère une petite solution intelligente ...



4
votes

Je ne sais pas comment dire cela bien, mais cela ressemble à l'idée logicielle la plus impraticable dans la mémoire récente. Python est beaucoup plus capable d'effectuer des appels Ajax que c'est-à-dire.

Pour accéder aux données, oui, vous pouvez utiliser utiliser urllib et urllib2 . S'il y a des données JSON dans la réponse, il y a la bibliothèque JSON ; De même pour XML et HTML, il y a beauxoup .

Pour un projet, je devais écrire un programme Python qui simulerait un navigateur et se connecterait à l'un des différents réseaux sociaux 20 (rappelez-vous entre amis? Orkut? Cyberworld? Je fais) et téléchargez des images et texte dans le compte de l'utilisateur, même saisir les captchas et les interactions javascript complexes. Python pur le rend (relativement) facile; Comme vous l'avez déjà vu, essayez d'utiliser IE le rend impossible.


5 commentaires

On dirait que vous n'avez jamais expérimenté les demandes d'ingénierie inverse des demandes d'Ajax pour une certaine application de 3ème partie remplie de widgets bizarres «Ajax» - Pure Hell.


@Paulo - Avez-vous lu ma réponse? Oui, j'ai écrit 20 ou 30 racleurs, entraînant peut-être 100 demandes d'Ajax ou de page qui devaient être modifiées inverse - une grande partie de mon travail depuis plus d'un an. Comme je l'ai dit, ils ne sont pas faciles, comme je l'ai dit, mais par rapport à la tentative de le faire à travers un objet COM de Freakin '? C'est comme essayer de choisir un verrou par rapport à essayer de choisir un verrou portant des mitaines de four .


httpfox est bon pour inverser-ingénierie de ce genre de chose.


Merci. J'utilise Firebug, où l'option Net semble être assez équivalente à httpfox, mais à chacune ses siennes.


Salut. Si vous pouvez du tout, oui, allez avec des routines réseau Pythons. Mais considérez mon cas - nous utilisons un proxy qui est authentifié avec NTLM. Pour une raison quelconque, je ne peux pas obtenir de demandes_ntlm de travailler avec Py2exe - du tout. Je dois trouver autre chose, essayant de trouver une solution de contournement maintenant. Ce rant était juste de dire, il y a des cas de bord ... :)



0
votes

J'ai quelque chose comme ça (une affrontement de la 3ème partie avec beaucoup de contrôles bizarres «Ajax»), et j'utilise Imacros Plugin pour Firefox pour effectuer une certaine automatisation. Mais je fais des inserts par lots, pas des téléchargements.

Vous pouvez essayer d'enregistrer, éditer et rejouer les entrées envoyées par une session VNC. Regardez quelque chose comme http://code.google.com/p/python-vnc- Viewer / pour l'inspiration.


0 commentaires

1
votes

Une option pourrait également être d'intégrer votre propre navigateur.

c'est par exemple possible avec qt via pyqt (gpl) ou Pyside (LGPL). Là, vous pouvez intégrer le moteur Webkit. Vous pouvez ensuite afficher la page dans un QwebView et laissez l'utilisateur à naviguer à votre Téléchargez et filtrez ce événement ou utilisez un simple Qwebpage où tout pourrait être automatisé et rien doit être montré du tout. p>

et Webkit devrait être suffisamment puissant pour Faites tout ce que vous voulez. p>

Exemple très basique: P>

import sys

from PySide import QtCore, QtGui, QtWebKit

url = 'http://developer.qt.nokia.com/wiki/PySideDownloads/'

class TestKit(QtCore.QObject):
    def __init__(self, app):
        self.page = QtWebKit.QWebPage()
        self.page.loadFinished.connect(self.finished)
        self.page.mainFrame().load(QtCore.QUrl(url))
        self.app = app

    def finished(self, evt):
        # inspect DOM -> navigate to next page or download
        print self.page.currentFrame().documentElement().toInnerXml().encode(
                'utf-8')
        # when everything is done
        self.app.quit()


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    t = TestKit(app)
    sys.exit(app.exec_())


0 commentaires

3
votes

pamie peut-être

p.a.m.i.e. - Stands pour Python Module automatisé pour I.e.

L'utilisation principale de Pamie est pour tester Web sites par lesquels vous automatisez le Client Internet Explorer utilisant le Langue de script Pamie. Pamie est Pas un moteur de lecture d'enregistrement!

pamie vous permet d'automatiser i.e. par Manipuler l'objet de document I.e. Modèle via com. Cet outil gratuit est pour Utiliser par ingénieurs d'assurance qualité et développeurs.


0 commentaires

10
votes

Cela fonctionne pour moi tant que les dialogues IE sont au premier plan et que le fichier téléchargé n'existe pas déjà dans le répertoire "Enregistrer sous": xxx


0 commentaires

0
votes

C'est certainement absolument la dernière façon dont je le ferais normalement, mais aujourd'hui, je devais recourir à la frapper pour avoir quelque chose de travail. J'ai 10 ans, la réponse de @ cgohlke ne fonctionnera pas (pas de texte de fenêtre). Toutes les tentatives d'obtention d'une version appropriée de l'authentification de la clientèle ont échoué, il a fallu de retour à ce sujet. Peut-être que ça va aider quelqu'un d'autre qui est également à la fin de leur attache. XXX

mais homme, est-ce horrible!


0 commentaires