最近做的一个项目中,其中有这样一个需求:用户要求我们实时在地图上显示某些指定景点的人数,但是却没有给我们数据的接口。不过可以从网页上获取到最新的数据,每小时更新一次。所以经理安排我做一个实时从网页上抓取数据的功能。
既然是网页,那么无用的数据肯定是非常多的,所以就需要用正则表达式来过滤出自己所需要的数据。
不得不说,正则表达式比substring好用多了,而且效率也很不错。下面来分享一下我的这段代码吧:
-
-
- *
- *@Title:getDate
- *@Date:2014-8-12上午09:42:26
- *@return
- */
- privateStringgetDate(){
-
- //从网站抓取数据
- Stringtable=catchData();
- Stringdate="";
- //使用正则表达式,获取对应的数据
- Patternplaces=Pattern.compile("(<palign="center">)([^s]*)");
- Matchermatcher=places.matcher(table);
- while(matcher.find()){
- System.out.println(matcher.group(2));
- date=matcher.group(2);
- }
- returndate;
- /**
- *从网站抓取数据(未经处理)
- *
- *@Title:getData
- *@Date:2014-8-12上午09:34:30
- *@return
- */
- @SuppressWarnings("unchecked")
- privateStringcatchData(){
- Stringtable="";
- try{
- Mapmap=newHashMap();
- map.put("a","1");
- table=AsyncRequestUtil.getJsonResult(map,"http://s.visitbeijing.com.cn/flow.php");
- }catch(Exceptione){
- e.printStackTrace();
- returntable;
- }
【AsyncRequestUtil.java】
packagecom.zhjy.zydc.util;
-
- importjava.util.Map;
- *异步请求数据
- *@author:Cuichenglong
- *@group:tgb
- *@Version:1.00
- *@Date:2014-5-28上午09:54:20
- publicclassAsyncRequestUtil{
- *异步请求数据
- *@Title:getJsonResult
- *@parammap
- *@paramstrURL
- staticStringgetJsonResult(Map<String,Object>map,StringstrURL)throwsException{
- /**跨域登录,获取返回结果**/
- Stringresult=null;
- result=UrlUtil.getDataFromURL(strURL,map);
- if(result!=null&&result.startsWith("null{")){
- result=result.substring("null".length());
- }
- returnresult;
- }
【
UrlUtil .java
】
importjava.io.BufferedReader;
- importjava.io.InputStreamReader;
- importjava.io.OutputStreamWriter;
- importjava.io.UnsupportedEncodingException;
- importjava.net.URL;
- importjava.net.URLConnection;
- importjava.net.URLDecoder;
- importjava.net.URLEncoder;
- importjava.util.ArrayList;
- importjava.util.Enumeration;
- importjava.util.HashMap;
- importjava.util.Iterator;
- importjava.util.List;
- importjava.util.Map;
- importjava.util.Set;
- importjavax.servlet.http.HttpServletRequest;
- importjavax.servlet.http.HttpSession;
- *url跨域获取数据
- *@group:ZhongHaiJiYuan
- *@Date:2014-5-27下午04:14:26
- finalclassUrlUtil{
- *根据URL跨域获取输出结果
- *@Title:getDataFromURL
- *@paramstrURL要访问的URL地址
- *@paramparam参数
- *@return结果字符串
- *@throwsException
- staticStringgetDataFromURL(StringstrURL,Map<String,Object>param)throwsException{
- URLurl=newURL(strURL);
- URLConnectionconn=url.openConnection();
- conn.setDoOutput(true);
- conn.setConnectTimeout(5000);
- conn.setReadTimeout(//允许5秒钟的延迟:从主机读取数据的超时时间(单位:毫秒)
- OutputStreamWriterwriter=newOutputStreamWriter(conn.getOutputStream());
- finalStringBuildersb=newStringBuilder(param.size()<<4);
- finalSet<String>keys=param.keySet();
- for(finalStringkey:keys){
- Objectvalue=param.get(key);
- sb.append(key);
- sb.append('=');
- //如果格式为String类型,则进行2次解码、2次编码操作
- if(valueinstanceofString)
- {
- //value=(URLDecoder.decode(URLDecoder.decode((String)value,"utf-8"),
- //"utf-8"));
- //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");
- sb.append(value);
- sb.append('&');
- //将最后的'&'去掉
- sb.deleteCharAt(sb.length()-1);
- //writer.write("email=pk3589@163.com&password=123");
- writer.write(sb.toString());
- writer.flush();
- writer.close();
- InputStreamReaderreder=newInputStreamReader(conn.getInputStream(),"utf-8");
- BufferedReaderbreader=newBufferedReader(reder);
- //BufferedWriterw=newBufferedWriter(newFileWriter("d:/1.txt"));
- Stringcontent=null;
- while((content=breader.readLine())!=null){
- result+=content;
- }
这是一段很简单的代码。是从http://s.visitbeijing.com.cn/flow.php网址中抓取日期的代码。
其实只有2步,第一步是通过java.net.URL后台访问指定网址,并且拿到页面的html源码。第二步从html源码中通过正则表达式,获取日期。这里说一下正则表达式:
- Patternplaces=Pattern.compile("(<palign="center">)([^s]*)");
其中^表示屏蔽,s表示空格,所以^s表示屏蔽空格,这里第一个是转移字符。*表示匹配多个字符。
通过matcher,获取匹配的值。在一次matcher.find()获取每一次匹配的数据,一个括号对应一个group。如果取matcher.group(1),则会取到<p align="center">。matcher.group(2)可以取到匹配的值。
了解了这些,我们就可以随意的从某些网址上抓取数据了。有了数据,还有什么可以挡住我们前进的脚步!!!
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|