2009-09-09 51 views
7

Tôi đang cố gắng để tải về tập tin với Python sử dụng IE:Tải tập tin sử dụng IE từ 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') 

Sau đó, tôi nhận được một cửa sổ yêu cầu người dùng nơi để lưu các tập tin. Làm thế nào tôi có thể lưu tập tin này tự động từ python?

tôi cần phải sử dụng một số trình duyệt, không urllib hoặc cơ giới hóa, vì trước khi tải về tập tin tôi cần phải tương tác với một số chức năng ajax.

+0

Tôi tin rằng đó là hành vi do người dùng xác định trong tùy chọn. – rogeriopvl

+0

Tôi đã xem xét các API từ http://msdn.microsoft.com/en-us/library/aa752084%28VS.85%29.aspx# và http://msdn.microsoft.com/en-us/library /aa752085%28VS.85%29.aspx# và tôi không nghĩ rằng có thể lưu tệp. –

Trả lời

8

này làm việc cho tôi chừng nào các hộp thoại IE là ở mặt trước và các tập tin tải về không tồn tại trong "Save As" thư mục:

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

Điều này hoạt động tuyệt vời, cảm ơn! – infrared

1

Bạn không cần sử dụng IE. Bạn có thể sử dụng giống như

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

Cập nhật: Tôi thấy bạn đã cập nhật câu hỏi của bạn. Nếu bạn cần sử dụng trình duyệt, thì rõ ràng câu trả lời này không phù hợp với bạn.

cập nhật thêm: Khi bạn nhấp vào nút đó được tạo ra bởi JavaScript, nếu URL lấy ra là không tính bằng JavaScript, và chỉ vào nút, sau đó bạn có thể có lẽ lấy URL mà qua urllib2. Mặt khác, bạn cũng có thể cần phải chuyển cookie phiên từ phiên được xác thực của bạn.

+0

Anh ấy/cô ấy nói "Tôi cần sử dụng một số trình duyệt, không phải urllib hoặc cơ giới hóa, bởi vì trước khi tải xuống tệp, tôi cần phải chuyển nhiều thứ ajax." –

+0

Đó không phải là câu hỏi ban đầu. –

+0

Trước khi tôi bắt đầu tải xuống, tôi cần phải đăng nhập trên trang web. Sau đó nhấp vào một số liên kết sẽ bắt đầu một số tập lệnh java. Các tập lệnh viết nội dung của trang web (không tải lại). Đây tạo nút mới trên trang web mà làm cho khả năng tải tập tin của tôi ... Vì vậy, tôi không nghĩ rằng tôi có thể sử dụng urlib2 ... – Adam

1

Nếu bạn không thể kiểm soát Internet Explorer bằng giao diện COM, tôi khuyên bạn nên sử dụng AutoIt COM để điều khiển GUI của nó từ Python.

+0

Tự động nhìn đẹp. Nhưng tôi muốn viết một ứng dụng nhỏ chỉ nhận tệp này và sử dụng dữ liệu từ nó. Tôi thích một số giải pháp thông minh nhỏ ... – Adam

4

Tôi không biết làm thế nào để nói điều này độc đáo, nhưng điều này nghe có vẻ như về ý tưởng phần mềm ngu ngốc nhất trong bộ nhớ gần đây. Python có khả năng thực hiện các cuộc gọi AJAX nhiều hơn IE.

Để truy cập dữ liệu, có, bạn có thể sử dụng urlliburllib2. Nếu có dữ liệu JSON trong phản hồi, có thư viện json; tương tự như vậy đối với XML và HTML, có BeautifulSoup.

Đối với một dự án, tôi phải viết chương trình Python mô phỏng trình duyệt và đăng nhập vào bất kỳ mạng nào khác (nhớ Friendster? Orkut? CyberWorld? Tôi làm) và tải hình ảnh và văn bản lên tài khoản của người dùng, thậm chí nắm bắt CAPTCHA và các tương tác JavaScript phức tạp. Pure Python làm cho nó (tương đối) dễ dàng; như bạn đã thấy, cố gắng sử dụng IE làm cho nó không thể.

