使用Python通过IE下载文件

8 投票
8 回答
11164 浏览
提问于 2025-04-15 14:11

我正在尝试用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或mechanize,因为在下载文件之前,我需要和一些ajax功能进行交互

8 个回答

3

也许可以试试pamie

P.A.M.I.E. 是“Python 自动化模块,用于 Internet Explorer”的缩写。

Pamie 的主要用途是通过自动化 Internet Explorer 客户端来测试网站,使用的是 Pamie 脚本语言。请注意,PAMIE 不是一个录制和播放的工具!

Pamie 让你可以通过 COM 操作 Internet Explorer 的文档对象模型,从而实现自动化。这是一个免费的工具,适合质量保证工程师和开发人员使用。

4

我不知道怎么说比较好,但这听起来像是最近最愚蠢的软件想法。Python在进行AJAX调用方面比IE强多了。

要访问数据,没错,你可以使用urlliburllib2。如果响应中有JSON数据,可以用json库;如果是XML或HTML数据,可以用BeautifulSoup

在一个项目中,我需要写一个Python程序,模拟浏览器登录20个不同的社交网络(还记得Friendster吗?Orkut?CyberWorld?我记得),并将图片和文本上传到用户的账户,甚至能处理验证码和复杂的JavaScript交互。用纯Python来做这件事(相对来说)比较简单;正如你已经看到的,试图用IE来做就几乎不可能。

11

只要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");

撰写回答