在很多行业中,要对行业数据进行分类汇总,及时分析行业数据,对于公司未来的发展,有很好的参照和横向对比。所以,在实际工作,我们可能要遇到数据采集这个概念,数据采集的最终目的就是要获得数据,提取有用的数据进行数据提取和数据分类汇总。

很多人在第一次了解数据采集的时候,可能无从下手,尤其是作为一个新手,更是感觉很是茫然,所以,在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正。写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能使彼此更加成长。

在网页数据采集的时候,我们往往要经过这几个大的步骤:

①通过URL地址读取目标网页②获得网页源码③通过网页源码抽取我们要提取的目的数据④对数据进行格式转换,获得我们需要的数据。

这是一个示意图,希望大家了解

了解了基本流程,下来,我以一个案例具体实现如何提取我们需要的数据,对于数据提取可以用正则表达式进行提取,也可以用httpclient+jsoup进行提取,此处,暂且不讲解httpclient+jsou提取网页数据的做法,以后会对httpclient+jsoup进行专门的讲解,此处,先开始讲解如何用正则表达式对数据进行提取。

我在这里找到一个网站:http://www.ic.net.cn/userSite/publicQuote/quotes_list.php 我们要对里面的数据进行提取操作,我们要提取的最终结果是产品的型号、数量、报价、供应商,首先,我们看到这个网站整个页面预览

其次我们看网页源码结构:

上面源码可以很清楚的可以看到整个网页源码结构,下来我们就对整个网页数据进行提取

[java]  view plain  copy
  1. import java.io.BufferedReader;
  2. import java.io.InputStream;
  3. import java.io.InputStreamReader;
  4. import java.net.HttpURLConnection;
  5. import java.net.URL;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;
  10. public class HTMLPageParser {
  11. public static void main(String[] args) throws Exception {
  12. //目的网页URL地址
  13. getURLInfo("http://www.ic.net.cn/userSite/publicQuote/quotes_list.php","utf-8");
  14. }
  15. public static List<Product> getURLInfo(String urlInfo,String charset) throws Exception {
  16. //读取目的网页URL地址,获取网页源码
  17. URL url = new URL(urlInfo);
  18. HttpURLConnection httpUrl = (HttpURLConnection)url.openConnection();
  19. InputStream is = httpUrl.getInputStream();
  20. BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
  21. StringBuilder sb = new StringBuilder();
  22. String line;
  23. while ((line = br.readLine()) != null) {
  24. //这里是对链接进行处理
  25. line = line.replaceAll("</?a[^>]*>", "");
  26. //这里是对样式进行处理
  27. line = line.replaceAll("<(\\w+)[^>]*>", "<$1>");
  28. sb.append(line);
  29. }
  30. is.close();
  31. br.close();
  32. //获得网页源码
  33. return getDataStructure(sb.toString().trim());
  34. }
  35. static Pattern proInfo
  36. = Pattern.compile("<div>(.*?)</div>\\s*<div>(.*?)</div>\\s*<div>(.*?)</div>\\s*<div>(.*?)</div>\\s*<div>(.*?)</div>", Pattern.DOTALL);
  37. private static List<Product> getDataStructure(String str) {
  38. //运用正则表达式对获取的网页源码进行数据匹配,提取我们所要的数据,在以后的过程中,我们可以采用httpclient+jsoup,
  39. //现在暂时运用正则表达式对数据进行抽取提取
  40. String[] info = str.split("</li>");
  41. List<Product> list = new ArrayList<Product>();
  42. for (String s : info) {
  43. Matcher m = proInfo.matcher(s);
  44. Product p = null;
  45. if (m.find()) {
  46. p = new Product();
  47. //设置产品型号
  48. String[] ss = m.group(1).trim().replace(" ", "").split(">");
  49. p.setProStyle(ss[1]);
  50. //设置产品数量
  51. p.setProAmount(m.group(2).trim().replace(" ", ""));
  52. //设置产品报价
  53. p.setProPrice(m.group(4).trim().replace(" ", ""));
  54. //设置产品供应商
  55. p.setProSupplier(m.group(5).trim().replace(" ", ""));
  56. list.add(p);
  57. }
  58. }
  59. //这里对集合里面不是我们要提取的数据进行移除
  60. list.remove(0);
  61. for (int i = 0; i < list.size(); i++) {
  62. System.out.println("产品型号:"+list.get(i).getProStyle()+",产品数量:"+list.get(i).getProAmount()
  63. +",产品报价:"+list.get(i).getProPrice()+",产品供应商:"+list.get(i).getProSupplier());
  64. }
  65. return list;
  66. }
  67. }
  68. class Product {
  69. private String proStyle;//产品型号
  70. private String proAmount;//产品数量
  71. private String proPrice;//产品报价
  72. private String proSupplier;//产品供应商
  73. public String getProStyle() {
  74. return proStyle;
  75. }
  76. public void setProStyle(String proStyle) {
  77. this.proStyle = proStyle;
  78. }
  79. public String getProSupplier() {
  80. return proSupplier;
  81. }
  82. public void setProSupplier(String proSupplier) {
  83. this.proSupplier = proSupplier;
  84. }
  85. public String getProAmount() {
  86. return proAmount;
  87. }
  88. public void setProAmount(String proAmount) {
  89. this.proAmount = proAmount;
  90. }
  91. public String getProPrice() {
  92. return proPrice;
  93. }
  94. public void setProPrice(String proPrice) {
  95. this.proPrice = proPrice;
  96. }
  97. public Product() {
  98. }
  99. @Override
  100. public String toString() {
  101. return "Product [proAmount=" + proAmount + ", proPrice=" + proPrice
  102. + ", proStyle=" + proStyle + ", proSupplier=" + proSupplier
  103. + "]";
  104. }
  105. }

