2014-09-10 2 views
17

herunterzuladen Ich habe mich mit PhantomJS/Selen/Python-Selen beschäftigt, um eine Datei in das Dateisystem herunterzuladen. Ich kann leicht durch das DOM navigieren und klicken, schweben usw. Herunterladen einer Datei erweist sich jedoch als ziemlich mühsam. Ich habe einen kopflosen Ansatz mit Firefox und pyvirtualdisplay versucht, aber das funktionierte auch nicht gut und war unglaublich langsam. Ich weiß, dass CasperJS Dateidownloads erlaubt. Kann jemand CasperJS mit Python integrieren oder PhantomJS verwenden, um Dateien herunterzuladen? Sehr geschätzt.Verwenden von Selen mit Python und PhantomJS, um Datei in das Dateisystem

Antwort

11

PhantomJS unterstützt derzeit keine Dateidownloads. Relevante Fragen mit Lösungen:

Soweit ich verstehe, Sie haben mindestens 3 Möglichkeiten:

  • Schalter auf casperjs (und Sie sollten Python verlassen hier)
  • versuchen mit kopflos auf xvfb
  • Schalter in den normalen Nicht-Headless Browser

Hier sind auch einige Links, die helfen könnten:

+5

Es scheint, Datei-Download-Fähigkeit ist seit dem zu PhantomJS hinzugefügt benutzen Sie (einschließlich Kommentare dazu in dem [Thread, den Sie verlinkt haben] (https://github.com/ariya/phantomjs/issues/10052)). Ich bin mir jedoch nicht sicher, ob dies in Selenium einfach zu handhaben ist. –

14

Trotz dieser Frage ist ziemlich alt, das Herunterladen von Dateien über PhantomJS ist immer noch ein Problem. Aber wir können PhantomJS verwenden, um Download-Link zu erhalten und alle benötigten Cookies wie csrf-Tokens usw. zu holen. Und dann können wir requests verwenden Sie es zum Download tatsächlich:

import requests 
from selenium import webdriver 

driver = webdriver.PhantomJS() 
driver.get('page_with_download_link') 
download_link = driver.find_element_by_id('download_link') 
session = requests.Session() 
cookies = driver.get_cookies() 

for cookie in cookies: 
    session.cookies.set(cookie['name'], cookie['value']) 
response = session.get(download_link) 

und jetzt in response.content tatsächlichen Dateiinhalt sollte angezeigt werden. Wir können es als nächstes mit open schreiben oder tun, was wir wollen.

3

Mein Anwendungsfall erforderte eine Formularübergabe, um die Datei abzurufen. Ich konnte dies mit der execute_async_script() Funktion des Treibers erreichen.

js = ''' 
    var callback = arguments[0]; 
    var theForm = document.forms['theFormId']; 
    data = new FormData(); 
    data.append('eventTarget', "''' + target + '''"); // this is the id of the file clicked 
    data.append('otherFormField', theForm.otherFormField.value); 

    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', theForm.action, true); 
''' 

for cookie in driver.get_cookies(): 
    js += ' xhr.setRequestHeader("' + cookie['name'] + '", "' + cookie['value'] + '"); ' 

js += ''' 
    xhr.onload = function() { 
     callback(this.responseText); 
    }; 
    xhr.send(data); 
''' 

driver.set_script_timeout(30) 
file = driver.execute_async_script(js) 
-1

Ist auf diese Weise nicht möglich. Sie können andere Alternativen verwenden, um Dateien wie wget o curl herunterzuladen.

Verwenden firefox die richtige Anfrage und Selen zu finden, die Werte für die und schließlich an die Box aus, die Datei herunterzuladen

curlCall=" curl 'http://www_sitex_org/descarga.jsf' -H '...allCurlRequest....' > file.xml" 
subprocess.call(curlCall, shell=True) 
Verwandte Themen