HttpClient使用例子:读取CSDN的投票列表并正则解析

来源:互联网 发布:网络言情校园小说推荐 编辑:程序博客网 时间:2024/06/05 04:21


这个属于前一个例子的实际应用版本,用来读取真实的页面并进行正则解析
  1. package com.laozizhu.apache.httpclient;
  2. import java.net.Socket;
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5. import org.apache.http.ConnectionReuseStrategy;
  6. import org.apache.http.HttpHost;
  7. import org.apache.http.HttpResponse;
  8. import org.apache.http.HttpVersion;
  9. import org.apache.http.impl.DefaultConnectionReuseStrategy;
  10. import org.apache.http.impl.DefaultHttpClientConnection;
  11. import org.apache.http.message.BasicHttpRequest;
  12. import org.apache.http.params.BasicHttpParams;
  13. import org.apache.http.params.HttpParams;
  14. import org.apache.http.params.HttpProtocolParams;
  15. import org.apache.http.protocol.BasicHttpContext;
  16. import org.apache.http.protocol.BasicHttpProcessor;
  17. import org.apache.http.protocol.ExecutionContext;
  18. import org.apache.http.protocol.HttpContext;
  19. import org.apache.http.protocol.HttpRequestExecutor;
  20. import org.apache.http.protocol.RequestConnControl;
  21. import org.apache.http.protocol.RequestContent;
  22. import org.apache.http.protocol.RequestExpectContinue;
  23. import org.apache.http.protocol.RequestTargetHost;
  24. import org.apache.http.protocol.RequestUserAgent;
  25. import org.apache.http.util.EntityUtils;
  26. /**
  27.  * HttpClient使用例子:读取CSDN的所有投票状态
  28.  * 
  29.  * @author 老紫竹(java2000.net)
  30.  */
  31. public class HttpGet {
  32.   public static void main(String[] args) throws Exception {
  33.     HttpParams params = new BasicHttpParams();
  34.     // HTTP 协议的版本,1.1/1.0/0.9
  35.     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
  36.     // 字符集
  37.     HttpProtocolParams.setContentCharset(params, "UTF-8");
  38.     // 伪装的浏览器类型
  39.     // IE7 是
  40.     // Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)
  41.     //
  42.     // Firefox3.03
  43.     // Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.0.3)
  44.     // Gecko/2008092417 Firefox/3.0.3
  45.     //
  46.     HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
  47.     HttpProtocolParams.setUseExpectContinue(params, true);
  48.     BasicHttpProcessor httpproc = new BasicHttpProcessor();
  49.     httpproc.addInterceptor(new RequestContent());
  50.     httpproc.addInterceptor(new RequestTargetHost());
  51.     httpproc.addInterceptor(new RequestConnControl());
  52.     httpproc.addInterceptor(new RequestUserAgent());
  53.     httpproc.addInterceptor(new RequestExpectContinue());
  54.     HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
  55.     HttpContext context = new BasicHttpContext(null);
  56.     HttpHost host = new HttpHost("vote.csdn.net"80);
  57.     DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
  58.     ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy();
  59.     context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
  60.     context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host);
  61.     System.out.println("<table>");
  62.     try {
  63.       // 这个85是因为目前有85页,如果有更多的页,需要手工修改或者传参数进来
  64.       for (int i = 1; i <= 85; i++) {
  65.         if (!conn.isOpen()) {
  66.           Socket socket = new Socket(host.getHostName(), host.getPort());
  67.           conn.bind(socket, params);
  68.         }
  69.         BasicHttpRequest request = new BasicHttpRequest("GET",
  70.             "http://vote.csdn.net/VoteList.aspx?page=" + i);
  71.         context.setAttribute(ExecutionContext.HTTP_REQUEST, request);
  72.         request.setParams(params);
  73.         httpexecutor.preProcess(request, httpproc, context);
  74.         HttpResponse response = httpexecutor.execute(request, conn, context);
  75.         response.setParams(params);
  76.         httpexecutor.postProcess(response, httpproc, context);
  77.         // 返回码
  78.         if (response.getStatusLine().getStatusCode() != 200) {
  79.           break;
  80.         }
  81.         parseData(EntityUtils.toString(response.getEntity()));
  82.         if (!connStrategy.keepAlive(response, context)) {
  83.           conn.close();
  84.         }
  85.       }
  86.     } finally {
  87.       conn.close();
  88.     }
  89.     System.out.println("</table>");
  90.   }
  91.   static final Pattern p = Pattern
  92.       .compile(
  93.           "<h4>.*?<a href=.*?voteid=(//d+)/">(.*?)</a></h4>.*?发起人:<a href=.*?>(.*?)</a>.*?<a href=.*?>(//d+) 人投票</a>",
  94.           Pattern.DOTALL);
  95.   /**
  96.    * 解析页面,得到投票编号,题目,发起人和参与人数
  97.    * 
  98.    * @param msg
  99.    */
  100.   public static void parseData(String msg) {
  101.     String[] parts = msg.split("div class=/"kimi_modifysty/">");
  102.     Matcher m;
  103.     for (String s : parts) {
  104.       m = p.matcher(s);
  105.       if (m.find()) {
  106.         System.out.println("<tr><td>" + m.group(1)
  107.             + "</td><td><a href='http://vote.csdn.net/VotePost.aspx?voteid=" + m.group(1) + "'>"
  108.             + m.group(2).replace(","",") + "</a></td><td>" + m.group(3) + "</td><td>"
  109.             + m.group(4) + "</td></tr>");
  110.       }
  111.     }
  112.   }
  113. }

原创粉丝点击