有时候需要从网页上获取数据,比如别一些网页上的新闻获取到放到应用上,其实这也算是一个简单的网络爬虫。
一、使用流和正则表达式的方法
通过流的方式获取网页的数据同时用正则来筛选自己想要的数据。
我测试的网站是湖南师范大学翔网学术天地http://flyhigher.hunnu.edu.cn/channels/399.html
我们以获取标记的标题为例,查看网页的源码
我们可以发现所有标题的规律,然后可以定义出对应的正则表达式:>第\\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"; // 否则返回一个空值 } }
程序跑起来……
不过还没有大功告成,这样会有一个问题,效率实在是不高,我们可以使用网上开源的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秒以内
相关推荐
谁说菜鸟不会数据分析(.入门篇)].张文霖.全彩版.pdf
《jmeter:菜鸟入门到进阶系列》,很全面的教程,适合各个水平的同学学习。
很全面的菜鸟入门教材很全面的菜鸟入门教材很全面的菜鸟入门教材
MATLAB编程(第二版)-菜鸟入门教材,PDF。
相关数据资料,用于博文的数据分析。
Linux菜鸟入门级命令大全 里面有命令的详解
MATLAB初学者教程 MATLAB编程 菜鸟入门(清晰版)
spring菜鸟入门,spring入门,spring新手实例,spring教程
MATLAB编程-菜鸟入门(清晰版)MATLAB编程-菜鸟入门(清晰版)MATLAB编程-菜鸟入门(清晰版)
本文是我为大家分享的区块链技术文章系列中的第一部分【区块链之菜鸟入门】的第一篇,这篇文章咱们先抛开技术细节,用漫画的形式撩开神秘面纱,和大家聊一聊到底区块链是什么。
本资料为本人学习matlab编程(第二版)-菜鸟入门教材时对其课后习题(1-4章)所编的程序,以及书本上的源程序。适用于才开始学习matlab编程
菜鸟谈VBA最最基础入门菜鸟谈VBA最最基础入门菜鸟谈VBA最最基础入门菜鸟谈VBA最最基础入门菜鸟谈VBA最最基础入门
本文章是关于菜鸟入门之按键消抖 。
DataStage菜鸟入门文档适合datastage入门的学员
菜鸟入门项目之菜鸟入门项目之俄罗斯方块工程详细分析.pdf俄罗斯方块菜鸟入门项目之俄罗斯方块工程详细分析.pdf工程详细分析.pdf
matlab编程(第二版)菜鸟入门教材 入门级读物。
MATLAB初学者教程 MATLAB编程-菜鸟入门
数据结构课件资料—菜鸟入门英文版
谁说菜鸟不会数据分析(入门篇)数据