2009-09-09 162 views
7

下载使用IE文件我尝试使用IE下载文件与Python:从蟒蛇

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功能互动。

+0

我认为这是用户在首选项中定义的行为。 – rogeriopvl 2009-09-09 10:21:27

+0

我已经查看了http://msdn.microsoft.com/en-us/library/aa752084%28VS.85%29.aspx#和http://msdn.microsoft.com/en-us/library中的API /aa752085%28VS.85%29.aspx#,我不认为可以保存该文件。 – 2009-09-09 18:05:01

回答

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"); 
+1

这很好,谢谢! – infrared 2011-01-04 12:03:07

1

您不需要使用IE。您可以使用类似

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

更新:我看你已经更新了你的问题。如果你需要使用浏览器,那么显然这个答案不适合你。

进一步更新:当您单击由JavaScript生成的,如果检索到的网址是由JavaScript计算,只有按钮是按钮,然后你可以或许通过urllib2检索URL。另一方面,您可能还需要从已验证的会话中传递会话Cookie。

+0

他/她说:“我需要使用一些浏览器,而不是urllib或机械化,因为在下载文件之前,我需要通过许多Ajax的东西。” – 2009-09-09 10:25:17

+0

这不是原来的问题。 – 2009-09-09 10:29:48

+0

在我开始下载之前,我需要登录网站。然后点击一些将启动一些Java脚本的链接。脚本正在写入网站的内容(无需重新加载)。这个网站上,这使得可能创造新的按钮下载我的文件... 所以我不认为我可以使用urlib2 ... – Adam 2009-09-09 10:31:35

1

如果使用它的COM接口Internet Explorer,可以不用管,我建议使用AutoIt COM控制在Python的GUI。

+0

Autolt看起来不错。但我想写一个小应用程序,它只是获取这个文件并使用它的数据。我更喜欢一些小巧的智能解决方案...... – Adam 2009-09-09 10:44:18

4

我不知道如何很好地这样说,但是这听起来像是约在最近的记忆中最鲁莽的软件的想法。 Python比IE更有能力执行AJAX调用。

要访问数据,是的,你可以使用urlliburllib2。如果响应中有JSON数据,则存在json库;同样对于XML和HTML,还有BeautifulSoup

对于一个项目,我必须编写一个Python程序来模拟浏览器并登录到不同的社交网络(记住Friendster?Orkut?Cyber​​World?我会这样做),并将图像和文本上传到用户的帐户,甚至可以掌握CAPTCHA和复杂的JavaScript交互。纯Python使它(相对)更容易;正如你已经看到的,试图使用IE使它不可能。

+0

看起来像你从来没有经历过逆向工程ajax请求的一些第三方应用程序充满奇怪的dotnet'ajax'部件 - 纯粹地狱。 – 2010-12-30 20:42:53

+3

@Paulo - 你看过我的回答吗?是的,我写了20或30个垃圾邮件,需要100个AJAX或页面请求,这些垃圾邮件必须进行反向设计 - 这是我工作超过一年的很大一部分。正如我所说,它们并不容易,但与通过一个怪异的COM对象试图做到这一点相比呢?这就像试图挑选锁相比试图选择一个锁*戴烤箱手套*。 – Malvolio 2010-12-30 21:25:56

+0

[HttpFox](https://addons.mozilla.org/en-US/firefox/addon/6647/)可以很好地对这种事情进行反向工程。 – Brian 2011-01-03 18:33:51

0

我有类似的东西(有很多怪异的dotnet的“AJAX”控制一个可怕的第三部分应用程序),我用的iMacros插件的Firefox做一些自动化。但我正在做批量插入,而不是下载。

您可以尝试录制,编辑和重放通过VNC会话发送的输入。看看像http://code.google.com/p/python-vnc-viewer/这样的灵感。

+0

谢谢,我会看看它。 – Adam 2010-12-31 02:06:09

1

一个选项也可以嵌入您自己的浏览器。

这就是说,例如,可能通过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

pamie也许

P.A.M.I.E. - 代表Python的自动化模块 I.E.

Pamie的主要用途是用于测试的网站,通过它使用 Pamie脚本语言自动化 Internet Explorer客户端 网站。 PAMIE是 不是唱片播放引擎!

Pamie允许您自动化I.E.通过 通过COM操纵I.E.的文档对象 模型。此免费工具用于 质量保证工程师 和开发人员使用。

0

这绝对绝对是最后的办法我通常会这样做,但今天我确实不得不求助于做一些工作。我有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) 

但是男人,这太可怕了!