2010-09-12 57 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