+0

có vẻ như bạn không bao giờ có kinh nghiệm yêu cầu kỹ thuật đảo ngược ajax cho một số ứng dụng phần 3 đầy đủ các vật dụng 'ajax' dotnet kỳ lạ - địa ngục thuần túy. –

+3

@Paulo - bạn đã đọc câu trả lời của tôi chưa?Có, tôi đã viết 20 hoặc 30 trình chọc ghẹo, có thể có tới 100 yêu cầu AJAX hoặc trang phải được thiết kế ngược - một phần quan trọng trong công việc của tôi trong hơn một năm. Họ không dễ, như tôi đã nói, nhưng so với cố gắng làm điều đó thông qua một đối tượng COM 'kỳ quái'? Điều đó giống như cố gắng để chọn một khóa so với cố gắng để chọn một khóa * mặc găng tay lò *. – Malvolio

+0

[HttpFox] (https://addons.mozilla.org/en-US/firefox/addon/6647/) là tốt cho kỹ thuật đảo ngược loại điều này. – Brian

0

Tôi có một cái gì đó như thế (một ứng dụng phần 3 khủng khiếp với rất nhiều điều khiển 'ajax' lạ) và tôi sử dụng plugin iMacros cho Firefox để thực hiện tự động hóa. Nhưng tôi đang thực hiện chèn hàng loạt chứ không phải tải xuống.

Bạn có thể thử ghi, chỉnh sửa và phát lại các yếu tố đầu vào được gửi qua phiên VNC. Nhìn vào thứ gì đó như http://code.google.com/p/python-vnc-viewer/ để lấy cảm hứng.

+0

Cảm ơn, tôi sẽ xem xét nó. – Adam

1

Một tùy chọn cũng có thể là nhúng trình duyệt của riêng bạn.

Thats ví dụ: có thể với Qt qua PyQt (GPL) hoặc PySide (LGPL). Ở đó bạn có thể nhúng công cụ WebKit. Sau đó, bạn có thể hiển thị trang trong một số QWebView và để người dùng điều hướng đến nội dung tải xuống của bạn và lọc sự kiện đó hoặc sử dụng đơn giản QWebPage nơi mọi thứ có thể được tự động hóa và không có gì phải được hiển thị.

WebKit phải đủ mạnh để làm bất cứ điều gì bạn muốn.

dụ Rất cơ bản:

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 lẽ

P.A.M.I.E. - là viết tắt của Python Mô-đun tự động cho I.E.

Việc sử dụng chính của Pamie là để thử nghiệm trang web các trang web mà bạn tự động hóa ứng dụng khách Internet Explorer bằng cách sử dụng ngôn ngữ kịch bản Pamie . PAMIE là không phải là công cụ phát lại bản ghi!

Pamie cho phép bạn tự động hóa I.E. by thao tác đối tượng tài liệu I.E. Mô hình qua COM. Công cụ miễn phí này dành cho sử dụng bởi các kỹ sư đảm bảo chất lượng và nhà phát triển.

0

này chắc chắn là hoàn toàn cách cuối cùng Tôi thường làm điều này nhưng hôm nay tôi đã phải nghỉ mát để đập đi để có được một cái gì đó làm việc. Tôi có IE 10 vì vậy câu trả lời của @ cgohlke sẽ không hoạt động (không có văn bản cửa sổ). Tất cả các nỗ lực để có được một phiên bản thích hợp của khách hàng xác thực làm việc đã thất bại vì vậy đã phải rơi trở lại về điều này. Có lẽ nó sẽ giúp người khác bằng nhau vào cuối thời gian của họ.

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) 

Nhưng con người, thật kinh khủng!

Các vấn đề liên quan