使用Python通过IE下载文件
我正在尝试用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强多了。
要访问数据,没错,你可以使用urllib
和urllib2
。如果响应中有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");