Загрузка файла с помощью IE из python

Я пытаюсь загрузить файл с Python, используя 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')

после этого, я получаю окно с запросом пользователя, где сохранить файл. Как сохранить этот файл автоматически из python?

Мне нужно использовать некоторые браузер, не urllib или механизировать, потому что перед загрузкой файла мне нужно взаимодействовать с некоторыми функциями ajax.

8 ответов


это работает для меня, пока диалоги IE находятся на переднем плане, и загруженный файл еще не существует в каталоге "Сохранить как":

import time
import threading
import win32ui, win32gui, win32com, pythoncom, win32con
from win32com.client import Dispatch

class IeThread(threading.Thread):
    def run(self):
        pythoncom.CoInitialize()
        ie = Dispatch("InternetExplorer.Application")
        ie.Visible = 0
        ie.Navigate('http://website/file.xml')

def PushButton(handle, label):
    if win32gui.GetWindowText(handle) == label:
        win32gui.SendMessage(handle, win32con.BM_CLICK, None, None)
        return True

IeThread().start()
time.sleep(3)  # wait until IE is started
wnd = win32ui.GetForegroundWindow()
if wnd.GetWindowText() == "File Download - Security Warning":
    win32gui.EnumChildWindows(wnd.GetSafeHwnd(), PushButton, "&Save");
    time.sleep(1)
    wnd = win32ui.GetForegroundWindow()
if wnd.GetWindowText() == "Save As":
    win32gui.EnumChildWindows(wnd.GetSafeHwnd(), PushButton, "&Save");

Я не знаю, как сказать это красиво, но это звучит как самая безрассудная идея программного обеспечения в недавней памяти. Python гораздо более способен выполнять вызовы AJAX, чем IE.

доступ к данным, Да, вы can использовать urllib и urllib2 . Если в ответе есть данные JSON, есть json библиотека; аналогично для XML и HTML, есть BeautifulSoup.

для одного проекта мне пришлось написать программу Python, которая имитировала бы браузер и войдите в любой из 20 различные социальные сети (Помните Friendster? Оркут? Кибермир? Я делаю), и загружать изображения и текст в учетную запись пользователя, даже захватывая CAPTCHAs и сложные взаимодействия JavaScript. Чистый Python делает это (сравнительно) легко; как вы уже видели, попытка использовать IE делает это невозможным.


pamie возможно

П. А. М. И. Е. - стенды для Python Автоматизированный Модуль Для И. Е.

основное использование Pamie для тестирования web сайты с помощью которых можно автоматизировать Клиент Internet Explorer с помощью Пэмми язык сценариев. Пэмми это не двигатель воспроизведения записи!

Pamie позволяет автоматизировать I. E. манипулируя объект документа И. Е. Модель через COM. Этот бесплатный инструмент предназначен для использование по обеспечению качества Инженерные кадры и разработчики.


Если вы не можете управлять Internet Explorer с помощью его com-интерфейса, я предлагаю использовать AutoIt COM для управления своим GUI от Python.


вам не нужно использовать IE. Вы можете использовать что-то вроде

import urllib2
data = urllib2.urlopen("http://website/file.xml").read()

обновление: Я вижу вы обновили свой вопрос. Если вам нужно использовать браузер, то этот ответ явно не подходит для вас.

уточнения: при нажатии на кнопку, которая генерируется JavaScript, если url извлекается не вычисляется JavaScript, и только кнопка, то вы можете получить этот URL через urllib2. На с другой стороны, вам также может потребоваться передать cookie сеанса из вашего аутентифицированного сеанса.


один из вариантов также может быть встроить свой собственный браузер.

это, например, возможно с Qt через PyQt (GPL) или PySide (LGPL). Там вы можете встроить движок WebKit. Затем вы можете либо отобразить страницу QWebView и позвольте пользователю перейти к загрузке и фильтровать это событие или использовать простой QWebPage где все может быть автоматизировано, и ничто не должно быть вообще.

и WebKit должно быть достаточно сильным, чтобы сделать все, что вы хотите.

очень простой пример:

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_())

У меня есть что-то вроде этого (ужасное приложение 3-й части с большим количеством странных элементов управления dotnet "ajax"), и я использую плагин iMacros для Firefox для автоматизации. Но я делаю пакетные вставки, а не загрузки.

вы можете попробовать записать, отредактировать и воспроизвести входные данные, отправленные через сеанс VNC. Смотреть на что-то вроде http://code.google.com/p/python-vnc-viewer/ для вдохновения.


Это определенно абсолютно последний способ, которым я обычно это делаю, но сегодня мне пришлось прибегнуть к стучать, чтобы что-то работало. У меня есть IE 10, поэтому ответ @cgohlke не будет работать (без текста окна). Все попытки получить правильную версию работы проверки подлинности клиента были неудачными, поэтому пришлось вернуться к этому. Может быть, это поможет кому-то еще, кто так же на пределе своих возможностей.

import IEC
import pywinauto
import win32.com

# Creates a new IE Window
ie = IEC.IEController(window_num=0)

# Register application as an app for pywinauto
shell = win32com.client.Dispatch("WScript.Shell")
pwa_app = pywinauto.application.Application()
w_handle = pywinauto.findwindows.find_windows(title=u'<Title of the site - find it using SWAPY>', class_name='IEFrame')[0]
window = pwa_app.window_(handle=w_handle)
window.SetFocus()

# Click on the download link
ie.ClickLink(<download link>)

# Get the handle of the Open Save Cancel dialog
ctrl = window['2']

# You may need to adjust the coords here to make sure you hit the button you want
ctrl.ClickInput(button='left', coords=(495, 55), double=False, wheel_dist=0)