python和php中的html表单提交很简单,新手可以用java完成吗?

python和php中的html表单提交很简单,新手可以用java完成吗?,java,php,python,http,Java,Php,Python,Http,我制作了两个版本的脚本,用于提交(https)网页表单并收集结果。一个版本在php中使用Snoopy.class,另一个版本在python中使用urllib和urllib2。现在我想制作一个java版本 Snoopy使php版本非常容易编写,并且在我自己的(OSX)机器上运行良好。但它分配了太多内存,在pair.com网络托管服务上运行时,在同一点(在curl执行期间)被杀死。在dreamhost.com网站托管服务上运行良好 因此,我决定尝试一个python版本,同时研究可能导致内存问题的原因

我制作了两个版本的脚本,用于提交(https)网页表单并收集结果。一个版本在php中使用Snoopy.class,另一个版本在python中使用urllib和urllib2。现在我想制作一个java版本

Snoopy使php版本非常容易编写,并且在我自己的(OSX)机器上运行良好。但它分配了太多内存,在pair.com网络托管服务上运行时,在同一点(在curl执行期间)被杀死。在dreamhost.com网站托管服务上运行良好

因此,我决定尝试一个python版本,同时研究可能导致内存问题的原因,urllib和urllib2使这变得非常简单。脚本运行良好。获取大约70000条数据库记录,使用数百个表单提交,在大约7分钟内保存到一个大约10MB的文件中

在研究如何使用java实现这一点时,我有一种感觉,它不会像使用php和python那样在公园里散步。java中的表单提交不仅仅针对凡人吗

我花了一天的大部分时间只是想弄清楚如何设置ApacheHttpClient。也就是说,在我放弃之前。如果我还要多花几天时间来解决这个问题,那么我想这将是另一个问题的主题

HttpClient innovation.ch不支持https

WebClient看起来至少需要几天的时间才能弄清楚

因此,php和python版本是轻而易举的事。java版本也可以用几行简单的代码制作吗?如果不是,我会留到以后,因为我只是个新手。如果是这样的话,请善良的灵魂指引我走向光明吧

谢谢

为了进行比较,两个版本的基本代码行如下:


python版本

import urllib
import urllib2

submitVars['firstName'] = "John"
submitVars['lastName'] = "Doe"
submitUrl = "https URL of form action goes here"
referer = "URL of referring web page goes here"

submitVarsUrlencoded = urllib.urlencode(submitVars)
req = urllib2.Request(submitUrl, submitVarsUrlencoded)
req.add_header('Referer', referer)
response = urllib2.urlopen(req)
thePage = response.read()

php版本

require('Snoopy.class.php');
$snoopy = new Snoopy;

$submit_vars["first_name"] = "John";
$submit_vars["last_name"] = "Doe";
$submit_url = "https URL of form action goes here";
$snoopy->referer = "URL of referring web page goes here"; 

$snoopy->submit($submit_url,$submit_vars);
$the_page = $snoopy->results;
使用http组件。你需要:

  • http核心组件
  • HttpComponents客户端
  • 公用记录
示例代码:

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

import java.util.ArrayList;
import java.util.List;
import java.io.OutputStream;
import java.io.ByteArrayOutputStream;

public class HttpClientTest {
    public static void main(String[] args) throws Exception {

        // request parameters
        List<NameValuePair> formparams = new ArrayList<NameValuePair>();
        formparams.add(new BasicNameValuePair("q", "quality"));
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
        HttpPost httppost = new HttpPost("http://stackoverflow.com/search");
        httppost.setEntity(entity);

        // execute the request
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response = httpclient.execute(httppost);

        // display the response status code
        System.out.println(response.getStatusLine().getStatusCode());

        // display the response body
        HttpEntity responseEntity = response.getEntity();
        OutputStream out = new ByteArrayOutputStream();
        responseEntity.writeTo(out);
        System.out.println(out);
    }
}
执行它

java HttpClientTest.class -cp httpcore-4.0.1.jar;httpclient-4.0-alpha4.jar;commons-logging-1.1.1.jar 
我认为这在java中就像在php或python(您的示例)中一样简单。在所有情况下,您都需要:

  • 已配置的sdk
  • 库(具有依赖项)
  • 示例代码

Apache HttpClient会有什么问题

只需确保将依赖项也添加到类路径,即


使用HttpClient当然是更健壮的解决方案,但这可以在没有外部库依赖的情况下完成。有关如何解决该问题的示例,请参见。

MercerTraieste和Tarnschaf善意地提供了部分解决方案。我又花了几天时间,经历了数不清的噩梦,之后我放弃了在http帖子中添加引用程序的尝试,并向stackoverflow发送了一个新问题

乔恩·斯基特立刻回答说我只需要

