2013-05-02 12 views
7

Tutto è nel titolo!Definisci directory di download per il selenio chromedriver con python

C'è un modo per definire la directory di download per selenio-cromato utilizzato con python?

Nonostante molte ricerche, non ho trovato nulla di conclusivo ... Come novizio, ho visto molte cose su "the desired_capabilities" o "the options" per Chromedriver ma nulla ha risolto il mio problema. .. (e ancora non so se lo farà!)

Per spiegare un po 'di più il mio problema: Ho un sacco di url per la scansione (200 000) e per ogni url un file da scaricare. Devo creare una tabella con l'url, le informazioni che ho scartato su di essa, e il nome del file che ho appena scaricato per ogni pagina web. Con il volume che devo trattare, ho creato thread che aprono più istanze di chromedriver per accelerare il trattamento. Il problema è che ogni file scaricato arriva nella stessa directory predefinita e non sono più in grado di collegare un file a un URL ... Quindi, l'idea è di creare una directory di download per ogni thread per gestirli uno da uno.

Se qualcuno ha la risposta alla mia domanda nel titolo O una soluzione per identificare il file scaricato e collegarlo con l'url corrente, sarò grato!

+0

In generale vorrei suggerire di non scaricare le cose usando Chrome, di solito è un test mal congegnata che appena scaricato tutto in una cartella statica. Stai facendo qualcosa con i file scaricati? Leggi questo: http://ardesco.lazerycode.com/index.php/2012/07/how-to-download-files-with-selenium-and-why-you-shouldnt/ e poi questo http://www.blog.pythonlibrary.org/2012/06/07/python-101-how-to-download-a-file/ – Ardesco

+0

hi Ciao e grazie per la risposta. In realtà non utilizzo Selenium per eseguire test ma davvero per automatizzare enormi download di file csv di dati per il post trattamento. Ho provato ad esplorare il modo urllib2, ma ho incontrato difficoltà difficili per l'autenticazione sul sito ... (probabilmente perché sono un novizio del fai-da-te della domenica e il selenio è stato l'oca dell'uovo d'oro quando l'ho trovato! ...) – matlabat

risposta

1

Per chromedriver1 creare un nuovo profilo e all'interno di tale profilo impostare download.default_directory nella posizione desiderata e impostare questo profilo per chrome utilizzando chrome.profile. Il pacchetto selenium-chromedriver dovrebbe avere alcuni metodi per creare nuovi profili (almeno lo fa con ruby), in quanto hanno bisogno di un trattamento speciale.

Chromedriver2 non supporta l'impostazione del profilo. È possibile impostare le preferenze con esso. Se si desidera impostare la directory di download questo è come lo fate:

prefs: { download: { default_directory: "/tmp" } } 

Il rubino selenio WebDriver non supporta ancora questa caratteristica, la variante pitone potrebbe fare comunque.

1

Ho affrontato di recente lo stesso problema. Ho provato un sacco di soluzioni trovate in Internet, nessuno ha aiutato. Così alla fine sono arrivato a questo:

  • lancio cromato con user-data-dir vuota (cartella in/tmp) per permettere al cromo inizializzare lo
  • Quit cromo
  • Modifica default/Preferenze nel nuovo utente -data-dir, aggiungere quei campi per l'oggetto principale (solo un esempio):

    "download": { "default_directory": "/tmp/tmpX7EADC.downloads", "directory_upgrade": true}

  • lancio Chrome di nuovo con lo stesso utente-data-dir

Ora funziona bene.

Un altro consiglio: se non si conosce il nome del file che verrà scaricato, creare uno snapshot (elenco di file) della directory di download, quindi scaricare il file e trovare il suo nome confrontando l'istantanea e l'elenco corrente di file nella directory dei download.

+0

se hai bisogno di una sorta di pseudo codice Python per il problema, fammi sapere. –

0

Si prega di provare il codice qui sotto ....

System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver"); 
String downloadFilepath = "/path/to/download"; 
HashMap<String, Object> chromePrefs = new HashMap<String, Object>(); 
chromePrefs.put("profile.default_content_settings.popups", 0); 
chromePrefs.put("download.default_directory", downloadFilepath); 
ChromeOptions options = new ChromeOptions(); 
HashMap<String, Object> chromeOptionsMap = new HashMap<String, Object>(); 
options.setExperimentalOptions("prefs", chromePrefs); 
options.addArguments("--test-type"); 
DesiredCapabilities cap = DesiredCapabilities.chrome(); 
cap.setCapability(ChromeOptions.CAPABILITY, chromeOptionsMap); 
cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); 
cap.setCapability(ChromeOptions.CAPABILITY, options); 
WebDriver driver = new ChromeDriver(cap); 
+1

'C#' risposta per una domanda 'Python'? – DeepSpace

Problemi correlati