当前位置:首页 > 开发 > 行业应用 > 正文

菜鸟入门之网页数据抓取

发表于: 2013-05-04   作者:raidyue   来源:转载   浏览次数:
摘要: 有时候需要从网页上获取数据,比如别一些网页上的新闻获取到放到应用上,其实这也算是一个简单的网络爬虫。一、使用流和正则表达式的方法通过流的方式获取网页的数据同时用正则来筛选自己想要的数据。我测试的网站是湖南师范大学翔网学术天地http://flyhigher.hunnu.edu.cn/channels/399.html我们以获取标记的标题为例,查看网页的源码我们可以发现所有标题的规律,然后可以定义出


有时候需要从网页上获取数据,比如别一些网页上的新闻获取到放到应用上,其实这也算是一个简单的网络爬虫。

一、使用流和正则表达式的方法

通过流的方式获取网页的数据同时用正则来筛选自己想要的数据。

我测试的网站是湖南师范大学翔网学术天地http://flyhigher.hunnu.edu.cn/channels/399.html


菜鸟入门之网页数据抓取_第1张图片
我们以获取标记的标题为例,查看网页的源码


菜鸟入门之网页数据抓取_第2张图片
我们可以发现所有标题的规律,然后可以定义出对应的正则表达式:>第\\d{3}讲:[^_]*</a>

首先我们获取读取网页的代码,然后不断用我们定义的正则来匹配

public void getData() {
		int i = 1;
		String newsTitle = ">第\\d{3}讲:[^_]*</a>";// 活动标题
		try {
			// 创建一个url对象来指向 该网站链接 括号里()装载的是该网站链接的路径
			URL url = new URL(strUrl);
			// InputStreamReader 是一个输入流读取器 用于将读取的字节转换成字符
			InputStreamReader isr = new InputStreamReader(url.openStream(),
					"utf-8"); // 统一使用utf-8
			// 编码模式
			// 使用 BufferedReader 来读取 InputStreamReader 转换成的字符
			BufferedReader br = new BufferedReader(isr);
			String strRead = "";// 新增一个空字符串strRead来装载 BufferedReader 读取到的内容
			// 开始读取数据 如果读到的数据不为空 则往里面读
			while ((strRead = br.readLine()) != null) {
				// 用于捕获标题数据
				String strTitleGet = regularMatch(newsTitle, strRead);
				// 如果捕获到了符合条件的 标题数据 则打印出来
				if (!strTitleGet.equals("nothing")) {
					strTitleGet = strTitleGet.substring(1,
							strTitleGet.indexOf("</a>"));
					 System.out.println(" Title:" + strTitleGet);
					
				}

			// 当读完数据后 记得关闭 BufferReader
			br.close();
		} catch (IOException e) {
			// 如果出错 抛出异常
			e.printStackTrace();
		}
			
	}

 

// 传入2个字符串参数 一个是pattern(我们使用的正则) 另一个matcher是html源代码
	public String regularMatch(String pattern, String matcher) {
		Pattern p = Pattern.compile(pattern, Pattern.COMMENTS);
		Matcher m = p.matcher(matcher);
		if (m.find()) { // 如果读到
			return m.group();// 返回捕获的数据
		} else {
			return "nothing"; // 否则返回一个空值
		}
	}

 程序跑起来……


菜鸟入门之网页数据抓取_第3张图片
 

不过还没有大功告成,这样会有一个问题,效率实在是不高,我们可以使用网上开源的html解析器jsoup,简单的说jsoup会对每一个页面进行解析,同时将该页面封装成一个“Document”对象,然后从一个“Document”对象中获取同样的标签封装成一个“Elements"对象,然后在筛选出想要的标签封装成“Element”对象,这样就获取到了我们需要的网页数据

	public void getHtmlData() {
		try {
			URL url = new URL("http://flyhigher.hunnu.edu.cn/channels/399.html");
			Document doc = Jsoup.parse(url, 100000);
			Elements element = doc.getElementsByTag("a");
			for (Element e : element) {
				// System.out.println("e:  " + e);
				String linkText = e.text();
				String linkHref = e.attr("href");
				if (regularMatch(pattern, linkText)) {
					System.out.println("linkText: " + linkText );
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 

正则表达式都是相同的,结果也是相同的

简单的测试了一下时间第一种的时间是5-7秒,而第二种可以控制在1秒以内

 

 

 

菜鸟入门之网页数据抓取

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
  通过程序自动的读取其它网站网页显示的信息,类似于爬虫程序。比方说我们有一个系统,要提取Bai
当你有幸搜索到这篇博客的时候,相比你已经是以为资深的java程序大师。因此我下面所说的内容你都会
这是一个c#编程,大家可以随便看看。 恩,接下来我给大家演示的是自动填充数据登录126邮箱,其中也
  通过程序自动的读取其它网站网页显示的信息,类似于爬虫程序。比方说我们有一个系统,要提取Bai
XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps)
转载请注明出处! 原文链接:http://blog.csdn.net/zgyulongfei/article/details/7909006 有时候因
转载请注明出处! 原文链接:http://blog.csdn.net/zgyulongfei/article/details/7909006 有时候因
转载请注明出处! 原文链接:http://blog.csdn.net/zgyulongfei/article/details/7909006 有时候因
转载请注明出处! 原文链接:http://blog.csdn.net/zgyulongfei/article/details/7909006 有时候因
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号