2009年1月20日

利用Jakarta.Commons.HttpClient抓取網頁、網站(Parser)


 
HttpClient 已推出 4.x 版,若您要使用最新的版本請看:
Apache HttpClient 4.x 使用 GET, POST 範例

在撰寫程式的時候有時會我們需要取回網路上的資料做處理
或者是要以程式模擬Client端發出request
這時候我們就可以使用Jakarta.Commons.HttpClient來完成

Jakarta.Commons.HttpClient使用到下列的函式庫
Apache Commons HttpClient 3.xApache Commons CodecApache Commons Logging
三者必須在使用前就都設好classpath否則在執行時會出錯

[Jakarta Commons] HttpClient模擬Client端發出request的介紹
Jakarta.Commons.HttpClient 能支援許多功能,例如:
實作所有的 HTTP methods (GET, POST, PUT, DELETE,HEAD, OPTIONS, and TRACE)
支援 HTTPS 的協定
支援 proxies 的各種情況
支援認證機制
自動的 cookie 處理模式 .....等等
更多介紹可連回[Jakarta Commons] HttpClient模擬Client端發出request查看

以下有幾個比較完整的 Get 和 Post的範例程式連結:
Get範例:
[Jakarta Commons] HttpClient模擬Client端發出request
JSP精選實用範例(五):抓取網頁
Post範例:
Re:TinyUrl using Jakarta HttpClient [Re:qrtt1]
更多原始的範例可以在HttpClient Examples看到

最後附上我自己改來用的程式碼
可能要看過上面的範例之後比較知道在做什麼


  1. import org.apache.commons.httpclient.HttpClient;
  2. import org.apache.commons.httpclient.HttpMethod;
  3. import org.apache.commons.httpclient.NameValuePair;
  4. import org.apache.commons.httpclient.methods.GetMethod;
  5. import org.apache.commons.httpclient.methods.PostMethod;
  6. public class ParseWeb extends HttpClient {
  7. public static void main(String[] args) {
  8. ParseWeb pw = new ParseWeb();
  9. // executeGet Example
  10. System.out.println(pw.execute(pw.setGet("http://www.google.com.tw/")));
  11. // executePost Example
  12. NameValuePair[] pairArray = {new NameValuePair("searchtype", "t"),
  13. new NameValuePair("searchscope", "keyword"),
  14. new NameValuePair("searcharg", "哈利波特"),
  15. new NameValuePair("SORT", "D")
  16. };
  17. System.out.println(pw.execute(
  18. pw.setPost("http://tulips.ntu.edu.tw:1081/search*cht/a?", pairArray)));
  19. }
  20. public ParseWeb() {
  21. this.getParams().setParameter("http.protocol.content-charset", "UTF-8");
  22. }
  23. public ParseWeb(String pageEncoding) {
  24. this.getParams().setParameter("http.protocol.content-charset", pageEncoding);
  25. }
  26. private GetMethod setGet(String url) {
  27. GetMethod method = new GetMethod(url);
  28. return method;
  29. }
  30. private PostMethod setPost(String url, NameValuePair[] pairArray) {
  31. PostMethod method = new PostMethod(url);
  32. for (NameValuePair pair : pairArray) {
  33. method.addParameter(pair);
  34. }
  35. return method;
  36. }
  37. private String execute(HttpMethod method) {
  38. try {
  39. this.executeMethod(method);
  40. String responseString = new String(method.getResponseBodyAsString());
  41. method.releaseConnection();
  42. return responseString;
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. method.releaseConnection();
  46. return "Error: executePost() fails";
  47. }
  48. }
  49. }

關鍵字:HttpClient, executeMethod, getResponseBodyAsString
參考資料:
1. Jakarta.Commons.HttpClientHttpClient Examples
2. [Jakarta Commons] HttpClient模擬Client端發出request
3. JSP精選實用範例(五):抓取網頁
4. Re:TinyUrl using Jakarta HttpClient [Re:qrtt1]


更多精選推薦文章

0 意見 :