java网页数据抓取

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

java⽹页数据抓取
在很多⾏业中,要对⾏业数据进⾏分类汇总,及时分析⾏业数据,对于公司未来的发展,有很好的参照和横向对⽐。

所以,在实际⼯作,我们可能要遇到数据采集这个概念,数据采集的最终⽬的就是要获得数据,提取有⽤的数据进⾏数据提取和数据分类汇总。

很多⼈在第⼀次了解数据采集的时候,可能⽆从下⼿,尤其是作为⼀个新⼿,更是感觉很是茫然,所以,在这⾥分享⼀下⾃⼰的⼼得,希望和⼤家⼀起分享技术,如果有什么不⾜,还请⼤家指正。

写出这篇⽬的,就是希望⼤家⼀起成长,我也相信技术之间没有⾼低,只有互补,只有分享,才能使彼此更加成长。

在⽹页数据采集的时候,我们往往要经过这⼏个⼤的步骤:
①通过URL地址读取⽬标⽹页②获得⽹页源码③通过⽹页源码抽取我们要提取的⽬的数据④对数据进⾏格式转换,获得我们需要的数据。

这是⼀个⽰意图,希望⼤家了解
了解了基本流程,下来,我以⼀个案例具体实现如何提取我们需要的数据,对于数据提取可以⽤正则表达式进⾏提取,也可以⽤httpclient+jsoup进⾏提取,此处,暂且不讲解httpclient+jsou提取⽹页数据的做法,以后会对httpclient+jsoup进⾏专门的讲解,此处,先开始讲解如何⽤正则表达式对数据进⾏提取。

其次我们看⽹页源码结构:
上⾯源码可以很清楚的可以看到整个⽹页源码结构,下来我们就对整个⽹页数据进⾏提取
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import .HttpURLConnection;
import .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("/userSite/publicQuote/quotes_list.php","utf-8");
}
public static List<Product> 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("</?a[^>]*>", "");
//这⾥是对样式进⾏处理
line = line.replaceAll("<(\\w+)[^>]*>", "<$1>");
sb.append(line);
}
is.close();
br.close();
//获得⽹页源码
return getDataStructure(sb.toString().trim());
}
static Pattern proInfo
= pile("<div>(.*?)</div>\\s*<div>(.*?)</div>\\s*<div>(.*?)</div>\\s*<div>(.*?)</div>\\s*<div>(.*?)</div>", Pattern.DOTALL);
private static List<Product> getDataStructure(String str) {
//运⽤正则表达式对获取的⽹页源码进⾏数据匹配,提取我们所要的数据,在以后的过程中,我们可以采⽤httpclient+jsoup,
//现在暂时运⽤正则表达式对数据进⾏抽取提取
String[] info = str.split("</li>");
List<Product> list = new ArrayList<Product>();
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⽅式进⾏数据提交,真正采集的时候,有些⽹页结构⽐较复杂,可能会存在着源码⾥⾯没有我们所要提取的数据,关于这⼀点的解决⽅式,以后给⼤家进⾏介绍。

还有,我在采集这个页⾯的时候,只是采集了当前页⾯的数据,它还有分页的数据,关于这个我此处不做讲解,只是提⽰⼀点,我们可以采⽤多线程对所有分页的当前数据进⾏采集,通过线程⼀个采集当前页⾯数据,⼀个进⾏翻页动作,就可以采集完所有数据。

我们匹配的数据可能在项⽬实际开发中,要求我们对所提取的数据要进⾏数据储存,⽅便我们下⼀次进⾏数据的查询操作。

相关文档
最新文档