Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有问题网站的HTTPclient帖子_Java_Javascript_Httpclient - Fatal编程技术网

Java 带有问题网站的HTTPclient帖子

Java 带有问题网站的HTTPclient帖子,java,javascript,httpclient,Java,Javascript,Httpclient,我正试图从一个数据库中检索一些数据 我编写了一个java类,它似乎可以很好地用于许多站点,但它不适用于这个特定的站点,该站点在输入fomr中使用了大量javascript 正如您从代码中看到的,我指定的输入字段采用HTML源代码中的名称,但是这个网站可能不接受这种POST请求 如何模拟用户交互来检索生成的HTML package com.transport.urlRetriver; import java.io.BufferedReader; import java.io.BufferedWr

我正试图从一个数据库中检索一些数据

我编写了一个java类,它似乎可以很好地用于许多站点,但它不适用于这个特定的站点,该站点在输入fomr中使用了大量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();
        }

}
package com.transport.urlRetriver;
导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.util.ArrayList;
导入org.apache.http.HttpEntity;
导入org.apache.http.HttpResponse;
导入org.apache.http.NameValuePair;
导入org.apache.http.client.entity.UrlEncodedFormEntity;
导入org.apache.http.client.methods.HttpPost;
导入org.apache.http.impl.client.DefaultHttpClient;
导入org.apache.http.message.BasicNameValuePair;
公共类检索器{
String stationPoller(字符串url、ArrayList参数){
HttpPost请求;
HttpResponse响应;
http实体;
字符串结果=null;
DefaultHttpClient httpClient=新的DefaultHttpClient();
试一试{
postRequest=新的HttpPost(url);
setEntity((HttpEntity)新的UrlEncodedFormEntity(params));
response=httpClient.execute(postRequest);
entity=response.getEntity();
如果(实体!=null){
InputStream InputStream=entity.getContent();
结果=convertStreamToString(inputStream);
}
}捕获(例外e){
结果=“我们遇到了问题”;
}最后{
httpClient.getConnectionManager().shutdown();
}
返回结果;
}
在mtravelpoller()上无效{
ArrayList参数=新的ArrayList(2);
字符串url=”http://www.atm-mi.it/it/Pagine/default.aspx";
参数添加(新的BasicNameValuePair(“ctl00$SPWebPartManager1$g_afa5adbb_5b60_4e50_8da2_212a1d36e49c$txt_地址”,“Viale romagna 1”);
参数添加(新的BasicNameValuePair(“ctl00$SPWebPartManager1$g_afa5adbb_5b60_4e50_8da2_212a1d36e49c$txt_地址”,“Viale Toscana 20”);
参数添加(新的BasicNameValuePair(“sf_方法”、“POST”);
字符串结果=stationPoller(url,参数);
saveToFile(结果,“/home/rachele/Documents/atm/out4.html”);
}
静态无效保存文件(字符串保存文件、字符串位置){
试一试{
//创建文件
FileWriter fstream=新的FileWriter(pos);
BufferedWriter out=新的BufferedWriter(fstream);
out.write(toFile);
//关闭输出流
out.close();
}catch(异常e){//catch异常(如果有)
System.err.println(“错误:+e.getMessage());
}
}
私有静态字符串convertStreamToString(InputStream为){
BufferedReader reader=新的BufferedReader(新的InputStreamReader(is));
StringBuilder StringBuilder=新的StringBuilder();
字符串行=null;
试一试{
而((line=reader.readLine())!=null){
stringBuilder.append(行+“\n”);
}
}捕获(IOE异常){
e、 printStackTrace();
}最后{
试一试{
is.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
返回stringBuilder.toString();
}
}

在我看来,可能有javascript生成的字段具有动态值,以防止自动代码爬网站点。发送您想要下载的具体站点。

这不是答案,而是对所发生情况的描述。您需要提交大约30个参数,并动态生成一些参数名称/值,以防止脚本或程序获取内容。您硬编码了参数名称,该名称在每次获取内容时都会更改。这些参数将不一样。不是JavaScript内容的答案(因此是注释),但是。。。请注意,对于许多站点,您需要从Java中伪造“用户代理”,否则将无法获得真正的站点。在那里,这样做,你必须伪造用户代理;)对于此网站,无论是否发送用户代理,都没有区别。我通过从我的firefox中过滤出用户代理头进行了测试,结果也没有什么不同。gigadot你认为可能有解决办法吗?如果我是你,我会先尝试对页面内容执行Http GET。然后,获取表单标记中的所有输入标记(包括隐藏类型),并为HTTPPOST创建所有名称/值对的列表。暂时忽略java脚本位。如果它不起作用,那么我们必须重新考虑它。我已经在原始描述中插入了它:正如gigadot在上面所写的那样,您必须执行GET请求以获取隐藏字段(正如我所看到的那样,REQUESTDIGEST会产生问题),然后发出POST请求。一般来说,在浏览器中的行为就像用户一样。