2010-09-12 58 views
7

我在wap上为大学项目开发​​了http客户端,用于登录站点,从HTML数据获取数据,完成并发送表单。 我不知道要使用哪个http库: Apache HTTP客户端 - 不要创建DOM模型,但要使用http重定向,多线程。 HTTPUnit - 创建DOM模型,很容易处理表单,字段,表等,但我不知道如何使用多线程和代理设置。最适合Java的HTTP库?

有什么建议吗?

回答

8

这听起来像你正试图创建一个网络抓取应用程序。为此,我推荐HtmlUnit库。

它可以轻松处理网页中嵌入的表单,代理和数据。在底层,我认为它使用Apache的HttpClient来处理HTTP请求,但这可能太低级了,你不必担心。

有了这个库,您可以用Java控制网页,就像您在Web浏览器中控制它一样:单击按钮,输入文本,选择值。

以下是HtmlUnit's getting started page一些例子:

提交形式:

@Test 
public void submittingForm() throws Exception { 
    final WebClient webClient = new WebClient(); 

    // Get the first page 
    final HtmlPage page1 = webClient.getPage("http://some_url"); 

    // Get the form that we are dealing with and within that form, 
    // find the submit button and the field that we want to change. 
    final HtmlForm form = page1.getFormByName("myform"); 

    final HtmlSubmitInput button = form.getInputByName("submitbutton"); 
    final HtmlTextInput textField = form.getInputByName("userid"); 

    // Change the value of the text field 
    textField.setValueAttribute("root"); 

    // Now submit the form by clicking the button and get back the second page. 
    final HtmlPage page2 = button.click(); 

    webClient.closeAllWindows(); 
} 

使用代理服务器:

@Test 
public void homePage_proxy() throws Exception { 
    final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_2, "http://myproxyserver", myProxyPort); 

    //set proxy username and password 
    final DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient.getCredentialsProvider(); 
    credentialsProvider.addProxyCredentials("username", "password"); 

    final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net"); 
    assertEquals("HtmlUnit - Welcome to HtmlUnit", page.getTitleText()); 

    webClient.closeAllWindows(); 
} 

WebClient类是单线程的,所以每一个线程交易与一个网页将需要它自己的WebClient实例。

除非你需要处理Javascript或CSS,你也可以在创建客户端禁用这些:

WebClient client = new WebClient(); 
client.setJavaScriptEnabled(false); 
client.setCssEnabled(false); 
1

HTTPUnit用于单元测试。除非你的意思是“测试客户端”,否则我认为不适合创建应用程序。

我的魔杖开发http客户端在Java中

你意识到,当然,前提是Apache的HTTP客户端不是你的答案无论是。你听起来像你想创建第一个Web应用程序。

您需要servlet和JSP。获取Apache的Tomcat并学习足够的JSP和JSTL来完成你需要做的事情。不要打扰框架,因为这是你的第一个。

当你运行它,然后尝试像Spring一样的框架。

+0

这个问题似乎很清楚客户端。 Servlet和JSP与客户端功能无关。 – lexicore 2010-09-12 12:07:07

+0

听起来不像jorik1000正在尝试开发一个服务器端应用程序,而是一个专门的Web客户端,它可以提取和提交信息。 HttpUnit设计用于简化网页的单元测试,因此它也是一个很好的工具,用于处理高级别的网页,以便处理一般信息,如提取信息和填写表单。 – 2010-09-12 12:27:33

+1

JSP不是客户端? – duffymo 2010-09-12 13:18:55

1

这似乎是对Java的卷曲支持:在你的网站是多么复杂
http://curl.haxx.se/libcurl/java/

+3

我喜欢cURL,但为什么在有一个纯Java库(如Apache HTTPClient)时依赖于本机C库? – 2010-09-12 12:10:04

1

依赖。选项是Apache HttpClient(加上类似JTidy的)或面向测试的软件包,如HtmlUnit或Canoo WebTest。 HtmlUnit非常强大 - 例如,您可以处理JavaScript。

+0

+1指出[Canoo WebTest](http://webtest.canoo.com/webtest/manual/WebTestHome.html)。这对我来说是新的。但它看起来更专门为测试页面而设计,并不适合于一般的页面操作和数据提取。它与HtmlUnit相比如何? – 2010-09-12 12:31:17

0

Jetty有一个很好的客户端库。我喜欢使用它,因为我经常需要与客户端一起创建服务器。Apache HTTP Client非常好,似乎还有一些功能可以像使用SSL解析代理一样工作。

5

HTTPUnit是为了测试目的,我不认为它是最适合嵌入里面您的应用程序。

当你想消费HTTP资源(比如网页)时,我建议使用Apache HTTPClient。但是你可能会发现这个框架对于你的用例来说是低级的,这是网页抓取。所以我会推荐一个像Apache Camel这样的集成框架。例如,以下路径读取网页(使用Apache HTTPClient),将HTML转换为格式良好的HTML(使用TagSoup),并将结果转换为XML表示以供进一步处理。

from("http://mycollege.edu/somepage.html).unmarshall().tidyMarkup().to("xslt:mystylesheet.xsl") 

您可以使用XPath进一步处理生成的XML,或者使用JAXB将其转换为POJO。

+0

我使用HtmlUnit,因为它很容易。我可以通过XPath从页面中提取需要的信息,然后逃跑。你的建议听起来像是过度杀伤。你为什么推荐这种方式?在应用程序中使用HtmlUnit有什么问题? – 2010-09-12 13:17:25

+0

提及HttpClient + TagSoup组合。当我推出我自己的拼图库时,这些工作很好,比全胖的HtmlUnit快。 – 2010-09-12 13:20:13

+1

注意'单元'部分,这些库主要关注(单元)测试。不过,我已经删除了对HTMLUnit的引用,因为它提供了更一般的抓取功能。 – 2010-09-12 13:48:25

0

如果你真的想模拟一个浏览器,那么Selenium RC

+0

selenium RC通过实际浏览器运行测试 – 2013-03-08 15:56:18