java从网页抓取数据(实例)
优采云 发布时间: 2022-04-07 18:03java从网页抓取数据(实例)
java网页数据抓取示例
在很多行业中,需要及时对行业数据进行分类汇总,对行业数据进行分析,以便对公司未来的发展有很好的参考和横向比较。因此,在实际工作中,我们可能会遇到数据采集的概念。data采集的最终目的是获取数据,提取有用的数据用于数据抽取和数据分类。
很多人第一次了解数据可能无法入手采集,尤其是作为新手,感觉很茫然,所以在这里分享一下我的经验,也希望和大家分享技术。如有不足之处,请指正。写这篇文章的目的,就是希望大家可以一起成长。我也相信,技术之间没有层次,只有互补和共享,才能让彼此更加成长。
当网页数据采集时,我们往往要经过这些主要步骤:
①通过URL地址读取目标网页 ②获取网页源代码 ③通过网页源代码提取我们要提取的目标数据 ④对数据进行格式转换得到我们需要的数据。
这是*敏*感*词*,希望大家理解
了解了基本流程后,我会用一个案例来具体实现如何提取我们需要的数据。对于数据提取,我们可以使用正则表达式来提取,或者httpclient+jsoup来提取。这里,我们暂时不解释httpclient+jsou提取。网页数据的实践,以后会专门针对httpclient+jsoup进行讲解。在这里,我们将首先解释如何使用正则表达式来提取数据。
我在这里找到了一个网站:.NET.cn/userSite/publicQuote/quotes_list。PHP我们要提取里面的数据,最终我们要提取的结果是产品模型,数量,报价,供应商,首先我们看到这个网站整页预览
接下来我们看一下网页的源码结构:
以上源码可以清晰的看到整个网页的源码结构,我们将提取整个网页的数据。
import java.io.BufferedReader;<br />import java.io.InputStream;<br />import java.io.InputStreamReader;<br />import java.net.HttpURLConnection;<br />import java.net.URL;<br />import java.util.ArrayList;<br />import java.util.List;<br />import java.util.regex.Matcher;<br />import java.util.regex.Pattern;<br /><br />public class HTMLPageParser {<br /> public static void main(String[] args) throws Exception {<br /> //目的网页URL地址<br /> getURLInfo("http://www.ic.net.cn/userSite/publicQuote/quotes_list.php","utf-8");<br /> }<br /> public static List getURLInfo(String urlInfo,String charset) throws Exception {<br /> //读取目的网页URL地址,获取网页源码<br /> URL url = new URL(urlInfo);<br /> HttpURLConnection httpUrl = (HttpURLConnection)url.openConnection();<br /> InputStream is = httpUrl.getInputStream();<br /> BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));<br /> StringBuilder sb = new StringBuilder();<br /> String line;<br /> while ((line = br.readLine()) != null) {<br /> //这里是对链接进行处理<br /> line = line.replaceAll("]*>", "");<br /> //这里是对样式进行处理<br /> line = line.replaceAll("]*>", "");<br /> sb.append(line);<br /> }<br /> is.close();<br /> br.close();<br /> //获得网页源码<br /> return getDataStructure(sb.toString().trim());<br /> }<br /> static Pattern proInfo <br /> = Pattern.compile("(.*?)\\s*(.*?)\\s*(.*?)\\s*(.*?)\\s*(.*?)", Pattern.DOTALL);<br /> private static List getDataStructure(String str) {<br /> //运用正则表达式对获取的网页源码进行数据匹配,提取我们所要的数据,在以后的过程中,我们可以采用httpclient+jsoup,<br /> //现在暂时运用正则表达式对数据进行抽取提取<br /> String[] info = str.split("");<br /> List list = new ArrayList();<br /> for (String s : info) {<br /> Matcher m = proInfo.matcher(s);<br /> Product p = null;<br /> if (m.find()) {<br /> p = new Product();<br /> //设置产品型号<br /> String[] ss = m.group(1).trim().replace(" ", "").split(">");<br /> p.setProStyle(ss[1]);<br /> //设置产品数量<br /> p.setProAmount(m.group(2).trim().replace(" ", ""));<br /> //设置产品报价<br /> p.setProPrice(m.group(4).trim().replace(" ", ""));<br /> //设置产品供应商<br /> p.setProSupplier(m.group(5).trim().replace(" ", ""));<br /> list.add(p);<br /> }<br /> }<br /> //这里对集合里面不是我们要提取的数据进行移除<br /> list.remove(0);<br /> for (int i = 0; i < list.size(); i++) {<br /> System.out.println("产品型号:"+list.get(i).getProStyle()+",产品数量:"+list.get(i).getProAmount()<br /> +",产品报价:"+list.get(i).getProPrice()+",产品供应商:"+list.get(i).getProSupplier());<br /> }<br /> return list;<br /> }<br />}<br />class Product {<br /> private String proStyle;//产品型号<br /> private String proAmount;//产品数量<br /> private String proPrice;//产品报价<br /> private String proSupplier;//产品供应商<br /> public String getProStyle() {<br /> return proStyle;<br /> }<br /> public void setProStyle(String proStyle) {<br /> this.proStyle = proStyle;<br /> }<br /> public String getProSupplier() {<br /> return proSupplier;<br /> }<br /> public void setProSupplier(String proSupplier) {<br /> this.proSupplier = proSupplier;<br /> }<br /><br /> public String getProAmount() {<br /> return proAmount;<br /> }<br /> public void setProAmount(String proAmount) {<br /> this.proAmount = proAmount;<br /> }<br /> public String getProPrice() {<br /> return proPrice;<br /> }<br /> public void setProPrice(String proPrice) {<br /> this.proPrice = proPrice;<br /> }<br /> public Product() {<br /><br /> }<br /> @Override<br /> public String toString() {<br /> return "Product [proAmount=" + proAmount + ", proPrice=" + proPrice<br /> + ", proStyle=" + proStyle + ", proSupplier=" + proSupplier<br /> + "]";<br /> }<br /><br />}
好了,运行上面的程序,我们得到下面的数据,也就是我们最终想要得到的数据
获取数据成功,这就是我们要获取的最终数据结果。最后想说,这里的这个网页比较简单,在网页的源码中可以看到源数据,而这个方法就是在get方法中提交数据。,当真的是采集时,有些网页结构比较复杂,源代码中可能没有我们要提取的数据。关于这一点的解决方案稍后会为大家介绍。另外,当我在采集页面时,我只是采集当前页面的数据,它也有分页数据。这里我就不解释了,只是提示一下,我们可以使用多线程对所有页面的当前数据执行采集,并通过一个线程采集当前页面数据和一个翻页动作,所有数据都可以采集完成。
我们匹配的数据可能在项目的实际开发中,需要我们将提取的数据存储起来,方便我们接下来的数据查询操作。
原链接
在很多行业中,需要及时对行业数据进行分类汇总,对行业数据进行分析,以便对公司未来的发展有很好的参考和横向比较。因此,在实际工作中,我们可能会遇到数据采集的概念。data采集的最终目的是获取数据,提取有用的数据用于数据抽取和数据分类。
很多人第一次了解数据可能无法入手采集,尤其是作为新手,感觉很茫然,所以在这里分享一下我的经验,也希望和大家分享技术。如有不足之处,请指正。写这篇文章的目的,就是希望大家可以一起成长。我也相信,技术之间没有层次,只有互补和共享,才能让彼此更加成长。
当网页数据采集时,我们往往要经过这些主要步骤:
①通过URL地址读取目标网页 ②获取网页源代码 ③通过网页源代码提取我们要提取的目标数据 ④对数据进行格式转换得到我们需要的数据。
这是*敏*感*词*,希望大家理解
了解了基本流程后,我会用一个案例来具体实现如何提取我们需要的数据。对于数据提取,我们可以使用正则表达式来提取,或者httpclient+jsoup来提取。这里,我们暂时不解释httpclient+jsou提取。网页数据的实践,以后会专门针对httpclient+jsoup进行讲解。在这里,我们将首先解释如何使用正则表达式来提取数据。
我在这里找到了一个网站:.NET.cn/userSite/publicQuote/quotes_list。PHP我们要提取里面的数据,最终我们要提取的结果是产品模型,数量,报价,供应商,首先我们看到这个网站整页预览
接下来我们看一下网页的源码结构:
以上源码可以清晰的看到整个网页的源码结构,我们将提取整个网页的数据。
import java.io.BufferedReader;<br />import java.io.InputStream;<br />import java.io.InputStreamReader;<br />import java.net.HttpURLConnection;<br />import java.net.URL;<br />import java.util.ArrayList;<br />import java.util.List;<br />import java.util.regex.Matcher;<br />import java.util.regex.Pattern;<br /><br />public class HTMLPageParser {<br /> public static void main(String[] args) throws Exception {<br /> //目的网页URL地址<br /> getURLInfo("http://www.ic.net.cn/userSite/publicQuote/quotes_list.php","utf-8");<br /> }<br /> public static List getURLInfo(String urlInfo,String charset) throws Exception {<br /> //读取目的网页URL地址,获取网页源码<br /> URL url = new URL(urlInfo);<br /> HttpURLConnection httpUrl = (HttpURLConnection)url.openConnection();<br /> InputStream is = httpUrl.getInputStream();<br /> BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));<br /> StringBuilder sb = new StringBuilder();<br /> String line;<br /> while ((line = br.readLine()) != null) {<br /> //这里是对链接进行处理<br /> line = line.replaceAll("]*>", "");<br /> //这里是对样式进行处理<br /> line = line.replaceAll("]*>", "");<br /> sb.append(line);<br /> }<br /> is.close();<br /> br.close();<br /> //获得网页源码<br /> return getDataStructure(sb.toString().trim());<br /> }<br /> static Pattern proInfo <br /> = Pattern.compile("(.*?)\\s*(.*?)\\s*(.*?)\\s*(.*?)\\s*(.*?)", Pattern.DOTALL);<br /> private static List getDataStructure(String str) {<br /> //运用正则表达式对获取的网页源码进行数据匹配,提取我们所要的数据,在以后的过程中,我们可以采用httpclient+jsoup,<br /> //现在暂时运用正则表达式对数据进行抽取提取<br /> String[] info = str.split("");<br /> List list = new ArrayList();<br /> for (String s : info) {<br /> Matcher m = proInfo.matcher(s);<br /> Product p = null;<br /> if (m.find()) {<br /> p = new Product();<br /> //设置产品型号<br /> String[] ss = m.group(1).trim().replace(" ", "").split(">");<br /> p.setProStyle(ss[1]);<br /> //设置产品数量<br /> p.setProAmount(m.group(2).trim().replace(" ", ""));<br /> //设置产品报价<br /> p.setProPrice(m.group(4).trim().replace(" ", ""));<br /> //设置产品供应商<br /> p.setProSupplier(m.group(5).trim().replace(" ", ""));<br /> list.add(p);<br /> }<br /> }<br /> //这里对集合里面不是我们要提取的数据进行移除<br /> list.remove(0);<br /> for (int i = 0; i < list.size(); i++) {<br /> System.out.println("产品型号:"+list.get(i).getProStyle()+",产品数量:"+list.get(i).getProAmount()<br /> +",产品报价:"+list.get(i).getProPrice()+",产品供应商:"+list.get(i).getProSupplier());<br /> }<br /> return list;<br /> }<br />}<br />class Product {<br /> private String proStyle;//产品型号<br /> private String proAmount;//产品数量<br /> private String proPrice;//产品报价<br /> private String proSupplier;//产品供应商<br /> public String getProStyle() {<br /> return proStyle;<br /> }<br /> public void setProStyle(String proStyle) {<br /> this.proStyle = proStyle;<br /> }<br /> public String getProSupplier() {<br /> return proSupplier;<br /> }<br /> public void setProSupplier(String proSupplier) {<br /> this.proSupplier = proSupplier;<br /> }<br /><br /> public String getProAmount() {<br /> return proAmount;<br /> }<br /> public void setProAmount(String proAmount) {<br /> this.proAmount = proAmount;<br /> }<br /> public String getProPrice() {<br /> return proPrice;<br /> }<br /> public void setProPrice(String proPrice) {<br /> this.proPrice = proPrice;<br /> }<br /> public Product() {<br /><br /> }<br /> @Override<br /> public String toString() {<br /> return "Product [proAmount=" + proAmount + ", proPrice=" + proPrice<br /> + ", proStyle=" + proStyle + ", proSupplier=" + proSupplier<br /> + "]";<br /> }<br /><br />}
好了,运行上面的程序,我们得到下面的数据,也就是我们最终想要得到的数据
获取数据成功,这就是我们要获取的最终数据结果。最后想说,这里的这个网页比较简单,在网页的源码中可以看到源数据,而这个方法就是在get方法中提交数据。,当真的是采集时,有些网页结构比较复杂,源代码中可能没有我们要提取的数据。关于这一点的解决方案稍后会为大家介绍。另外,当我在采集页面时,我只是采集当前页面的数据,它也有分页数据。这里我就不解释了,只是提示一下,我们可以使用多线程对所有页面的当前数据执行采集,并通过一个线程采集当前页面数据和一个翻页动作,所有数据都可以采集完成。
我们匹配的数据可能在项目的实际开发中,需要我们将提取的数据存储起来,方便我们接下来的数据查询操作。