js抓取网页内容(​​如何用正则表达式对数据进行数据提取和数据分类汇总)

优采云 发布时间: 2022-04-02 03:14

  js抓取网页内容(​​如何用正则表达式对数据进行数据提取和数据分类汇总)

  ​​​​

  在很多行业中,需要及时对行业数据进行分类汇总,对行业数据进行分析,以便对公司未来的发展有很好的参考和横向比较。因此,在实际工作中,我们可能会遇到数据采集的概念。data采集的最终目的是获取数据,提取有用的数据用于数据抽取和数据分类。

  很多人刚开始了解数据时可能无法入手采集,尤其是新手,感觉很茫然,所以在这里分享一下我的经验,也希望和大家分享技术。如有不足之处,请指正。写这篇文章的目的,就是希望大家可以一起成长。我也相信,技术之间没有层次,只有互补和共享,才能让彼此更加成长。

  当网页数据采集时,我们往往要经过这些主要步骤:

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

  这是*敏*感*词*,希望大家理解

  

  了解了基本流程后,我会用一个案例来具体实现如何提取我们需要的数据。对于数据提取,我们可以使用正则表达式来提取,或者httpclient+jsoup来提取。这里,我们暂时不解释httpclient+jsou提取。网页数据的实践,以后会专门针对httpclient+jsoup进行讲解。在这里,我们将首先解释如何使用正则表达式来提取数据。

  我在这里找到了一个网站:​​​.cn/userSite/publicQuote/quotes_list。​​我们要提取里面的数据。我们要提取的最终结果是型号、数量、报价、供应商,首先我们看到这个网站整页预览

  

  接下来我们看一下网页的源码结构:

  

  以上源码可以清晰的看到整个网页的源码结构,我们将提取整个网页数据。

  import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.ArrayList;

import java.util.List;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class HTMLPageParser {

public static void main(String[] args) throws Exception {

//目的网页URL地址

getURLInfo("http://www.ic.net.cn/userSite/publicQuote/quotes_list.php","utf-8");

}

public static List getURLInfo(String urlInfo,String charset) throws Exception {

//读取目的网页URL地址,获取网页源码

URL url = new URL(urlInfo);

HttpURLConnection httpUrl = (HttpURLConnection)url.openConnection();

InputStream is = httpUrl.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));

StringBuilder sb = new StringBuilder();

String line;

while ((line = br.readLine()) != null) {

//这里是对链接进行处理

line = line.replaceAll("]*>", "");

//这里是对样式进行处理

line = line.replaceAll("]*>", "");

sb.append(line);

}

is.close();

br.close();

//获得网页源码

return getDataStructure(sb.toString().trim());

}

static Pattern proInfo

= Pattern.compile("(.*?)\\s*(.*?)\\s*(.*?)\\s*(.*?)\\s*(.*?)", Pattern.DOTALL);

private static List getDataStructure(String str) {

//运用正则表达式对获取的网页源码进行数据匹配,提取我们所要的数据,在以后的过程中,我们可以采用httpclient+jsoup,

//现在暂时运用正则表达式对数据进行抽取提取

String[] info = str.split("");

List list = new ArrayList();

for (String s : info) {

Matcher m = proInfo.matcher(s);

Product p = null;

if (m.find()) {

p = new Product();

//设置产品型号

String[] ss = m.group(1).trim().replace(" ", "").split(">");

p.setProStyle(ss[1]);

//设置产品数量

p.setProAmount(m.group(2).trim().replace(" ", ""));

//设置产品报价

p.setProPrice(m.group(4).trim().replace(" ", ""));

//设置产品供应商

p.setProSupplier(m.group(5).trim().replace(" ", ""));

list.add(p);

}

}

//这里对集合里面不是我们要提取的数据进行移除

list.remove(0);

for (int i = 0; i < list.size(); i++) {

System.out.println("产品型号:"+list.get(i).getProStyle()+",产品数量:"+list.get(i).getProAmount()

+",产品报价:"+list.get(i).getProPrice()+",产品供应商:"+list.get(i).getProSupplier());

}

return list;

}

}

class Product {

private String proStyle;//产品型号

private String proAmount;//产品数量

private String proPrice;//产品报价

private String proSupplier;//产品供应商

public String getProStyle() {

return proStyle;

}

public void setProStyle(String proStyle) {

this.proStyle = proStyle;

}

public String getProSupplier() {

return proSupplier;

}

public void setProSupplier(String proSupplier) {

this.proSupplier = proSupplier;

}

public String getProAmount() {

return proAmount;

}

public void setProAmount(String proAmount) {

this.proAmount = proAmount;

}

public String getProPrice() {

return proPrice;

}

public void setProPrice(String proPrice) {

this.proPrice = proPrice;

}

public Product() {

}

@Override

public String toString() {

return "Product [proAmount=" + proAmount + ", proPrice=" + proPrice

+ ", proStyle=" + proStyle + ", proSupplier=" + proSupplier

+ "]";

}

}

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

  

  获取数据成功,这就是我们要获取的最终数据结果。最后想说,这里的这个网页比较简单,可以在网页的源码中看到源数据,而这个方法就是在get方法中提交数据。,当真的是采集时,有些网页结构比较复杂,源代码中可能没有我们要提取的数据。关于这一点的解决方案稍后会为大家介绍。另外,当我在采集页面时,我只是采集当前页面的数据,它也有分页数据。这里我就不解释了,只是一个提示,我们可以使用多线程对所有页面的当前数据执行采集,通过一个线程采集当前页面数据和一个翻页动作,所有数据都可以采集完成。

  我们匹配的数据可能在项目的实际开发中,需要我们将提取的数据存储起来,方便我们接下来的数据查询操作。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线