Java 带有问题网站的HTTPclient帖子
我正试图从一个数据库中检索一些数据 我编写了一个java类,它似乎可以很好地用于许多站点,但它不适用于这个特定的站点,该站点在输入fomr中使用了大量javascript 正如您从代码中看到的,我指定的输入字段采用HTML源代码中的名称,但是这个网站可能不接受这种POST请求 如何模拟用户交互来检索生成的HTMLJava 带有问题网站的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
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请求。一般来说,在浏览器中的行为就像用户一样。