Effettuare download da una pagina web

di il
2 risposte

Effettuare download da una pagina web

Salve a tutti,

devo automatizzare il download di file da due siti web esterni di cui non ho il codice sorgente che richiedono dei parametri input.

Per il primo sito fortunamente posso gestire i parametri inserendoli nell'url utilizzando questo codice:

public class getDownload {
	public static void main(String[] args) {
		String fileRemoto = "url";
		String fileLocale = "src/file.estensione";
		try {
			FileUtils.copyURLToFile(new URL(fileRemoto), new File(fileLocale), 20000, 20000);
		} catch (IOException ex) {
			System.out.println(ex.getMessage());
		}
	}
}


Per quanto riguarda il secondo sito invece in generale l'utente imposta i parametri è la pagina, a mio parere, invia una richiesta di tipo HTTP Post rendendo inutilizzabile il codice precedente.

Esistono qualche modo per poter fare il download in questa situazione.

Grazie a tutti.

2 Risposte

  • Re: Effettuare download da una pagina web

    neojava ha scritto:


    Per quanto riguarda il secondo sito invece in generale l'utente imposta i parametri è la pagina, a mio parere, invia una richiesta di tipo HTTP Post rendendo inutilizzabile il codice precedente.
    Se deve essere fatto un POST, allora FileUtils.copyURLToFile chiaramente non è usabile (fa solo un GET).
    Per fare una richiesta in POST a livello basilare basta usare le classi del package java.net (URL, URLConnection/HttpURLConnection ecc...).
    Verifica bene prima cosa è necessario fare, facendo tu il giro "a mano" da browser e tracciando le request/response tramite i developer tools del browser.
  • Re: Effettuare download da una pagina web

    Metto a disposizione la soluzione che ho trovato sia per richiesta di tipo post che get:
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.config.CookieSpecs;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    
    public class Downloader {
    
    	 static public void PostRequest(String url, int i) throws IOException, InterruptedException {
    		RequestConfig rc = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build();
    		CloseableHttpClient client = HttpClients.custom().setDefaultRequestConfig(rc).build();
    		HttpPost httpPost;
    	    	ArrayList<NameValuePair> postParameters;
    	    	httpPost = new HttpPost(url);
    	    	postParameters = new ArrayList<NameValuePair>();
    	    	postParameters.add(new BasicNameValuePair("param1Name", "param1Value"));
    	    	postParameters.add(new BasicNameValuePair("param2Name", "param2Value"));
    	    	httpPost.setEntity(new UrlEncodedFormEntity(postParameters, "UTF-8"));
    	    	CloseableHttpResponse response = client.execute(httpPost);    
    		HttpEntity entity = response.getEntity();
    		if (entity != null) {
    			if (response.getEntity().getContentType().getValue().trim().equals("valueOfContent-TypeExpeted")) {
    				String name = response.getFirstHeader("Content-Disposition").getValue();
    				String fileName = name.replaceFirst("(?i)^.*filename=\"([^\"]+)\".*$", "$1");
    				FileOutputStream fos = new FileOutputStream("src/" + fileName);
    				entity.writeTo(fos);
    				fos.close();
    				System.out.println("Download success!");
    			} else if (!response.getEntity().getContentType().getValue().trim().equals("valueOfContent-TypeExpeted") && i < 10) {
    				i++;
    				PostRequest(url, i);
    			} else if (!response.getEntity().getContentType().getValue().trim().equals("valueOfContent-TypeExpeted") && i == 10) {
    				System.out.println("Download failed!");
    			}
    		}
    		client.close();
    	}
    	
    	static public void GetRequest(String url, int i) throws IOException, InterruptedException {
    		RequestConfig rc = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build();
    		CloseableHttpClient client = HttpClients.custom().setDefaultRequestConfig(rc).build();
    		HttpGet httpGet = new HttpGet(url);
    		httpGet.setHeader("User-Agent", "User-Agent");
    		CloseableHttpResponse response = client.execute(httpGet);
    		HttpEntity entity = response.getEntity();
    		if (entity != null) {
    			if (response.getEntity().getContentType().getValue().trim().equals("valueOfContent-TypeExpeted")) {
    				String name = response.getFirstHeader("Content-Disposition").getValue();
    				String fileName = name.replaceFirst("(?i)^.*filename=\"([^\"]+)\".*$", "$1");
    				FileOutputStream fos = new FileOutputStream("src/" + fileName);
    				entity.writeTo(fos);
    				fos.close();
    				System.out.println("Download success!");
    			} else if (response.getEntity().getContentType().getValue().trim().equals("valueOfContent-TypeExpeted") && i < 10) {
    				i++;
    				GetRequest(url, i);
    			} else if (response.getEntity().getContentType().getValue().trim().equals("valueOfContent-TypeExpeted") && i == 10) {
    				System.out.println("Download failed!");
    			}
    		}
    		client.close();
    	}
    	
    	public static void main(String[] args) throws IOException, InterruptedException {
    		PostRequest("https://ResponseURL" , 1);
    		GetRequest("http://ResponseURL", 1);
    	}
    
    Il controllo del content-type è utile poichè se quest'ultimo non è del tipo che ci si aspetta il content-disposition è null e il programma va in crash.

    Nel mio caso i parametri da inserire nell'Arraylist<NameValuePair> della richiesta Post li ho trovati nella sezione "dati modulo" del developer tools.

    Affinchè funzioni servono i seguenti file jar:
    httpclient-4.5.6.jar
    httpcore-4.4.10.jar
    commons-codec-1.10.jar
    commons-logging-1.2.jar

    Il codice esegue 10 tentativi di download
Devi accedere o registrarti per scrivere nel forum
2 risposte