文档章节

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

白志华
 白志华
发布于 2015/10/18 10:55
字数 976
阅读 15
收藏 0
点赞 0
评论 0

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

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

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

/**
	 * 从网站获取日期信息
	 * 
	 * @Title: getDate
	 * @Date : 2014-8-12 上午09:42:26
	 * @return
	 */
	private String getDate() {

		// 从网站抓取数据
		String table = catchData();
		String date = "";

		// 使用正则表达式,获取对应的数据
		Pattern places = Pattern.compile("(<p align=\"center\">)([^\\s]*)");
		Matcher matcher = places.matcher(table);
		while (matcher.find()) {
			System.out.println(matcher.group(2));
			date = matcher.group(2);
		}
		return date;
	}

	/**
	 * 从网站抓取数据(未经处理)
	 * 
	 * @Title: getData
	 * @Date : 2014-8-12 上午09:34:30
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private String catchData() {
		String table = "";
		try {
			Map map = new HashMap();
			map.put("a", "1");// 莫删,否则报错
			table = AsyncRequestUtil.getJsonResult(map, "http://s.visitbeijing.com.cn/flow.php");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return table;
	}

【AsyncRequestUtil.java】

package com.zhjy.zydc.util;

import java.util.Map;


/**
 * 异步请求数据
 * @author  	: Cuichenglong
 * @group   	: tgb
 * @Version 	: 1.00
 * @Date    	: 2014-5-28 上午09:54:20
 */
public class AsyncRequestUtil {

	/**
	 * 异步请求数据
	 * @Title: getJsonResult
	 * @param map
	 * @param strURL
	 * @return
	 */
	public static String getJsonResult(Map<String, Object> map, String strURL)throws Exception {

		/** 跨域登录,获取返回结果  **/
		String result = null;
		result = UrlUtil.getDataFromURL(strURL, map);
		if (result!=null && result.startsWith("null{")) {
			result = result.substring("null".length());
		}
		return result;
	}

}
UrlUtil .java
package com.zhjy.zydc.util;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * url跨域获取数据
 * @author  	: Cuichenglong
 * @group   	: Zhong Hai Ji Yuan
 * @Version 	: 1.00
 * @Date    	: 2014-5-27 下午04:14:26
 */
public final class UrlUtil {

