java网页数据捕获示例
优采云 发布时间: 2020-08-07 09:22原创链接
在许多行业中,有必要对行业数据进行分类和汇总,并及时分析行业数据,以便为公司的未来发展提供良好的参考和横向比较. 因此,在实际工作中,我们可能会遇到数据采集的概念. 数据采集的最终目的是获取数据,提取有用的数据以进行数据提取和数据分类.
许多人在初次学习数据采集时可能无法入门,特别是作为新手,他们感到非常茫然. 因此,在这里分享您自己的经验,并希望与大家分享该技术,如果有任何缺陷,请纠正我. 撰写本文的目的是希望每个人都能共同成长. 我还相信,技术之间没有层次,只有互补,只有共享才能使彼此增长更多.
在采集网页数据时,我们通常必须经历以下重要步骤:
①通过URL地址读取目标网页②获取网页的源代码③从网页的源代码中提取我们要提取的目的数据④转换数据格式以获得所需的数据.
这是一个*敏*感*词*,希望大家都理解
了解基本过程,我将使用一个案例专门实现如何提取所需数据. 对于数据提取,可以使用正则表达式提取,也可以使用httpclient + jsoup提取. 在这里,我暂时不介绍httpclient. 将来,将在httpclient + jsoup上专门介绍+ jsou提取网页数据的方法. 在这里,我们将首先说明如何使用正则表达式提取数据.
我在这里找到一个网站: 我们要提取其中的数据. 我们要提取的最终结果是产品型号,数量,报价和供应商. 首先,我们将预览此网站的整个页面
接下来,让我们看一下网页的源代码结构:
上面的源代码可以清楚地看到整个网页的源结构. 接下来,我们将提取整个网页的数据.
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方法提交数据时,当实际采集完成后,一些网页具有复杂的结构,并且源代码中可能没有要提取的数据. 关于这一点的解决方案将在以后介绍. 另外,当我采集此页面时,我只采集了当前页面的数据,并且还收录了分页的数据. 在这里我将不作解释,只是提醒一下,我们可以对分页的所有当前数据使用多线程进行采集. 一个要通过线程采集当前页面数据,另一个要执行页面翻转动作,然后所有可以采集数据.
我们匹配的数据可能在项目的实际开发中,我们需要存储提取的数据以方便我们进行下一个数据查询.