加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 01:14:59 所属栏目:百科 来源:网络整理
导读:最近做的一个项目中,其中有这样一个需求:用户要求我们实时在地图上显示某些指定景点的人数,但是却没有给我们数据的接口。不过可以从网页上获取到最新的数据,每小时更新一次。所以经理安排我做一个实时从网页上抓取数据的功能。 既然是网页,那么无用的数

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

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

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

[java] view plain copy
  1. /**
  2. *从网站获取日期信息
  3. *
  4. *@Title:getDate
  5. *@Date:2014-8-12上午09:42:26
  6. *@return
  7. */
  8. privateStringgetDate(){
  9. //从网站抓取数据
  10. Stringtable=catchData();
  11. Stringdate="";
  12. //使用正则表达式,获取对应的数据
  13. Patternplaces=Pattern.compile("(<palign="center">)([^s]*)");
  14. Matchermatcher=places.matcher(table);
  15. while(matcher.find()){
  16. System.out.println(matcher.group(2));
  17. date=matcher.group(2);
  18. }
  19. returndate;
  20. /**
  21. *从网站抓取数据(未经处理)
  22. *
  23. *@Title:getData
  24. *@Date:2014-8-12上午09:34:30
  25. *@return
  26. */
  27. @SuppressWarnings("unchecked")
  28. privateStringcatchData(){
  29. Stringtable="";
  30. try{
  31. Mapmap=newHashMap();
  32. map.put("a","1");//莫删,否则报错
  33. table=AsyncRequestUtil.getJsonResult(map,"http://s.visitbeijing.com.cn/flow.php");
  34. }catch(Exceptione){
  35. e.printStackTrace();
  36. returntable;
  37. }

【AsyncRequestUtil.java】

    packagecom.zhjy.zydc.util;
  1. importjava.util.Map;
  2. *异步请求数据
  3. *@author:Cuichenglong
  4. *@group:tgb
  5. *@Version:1.00
  6. *@Date:2014-5-28上午09:54:20
  7. publicclassAsyncRequestUtil{
  8. *异步请求数据
  9. *@Title:getJsonResult
  10. *@parammap
  11. *@paramstrURL
  12. staticStringgetJsonResult(Map<String,Object>map,StringstrURL)throwsException{
  13. /**跨域登录,获取返回结果**/
  14. Stringresult=null;
  15. result=UrlUtil.getDataFromURL(strURL,map);
  16. if(result!=null&&result.startsWith("null{")){
  17. result=result.substring("null".length());
  18. }
  19. returnresult;
  20. }
UrlUtil .java
    importjava.io.BufferedReader;
  1. importjava.io.InputStreamReader;
  2. importjava.io.OutputStreamWriter;
  3. importjava.io.UnsupportedEncodingException;
  4. importjava.net.URL;
  5. importjava.net.URLConnection;
  6. importjava.net.URLDecoder;
  7. importjava.net.URLEncoder;
  8. importjava.util.ArrayList;
  9. importjava.util.Enumeration;
  10. importjava.util.HashMap;
  11. importjava.util.Iterator;
  12. importjava.util.List;
  13. importjava.util.Map;
  14. importjava.util.Set;
  15. importjavax.servlet.http.HttpServletRequest;
  16. importjavax.servlet.http.HttpSession;
  17. *url跨域获取数据
  18. *@group:ZhongHaiJiYuan
  19. *@Date:2014-5-27下午04:14:26
  20. finalclassUrlUtil{
  21. *根据URL跨域获取输出结果
  22. *@Title:getDataFromURL
  23. *@paramstrURL要访问的URL地址
  24. *@paramparam参数
  25. *@return结果字符串
  26. *@throwsException
  27. staticStringgetDataFromURL(StringstrURL,Map<String,Object>param)throwsException{
  28. URLurl=newURL(strURL);
  29. URLConnectionconn=url.openConnection();
  30. conn.setDoOutput(true);
  31. conn.setConnectTimeout(5000);//允许5秒钟的延迟:连接主机的超时时间(单位:毫秒)
  32. conn.setReadTimeout(//允许5秒钟的延迟:从主机读取数据的超时时间(单位:毫秒)
  33. OutputStreamWriterwriter=newOutputStreamWriter(conn.getOutputStream());
  34. finalStringBuildersb=newStringBuilder(param.size()<<4);//4次方
  35. finalSet<String>keys=param.keySet();
  36. for(finalStringkey:keys){
  37. Objectvalue=param.get(key);
  38. sb.append(key);//不能包含特殊字符
  39. sb.append('=');
  40. //如果格式为String类型,则进行2次解码、2次编码操作
  41. if(valueinstanceofString)//String
  42. {
  43. //value=(URLDecoder.decode(URLDecoder.decode((String)value,"utf-8"),
  44. //"utf-8"));
  45. //value=(Object)(URLEncoder.encode(URLEncoder.encode((String)value,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> value=URLEncoder.encode((String)value,"utf-8");
  46. sb.append(value);
  47. sb.append('&');
  48. //将最后的'&'去掉
  49. sb.deleteCharAt(sb.length()-1);
  50. //writer.write("email=pk3589@163.com&password=123");
  51. writer.write(sb.toString());
  52. writer.flush();
  53. writer.close();
  54. InputStreamReaderreder=newInputStreamReader(conn.getInputStream(),"utf-8");
  55. BufferedReaderbreader=newBufferedReader(reder);
  56. //BufferedWriterw=newBufferedWriter(newFileWriter("d:/1.txt"));
  57. Stringcontent=null;
  58. while((content=breader.readLine())!=null){
  59. result+=content;
  60. }

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

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

[java] view plain copy
  1. Patternplaces=Pattern.compile("(<palign="center">)([^s]*)");

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读