	/**
	 * 根据URL跨域获取输出结果
	 * @Title: getDataFromURL
	 * @param strURL 要访问的URL地址
	 * @param param 参数
 	 * @return 结果字符串
	 * @throws Exception
	 */
	public static String getDataFromURL(String strURL, Map<String, Object> param) throws Exception{
		URL url = new URL(strURL);
		URLConnection conn = url.openConnection();
		conn.setDoOutput(true);	
		conn.setConnectTimeout(5000); //允许5秒钟的延迟:连接主机的超时时间(单位:毫秒)
		conn.setReadTimeout(5000); //允许5秒钟的延迟 :从主机读取数据的超时时间(单位:毫秒)

		OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
		final StringBuilder sb = new StringBuilder(param.size() << 4); // 4次方
		final Set<String> keys = param.keySet();
		for (final String key : keys) {
			Object value = param.get(key);
			sb.append(key); // 不能包含特殊字符
			sb.append('=');
			//如果格式为String类型,则进行2次解码、2次编码操作
			if (value instanceof String) // String
			{
//				value = (URLDecoder.decode(URLDecoder.decode((String)value, "utf-8"),
//						"utf-8"));
//				value = (Object)(URLEncoder.encode(URLEncoder.encode((String)value, "utf-8"),
//						"utf-8"));
				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();

		InputStreamReader reder = new InputStreamReader(conn.getInputStream(), "utf-8");

		BufferedReader breader = new BufferedReader(reder);

		// BufferedWriter w = new BufferedWriter(new FileWriter("d:/1.txt"));

		String content = null;
		String result = null;
		while ((content = breader.readLine()) != null) {
			result += content;
		}
	
		return result;

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

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

Pattern places = Pattern.compile("(<p align=\"center\">)([^\\s]*)");

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

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/xiaoxian8023/article/details/38309125

共有 人打赏支持
白志华
粉丝 29
博文 260
码字总数 57524
作品 0
长沙
程序员
爬虫课堂(二十二)|使用LinkExtractor提取链接

在爬取一个网站时,要爬取的数据通常不全是在一个页面上,每个页面包含一部分数据以及到其他页面的链接。比如前面讲到的获取简书文章信息,在列表页只能获取到文章标题、文章URL及文章的作者...

小怪聊职场 ⋅ 03/27 ⋅ 0

[python爬虫] 正则表达式使用技巧及爬取个人博客实例

这篇博客是自己《数据挖掘与分析》课程讲到正则表达式爬虫的相关内容,主要简单介绍Python正则表达式爬虫,同时讲述常见的正则表达式分析方法,最后通过实例爬取作者的个人博客网站。希望这篇...

Eastmount ⋅ 2017/10/18 ⋅ 0

在C#中使用正则表达式自动匹配并获取所需要的数据

正则表达式能根据设置匹配各种数据(比如:e-mail地址,电话号码,身份中号码等等)。正则表达式功能强大,使用灵活,C#,Java,JavaScript等多种语言都支持正则表达式。在互联网上“抓取数据...

postdep ⋅ 2013/03/05 ⋅ 0

shell学习之正则表达式【基础篇】

什么是正则表达式: 是你定义的、linux工具用来过滤文本的模式模板。Linux工具(比如sed编辑器或gawk)能够在数据流向工具时对数据进行正则表达式模式匹配。如果数据匹配模式,它就会被接受并...

白羊IT ⋅ 2017/04/15 ⋅ 0

Java简单爬虫系列(4)--- 正则表达式获取百度LOGO

其实一开始我是要获取OSChina的logo的,不过我这几天是不是用Httpclient请求的oschina的首页太多了,现在请求就是403,原因可能在于请求时没有加浏览器的参数,导致网站检测后把我的请求拒绝...

Mr_river ⋅ 2016/01/08 ⋅ 0

抓取证券之星的股票数据

python爬虫成长之路(一):抓取证券之星的股票数据 获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一。鉴于此,我拾起了Python这把利器,开启了网络爬虫之...

xxl714 ⋅ 2017/11/20 ⋅ 0

使用 Python 模块 re 实现解析小工具

简介: Python 模块 re(Regular Expression)是一个很有价值并且非常强大的文本解析工具,本文通过一个简单有趣的小实例来分享一下此模块的使用方法。首先讲述 Python re 的语法和功能,并通...

IBMdW ⋅ 2011/04/12 ⋅ 0

爬虫技术总结

1、如何抓的问题 我们通常所说的利用爬虫“抓”数据,“扒”数据等等,那到底数据是如何“抓”、“扒”下来的呢?简单地讲,我们手工从网站上抓数据,无非就是用鼠标选中,复制、粘贴到记事本...

东方神剑 ⋅ 2015/12/06 ⋅ 0

Python爬虫Scrapy(六)_CrawlSpiders

本篇将学习CrawlSpiders以及日志的使用,更多内容请参考:Python学习指南 CrawlSpiders 通过下面的命令可以快速创建CrawlSpiders模板的代码: 上一个案例中,我们通过正则表达式,制作了新的...

小七奇奇 ⋅ 2017/12/30 ⋅ 0

正则概念与应用

正则的概念 n 正则表达式(regular expression)是一个描述字符规则的对象。ECMAScript 的RegExp 类(构造函数)表示正则表达式,而String 和 RegExp 都定义了使用正则表达式进行强大的模式匹配...

梦想代码 ⋅ 2017/12/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 9分钟前 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 14分钟前 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 26分钟前 ⋅ 0

说说javascript中的那些专业名词

DOM(Document Object Model) 文档对象模型 BOM(Browser Object Model) 浏览器对象模型 ECMA(European Computer Manufacturer's Association) 欧洲计算机制造商协会 W3C(World Wide Web Conso......

hang1989 ⋅ 45分钟前 ⋅ 0

Bootstrap Wizard 多步表单控件

废话 有一块需求是 有多步表单 点击下一步时触发验证一个范围内的表单,点击上一步或取消,清空表单并返回第一步,点击最后一步提交整个表单的 就找到了这个插件,本来自己写了一个原生的 fo...

无极之岚 ⋅ 今天 ⋅ 0

如何利用Spring Cloud构建起自我修复型分布式系统

利用Netflix所打造的组件及各类大家熟知的工具,我们完全可以顺利应对由微服务以及分布式计算所带来的技术挑战。 在过去一年当中,微服务已经成为软件架构领域一个炙手可热的新名词,而且我们...

harries ⋅ 今天 ⋅ 0

临近实习前的感想

再过两星期就要开始新的一段实习了,想想去年的这个时候也在实习,心中不免思绪万千,也一直想写对2017做个总结,但一直迟迟没有下笔。 2017年的春节,我就开始准备开学后找份实习。那时候就...

无精疯 ⋅ 今天 ⋅ 0

Spring AOP(面向切面编程)

Spring AOP概念: Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后添加额外的功能。通常情况下,AOP把项目中需要在多处用到的功能,比如日志、安全和事物等集中到一个类中处理,而...

霍淇滨 ⋅ 今天 ⋅ 0

人工智能、机器学习、数据挖掘以及数据分析有什么联系?

人工智能是目前炙手可热的一个领域,所有的互联网公司以及各路大迦们纷纷表态人工智能将是下一个时代的革命性技术,可与互联网、移动互联网时代的变更相媲美;AlphaGo在围棋领域战胜人类最顶...

董黎明 ⋅ 今天 ⋅ 0

使用 vue-cli 搭建项目

vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一、 安装 node.js 首先需要安装node环境,可以直接到中...

初学者的优化 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部