使用正则表达式,从网站上获取指定数据

 最近做的一个项目中,其中有这样一个需求:用户要求我们实时在地图上显示某些指定景点的人数,但是却没有给我们数据的接口。不过可以从网页上获取到最新的数据,每小时更新一次。所以经理安排我做一个实时从网页上抓取数据的功能。

       既然是网页,那么无用的数据肯定是非常多的,所以就需要用正则表达式来过滤出自己所需要的数据。

       不得不说,正则表达式比substring好用多了,而且效率也很不错。下面来分享一下我的这段代码吧:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 从网站获取日期信息 
  3.  *  
  4.  * @Title: getDate 
  5.  * @Date : 2014-8-12 上午09:42:26 
  6.  * @return 
  7.  */  
  8. private String getDate() {  
  9.   
  10.     // 从网站抓取数据  
  11.     String table = catchData();  
  12.     String date = "";  
  13.   
  14.     // 使用正则表达式,获取对应的数据  
  15.     Pattern places = Pattern.compile("(<p align=\"center\">)([^\\s]*)");  
  16.     Matcher matcher = places.matcher(table);  
  17.     while (matcher.find()) {  
  18.         System.out.println(matcher.group(2));  
  19.         date = matcher.group(2);  
  20.     }  
  21.     return date;  
  22. }  
  23.   
  24. /** 
  25.  * 从网站抓取数据(未经处理) 
  26.  *  
  27.  * @Title: getData 
  28.  * @Date : 2014-8-12 上午09:34:30 
  29.  * @return 
  30.  */  
  31. @SuppressWarnings("unchecked")  
  32. private String catchData() {  
  33.     String table = "";  
  34.     try {  
  35.         Map map = new HashMap();  
  36.         map.put("a""1");// 莫删,否则报错  
  37.         table = AsyncRequestUtil.getJsonResult(map, "http://s.visitbeijing.com.cn/flow.php");  
  38.     } catch (Exception e) {  
  39.         e.printStackTrace();  
  40.     }  
  41.     return table;  
  42. }  

【AsyncRequestUtil.java】

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.zhjy.zydc.util;  
  2.   
  3. import java.util.Map;  
  4.   
  5.   
  6. /** 
  7.  * 异步请求数据 
  8.  * @author      : Cuichenglong 
  9.  * @group       : tgb 
  10.  * @Version     : 1.00 
  11.  * @Date        : 2014-5-28 上午09:54:20 
  12.  */  
  13. public class AsyncRequestUtil {  
  14.   
  15.     /** 
  16.      * 异步请求数据 
  17.      * @Title: getJsonResult 
  18.      * @param map 
  19.      * @param strURL 
  20.      * @return 
  21.      */  
  22.     public static String getJsonResult(Map<String, Object> map, String strURL)throws Exception {  
  23.   
  24.         /** 跨域登录,获取返回结果  **/  
  25.         String result = null;  
  26.         result = UrlUtil.getDataFromURL(strURL, map);  
  27.         if (result!=null && result.startsWith("null{")) {  
  28.             result = result.substring("null".length());  
  29.         }  
  30.         return result;  
  31.     }  
  32.   
  33. }  
UrlUtil .java
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.zhjy.zydc.util;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.InputStreamReader;  
  5. import java.io.OutputStreamWriter;  
  6. import java.io.UnsupportedEncodingException;  
  7. import java.net.URL;  
  8. import java.net.URLConnection;  
  9. import java.net.URLDecoder;  
  10. import java.net.URLEncoder;  
  11. import java.util.ArrayList;  
  12. import java.util.Enumeration;  
  13. import java.util.HashMap;  
  14. import java.util.Iterator;  
  15. import java.util.List;  
  16. import java.util.Map;  
  17. import java.util.Set;  
  18.   
  19. import javax.servlet.http.HttpServletRequest;  
  20. import javax.servlet.http.HttpSession;  
  21.   
  22. /** 
  23.  * url跨域获取数据 
  24.  * @author      : Cuichenglong 
  25.  * @group       : Zhong Hai Ji Yuan 
  26.  * @Version     : 1.00 
  27.  * @Date        : 2014-5-27 下午04:14:26 
  28.  */  
  29. public final class UrlUtil {  
  30.   
  31.     /** 
  32.      * 根据URL跨域获取输出结果 
  33.      * @Title: getDataFromURL 
  34.      * @param strURL 要访问的URL地址 
  35.      * @param param 参数 
  36.      * @return 结果字符串 
  37.      * @throws Exception 
  38.      */  
  39.     public static String getDataFromURL(String strURL, Map<String, Object> param) throws Exception{  
  40.         URL url = new URL(strURL);  
  41.         URLConnection conn = url.openConnection();  
  42.         conn.setDoOutput(true);   
  43.         conn.setConnectTimeout(5000); //允许5秒钟的延迟:连接主机的超时时间(单位:毫秒)  
  44.         conn.setReadTimeout(5000); //允许5秒钟的延迟 :从主机读取数据的超时时间(单位:毫秒)  
  45.   
  46.         OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());  
  47.         final StringBuilder sb = new StringBuilder(param.size() << 4); // 4次方  
  48.         final Set<String> keys = param.keySet();  
  49.         for (final String key : keys) {  
  50.             Object value = param.get(key);  
  51.             sb.append(key); // 不能包含特殊字符  
  52.             sb.append('=');  
  53.             //如果格式为String类型,则进行2次解码、2次编码操作  
  54.             if (value instanceof String) // String  
  55.             {  
  56. //              value = (URLDecoder.decode(URLDecoder.decode((String)value, "utf-8"),  
  57. //                      "utf-8"));  
  58. //              value = (Object)(URLEncoder.encode(URLEncoder.encode((String)value, "utf-8"),  
  59. //                      "utf-8"));  
  60.                 value = URLEncoder.encode((String)value, "utf-8");  
  61.             }  
  62.             sb.append(value);  
  63.             sb.append('&');  
  64.         }  
  65.         // 将最后的 '&' 去掉  
  66.         sb.deleteCharAt(sb.length() - 1);  
  67.         // writer.write("email=pk3589@163.com&password=123");  
  68.         writer.write(sb.toString());  
  69.         writer.flush();  
  70.         writer.close();  
  71.   
  72.         InputStreamReader reder = new InputStreamReader(conn.getInputStream(), "utf-8");  
  73.   
  74.         BufferedReader breader = new BufferedReader(reder);  
  75.   
  76.         // BufferedWriter w = new BufferedWriter(new FileWriter("d:/1.txt"));  
  77.   
  78.         String content = null;  
  79.         String result = null;  
  80.         while ((content = breader.readLine()) != null) {  
  81.             result += content;  
  82.         }  
  83.       
  84.         return result;  
  85.   
  86.     }  
  87. }

   这是一段很简单的代码。是从http://s.visitbeijing.com.cn/flow.php网址中抓取日期的代码。

       其实只有2步,第一步是通过java.net.URL后台访问指定网址,并且拿到页面的html源码。第二步从html源码中通过正则表达式,获取日期。这里说一下正则表达式:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Pattern places = Pattern.compile("(<p align=\"center\">)([^\\s]*)");  

       其中^表示屏蔽,\s表示空格,所以^\\s表示屏蔽空格,这里第一个\是转移字符。*表示匹配多个字符。

       通过matcher,获取匹配的值。在一次matcher.find()获取每一次匹配的数据,一个括号对应一个group。如果取matcher.group(1),则会取到<p align="center">。matcher.group(2)可以取到匹配的值。

      了解了这些,我们就可以随意的从某些网址上抓取数据了。有了数据,还有什么可以挡住我们前进的脚步!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值