httppost.addHeader("Referer", referer);
…这让我看起来很傻。我怎么会忽视这一点

下面是生成的代码,几乎完全基于MercerTraieste的建议。在我的例子中,我需要下载并在我的类路径中放置:

  • httpclient-4.0-beta2.jar
  • httpcore-4.0.1.jar

  • commons-logging-1.1.1.jar

import org.apache.http.Header;
导入org.apache.http.HeaderElement;
导入org.apache.http.HttpRequestInterceptor;
导入org.apache.http.HttpRequest;
导入org.apache.http.HttpException;
导入org.apache.http.NameValuePair;
导入org.apache.http.HttpResponse;
导入org.apache.http.HttpEntity;
导入org.apache.http.client.entity.UrlEncodedFormEntity;
导入org.apache.http.client.methods.HttpPost;
导入org.apache.http.client.HttpClient;
导入org.apache.http.protocol.HttpContext;
导入org.apache.http.message.BasicNameValuePair;
导入org.apache.http.impl.client.DefaultHttpClient;
导入java.util.ArrayList;
导入java.util.List;
导入java.io.OutputStream;
导入java.io.ByteArrayOutputStream;
导入java.io.IOException;
公共类HttpClientTest
{
公共静态void main(字符串[]args)引发异常
{
//初始化一些变量
String referer=“引用网页的URL位于此处”;
String submitur=“表单操作的https URL在此处”;
List formparams=new ArrayList();
formparams.add(新的BasicNameValuePair(“名字”、“约翰”));
formparams.add(新的BasicNameValuePair(“姓氏”、“Doe”);
//设置httppost
UrlEncodedFormEntity实体=新的UrlEncodedFormEntity(formparams,“UTF-8”);
HttpPost HttpPost=新的HttpPost(提交);
httppost.setEntity(实体);
//添加推荐人
httppost.addHeader(“Referer”,Referer);
//创建httpclient
DefaultHttpClient httpclient=新的DefaultHttpClient();
//执行请求
HttpResponse response=httpclient.execute(httppost);
//显示响应主体
HttpEntity responseEntity=response.getEntity();
OutputStream out=新的ByteArrayOutputStream();
响应。书面记录(输出);
System.out.println(out);
}
}

标题应改名为java中的html客户端。问题不是一般java中的html客户端,而是新手的经验。您熟悉java中的开发过程吗?我这样问是因为Python和PHP都是在没有任何编译步骤的情况下进行解释的。你关于如何安装HttpClient的评论对我来说也是一个提示。您是从命令行执行这些程序吗?Java是我的第一语言。我用php做了一些事情,只有一个项目是用python做的。我正在从命令行执行脚本的python和php版本,并作为cronjobs执行。我无法确定使用18个ApacheHttpClient中的哪一个,而我尝试的那些都不起作用。几个小时不断增加的头痛让我在这篇文章中提出了一个问题:这个任务不适合java新手吗?谢谢你的提示。正如我在帖子中提到的,是我在该产品上缺乏成功的经验导致了我的失败
PostMethod post = new PostMethod("https URL of form action goes here");
NameValuePair[] data = {
  new NameValuePair("first_name", "joe"),
  new NameValuePair("last_name", "Doe")
};
post.setRequestBody(data);

post.addRequestHeader("Referer", "URL of referring web page goes here");

// TODO: execute method and handle any error responses.
...
InputStream inPage = post.getResponseBodyAsStream();
// handle response.
httppost.addHeader("Referer", referer);
import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpRequest;
import org.apache.http.HttpException;
import org.apache.http.NameValuePair;
import org.apache.http.HttpResponse;
import org.apache.http.HttpEntity;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.HttpClient;
import org.apache.http.protocol.HttpContext;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.impl.client.DefaultHttpClient;

import java.util.ArrayList;
import java.util.List;
import java.io.OutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class HttpClientTest
{
    public static void main(String[] args) throws Exception
    {
        // initialize some variables
        String referer = "URL of referring web page goes here";
        String submitUrl = "https URL of form action goes here";
        List<NameValuePair> formparams = new ArrayList<NameValuePair>();
        formparams.add(new BasicNameValuePair("firstName", "John"));
        formparams.add(new BasicNameValuePair("lastName", "Doe"));

        // set up httppost
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
        HttpPost httppost = new HttpPost(submitUrl);
        httppost.setEntity(entity);

        // add referer
        httppost.addHeader("Referer", referer);

        // create httpclient
        DefaultHttpClient httpclient = new DefaultHttpClient();

        // execute the request
        HttpResponse response = httpclient.execute(httppost);

        // display the response body
        HttpEntity responseEntity = response.getEntity();
        OutputStream out = new ByteArrayOutputStream();
        responseEntity.writeTo(out);
        System.out.println(out);
    }
}