菜鸟入门之网页数据抓取


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

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

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

我测试的网站是湖南师范大学翔网学术天地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秒以内

 

 

 

你可能感兴趣的:(java,入门,JSoup,正则,网页)