2014-09-10 9 views
17

Zmagam się z użyciem PhantomJS/Selenium/python-selenium, aby pobrać plik do systemu plików. Jestem w stanie łatwo poruszać się po DOM i klikać, najeżdżać itp. Pobieranie pliku okazuje się jednak dość kłopotliwe. Próbowałem bezgłowego podejścia z Firefoxem i pyvirtualdisplay, ale to też nie działało dobrze i było niewiarygodnie powolne. Wiem, że CasperJS pozwala na pobieranie plików. Czy ktoś wie jak zintegrować CasperJS z Pythonem lub jak wykorzystać PhantomJS do pobierania plików? Bardzo doceniane.Używanie Selenium z Pythonem i PhantomJS do pobrania pliku do systemu plików

Odpowiedz

11

PhantomJS obecnie nie obsługuje pobierania plików. Istotne problemy z obejścia:

O ile mi zrozumieć, trzeba co najmniej 3 opcje:

  • przełączyć się casperjs (i należy pozostawić Pythona tutaj)
  • spróbuj bez głowy na xvfb
  • przełącznik do normalnych przeglądarek nie bezgłowe

Oto również kilka linków, które mogą pomóc też:

+5

Wydaje możliwość pobierania plików został już dodany do PhantomJS (w tym komentarze do tego efektu w [wątku, z którym jesteś połączony] (https://github.com/ariya/phantomjs/issues/10052)). Jednak nie jestem pewien, czy jest to w łatwy sposób widoczne w Selenium. –

14

Mimo to pytanie jest dość stare, pobieranie plików przez PhantomJS nadal stanowi problem. Ale możemy użyć PhantomJS, aby uzyskać łącze pobierania i pobrać wszystkie potrzebne pliki cookie, takie jak tokeny csrf i tak dalej. A potem możemy użyć requests go pobrać rzeczywiście: powinien pojawić

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) 

i teraz w response.content rzeczywista zawartość pliku. Możemy następnie napisać to przy pomocy open lub zrobić, co chcemy.

3

Mój przypadek użycia wymagał przesłania formularza w celu pobrania pliku. Udało mi się to osiągnąć, korzystając z funkcji sterownika kierowcy execute_async_script().

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

Nie można tego zrobić w ten sposób. Możesz użyć innych alternatyw, aby pobierać pliki, takie jak wget o curl.

Zastosowanie firefox znaleźć odpowiedni wniosek i selen, aby uzyskać wartości, które i wreszcie korzystać z do pudełka, aby pobrać plik

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