python和php中的html表单提交很简单,新手可以用java完成吗?
我制作了两个版本的脚本,用于提交(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和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版本,同时研究可能导致内存问题的原因
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
- 库(具有依赖项)
- 示例代码
使用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);
}
}