好了,运行上面程序,我们得到下面的数据,就是我们要获得的最终数据

获得数据成功,这就是我们要获得最终的数据结果,最后我要说的是,此处这个网页算是比较简单的,而且,网页源码可以看到源数据,并且此方式是以get方式进行数据提交,真正采集的时候,有些网页结构比较复杂,可能会存在着源码里面没有我们所要提取的数据,关于这一点的解决方式,以后给大家进行介绍。还有,我在采集这个页面的时候,只是采集了当前页面的数据,它还有分页的数据,关于这个我此处不做讲解,只是提示一点,我们可以采用多线程对所有分页的当前数据进行采集,通过线程一个采集当前页面数据,一个进行翻页动作,就可以采集完所有数据。

我们匹配的数据可能在项目实际开发中,要求我们对所提取的数据要进行数据储存,方便我们下一次进行数据的查询操作,下一节我会给大家分享自己有关如何对采集的数据进行数据库储存。

Java网页数据抓取实例相关推荐

  1. 李沐【实用机器学习】1.3网页数据抓取

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.数据抓取工具 二.实例解析 总结 前言 网页数据抓取目标:在一个网站里面感兴趣的数据抓取出来 数据特点:噪点较多, ...

  2. java抓取网页标题内容_[Java教程]java 网页页面抓取标题和正文

    [Java教程]java 网页页面抓取标题和正文 0 2014-07-10 09:01:30 import java.io.BufferedReader;import java.io.IOExcept ...

  3. 网页数据抓取-网页实时数据抓取软件

    网页数据抓取,随着社会的发展,互联网的普及,不管是企业还是个人都意识到数据的重要性.今天给大家分享一款免费的网页数据抓取软件.只要点点鼠标就能轻松采集你想要的内容不管是导出还是自动发布都支持!详细参考 ...

  4. 1.3 网页数据抓取

    1.3 网页数据抓取 李沐 B站:https://space.bilibili.com/1567748478/channel/collectiondetail?sid=28144 课程主页:https ...

  5. 如何用python抓取文献_浅谈Python爬虫技术的网页数据抓取与分析

    浅谈 Python 爬虫技术的网页数据抓取与分析 吴永聪 [期刊名称] <计算机时代> [年 ( 卷 ), 期] 2019(000)008 [摘要] 近年来 , 随着互联网的发展 , 如何 ...

  6. 网页数据抓取之当当网

    所谓"网页数据抓取",也称为网页数据采集,Web数据采集等等,就是从我们平时通过浏览器查看的web网页上来提取需要的数据信息,然后以结构化的方式存储到CSV.JSON.XML.AC ...

  7. 网页数据抓取,关键在于抓取的准确性和应对海量数据时的快速反应

    无论是互联网科技.大数据.还是云计算,关键都在于技术优势,技术的成本和门槛都很高,不是两三个人零成本就可以打造一个产品. 我们以网页数据抓取来说,一门基于web结构或基于浏览器可视化的数据获取技术,关 ...

  8. Android登录客户端,验证码的获取,网页数据抓取与解析,HttpWatch基本使用

    大家好,我是M1ko.在互联网时代的今天,如果一个App不接入互联网,那么这个App一定不会有长时间的生命周期,因此Android网络编程是每一个Android开发者必备的技能,博主是在校大学生,自学 ...

  9. vba抓取网页数据到excel_R语言网页数据抓取XML数据包

    有些网络上的数据无法复制粘贴,一个一个录入有点费时费力,此时用这种数据抓取方法,短短几句,简单实用.XML是一种可扩展标记语言,它被设计用来传输和存储数据.XML是各种应用程序之间进行数据传输的最常用 ...

最新文章

  1. poj2112(网络流-最大流+二分)
  2. ajax向后台请求数据,后台接收到数据并进行了处理,但前台就是调用error方法...
  3. lucene源码分析(1)基本要素
  4. oracle查询blob数据,C#查询Oracle clob blob数据
  5. @value 静态变量_Spring注解驱动开发之八——@Value属性赋值、@PropertySource 加载外部配置文件...
  6. 1. CMake 系列 - 从零构建动态库和静态库
  7. BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题
  8. T-SQL备忘(6):常用内置函数
  9. WordPress插件-Wordfence Security v7.4汉化版-可更新
  10. Oracle分析函数Over()
  11. 如何建立有效的数据挖掘步骤
  12. 什么转换器能将excel转换成pdf
  13. 青龙脚本--今日头条极速版
  14. 指针数组和二维数组指针
  15. 用idea对git的merge进行撤销
  16. idea添加目录时,Mark Directory as的几个选项详解
  17. LSTM及其变体peehole
  18. 一文读懂APS系统的核心算法和数学理论
  19. 《人类简史》--摘录
  20. Metamask不能访问以太坊账户?隐私模式!

热门文章

  1. 数学建模 matlab 数据建模基础
  2. xfce上安装mysql_第一次把mysql装进docker里碰到的各种问题-Go语言中文社区
  3. 怎样在ipad安装ipa文件
  4. starUML教程-用例图/类图
  5. python 图片打水印 透明图片合并
  6. Yolov5 更改识别窗口大小
  7. 牛客网数字化招聘解决方案,支持10万人同时在线笔试
  8. 使用ffmpeg在视频中心添加透明水印
  9. python监控linux运行程序_python linux监控程序
  10. Java中的正无穷,负无穷和非数