2011-01-23 3 views
3

Я пытаюсь извлечь некоторые данные из web site.HTTPclient POST с проблемным веб-сайтом

Я написал класс java, который, кажется, работает очень хорошо со многими сайтами, но он не работает с этим конкретным сайтом, который использует обширный javascript во входном fomr.

Как вы можете видеть из кода, я указал поля ввода, берущие имя из источника HTML, но, возможно, этот сайт не принимает запрос POST такого рода?

Как я могу имитировать взаимодействие с пользователем для получения сгенерированного HTML?

package com.transport.urlRetriver; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 

public class UrlRetriver { 


    String stationPoller (String url, ArrayList<NameValuePair> params) { 

     HttpPost postRequest; 
     HttpResponse response; 
     HttpEntity entity; 
     String result = null; 

     DefaultHttpClient httpClient = new DefaultHttpClient(); 


     try { 

      postRequest = new HttpPost(url); 

      postRequest.setEntity((HttpEntity) new UrlEncodedFormEntity(params)); 
      response = httpClient.execute(postRequest); 

      entity = response.getEntity(); 

      if(entity != null){ 
       InputStream inputStream = entity.getContent(); 
       result = convertStreamToString(inputStream); 
      } 



     } catch (Exception e) { 

      result = "We had a problem"; 

     } finally { 

      httpClient.getConnectionManager().shutdown(); 

     } 



     return result; 

    } 





    void ATMtravelPoller() { 




     ArrayList<NameValuePair> params = new ArrayList<NameValuePair>(2); 

     String url = "http://www.atm-mi.it/it/Pagine/default.aspx"; 

     params.add(new BasicNameValuePair("ctl00$SPWebPartManager1$g_afa5adbb_5b60_4e50_8da2_212a1d36e49c$txt_address_s", "Viale romagna 1")); 

     params.add(new BasicNameValuePair("ctl00$SPWebPartManager1$g_afa5adbb_5b60_4e50_8da2_212a1d36e49c$txt_address_e", "Viale Toscana 20")); 

     params.add(new BasicNameValuePair("sf_method", "POST")); 

     String result = stationPoller(url, params); 

     saveToFile(result, "/home/rachele/Documents/atm/out4.html"); 

    } 

    static void saveToFile(String toFile, String pos){ 
      try{ 
       // Create file 
       FileWriter fstream = new FileWriter(pos); 
       BufferedWriter out = new BufferedWriter(fstream); 
       out.write(toFile); 
       //Close the output stream 
       out.close(); 
       }catch (Exception e){//Catch exception if any 
        System.err.println("Error: " + e.getMessage()); 
       } 
       } 

    private static String convertStreamToString(InputStream is) { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
      StringBuilder stringBuilder = new StringBuilder(); 

      String line = null; 
      try { 
      while ((line = reader.readLine()) != null) { 
       stringBuilder.append(line + "\n"); 
      } 
      } catch (IOException e) { 
      e.printStackTrace(); 
      } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      } 
      return stringBuilder.toString(); 
     } 

} 
+1

Это не ответ, а описание того, что происходит. Вам нужно подать 30 параметров, и некоторые имена/значения параметров динамически генерируются, чтобы предотвратить получение контента по сценарию или программе. Вы жестко закодировали имена параметров, которые меняются каждый раз, когда вы получаете контент. Эти параметры не будут одинаковыми. – gigadot

+2

не ответ на ваш JavaScript-объект (отсюда комментарий), но ... Обратите внимание, что для многих сайтов вам нужно подделать ваш «пользовательский агент» с Java, иначе вы не получите реальный сайт. Был там, сделал это, вы ** должны ** подделывать пользовательский агент;) – SyntaxT3rr0r

+1

Для этого веб-сайта ничем не отличается, отправляете ли вы пользовательский агент или нет. Я тестировал его, отфильтровывая заголовок пользовательского агента из моего firefox, и результаты не отличаются. – gigadot

ответ

1

На мой взгляд, может быть поле сгенерированное javascript с динамическим значением, предотвращающим автоматическое сканирование сайта. Отправьте конкретный сайт, который хотите загрузить.

+0

Я уже вставлял его в исходное описание: http://www.atm-mi.it/en/Pages/default.aspx – Mascarpone

+1

Как писал выше, gigadot, вы должны сделать запрос GET, чтобы получить скрытые поля (как я могу видеть __REQUESTDIGEST создает проблему), а затем выполните запрос POST. В общем действуют как пользователь в браузере. –

Смежные вопросы