我用Java开发用于大学项目的http客户端登录到站点,从HTML数据中获取数据,完成并发送表单。 我不知道使用哪个http lib: Apache HTTP客户端 - 不要创建DOM模型,而是使用http重定向,多线程。 HTTPUnit - 创建DOM模型,并且易于使用表单,字段,表格等,但我不知道如何使用多线程和代理设置。
有什么建议吗?
答案 0 :(得分:8)
听起来您正在尝试创建一个抓取网页的应用程序。为此,我推荐使用HtmlUnit库。
它可以轻松处理网页中嵌入的表单,代理和数据。我认为它使用Apache的HttpClient来处理HTTP请求,但这可能太低了,你不必担心。
使用此库,您可以像在Web浏览器中控制一样使用Java控制网页:单击按钮,键入文本,选择值。
以下是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 :(得分: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。
答案 2 :(得分:1)
HTTPUnit用于单元测试。除非您的意思是“测试客户”,否则我认为它不适合创建应用程序。
我用Java开发http客户端
当然,您意识到Apache HTTP客户端也不是您的答案。您听起来像是想要创建第一个Web应用程序。
您需要servlet和JSP。获取Apache的Tomcat并学习足够的JSP和JSTL来完成您需要做的事情。不要打扰框架,因为它是你的第一个。
当你运行它时,请尝试像Spring这样的框架。
答案 3 :(得分:1)
这似乎是对java的cURL支持:
http://curl.haxx.se/libcurl/java/
答案 4 :(得分:1)
取决于您的网站有多复杂。选项包括Apache HttpClient(加上类似JTidy)或面向测试的软件包,如HtmlUnit或Canoo WebTest。 HtmlUnit功能非常强大 - 例如,您可以处理JavaScript。
答案 5 :(得分:0)
Jetty有一个不错的客户端库。我喜欢使用它,因为我经常需要与客户端一起创建服务器。 Apache HTTP Client非常好,似乎还有一些功能可以像使用SSL解析代理一样。
答案 6 :(得分:0)
如果你真的想模拟浏览器,那么Selenium RC