2011-01-23 35 views
3

我试图从web site retrive一些数据。HTTPclient POST与有问题的网站

我写了一个java类,它似乎很多网站工作得很好,但它不适用于这个特殊的网站,它使用广泛的JavaScript在输入法。

正如您从代码中所看到的那样,我指定了从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请求。一般在浏览器中像用户一样行事。 –