kettle案例4.2.1--抽取Web数据---HTML网页的数据抽取

kettle案例4.2.1–抽取Web数据—HTML网页的数据抽取

抽取Web数据主要是获取网页上的数据。Web网页上出现的数据形式主要有三种,分别是HTML形式、XML形式以及JSON形式。

HTML网页的数据抽取

HyperText Markup Language,简称HTML,即超文本标记语言,它包含了一套标记标签,主要用于创建和描述网页
HTML可以以文档的形式展示,HTML文档中包含HTML标签和纯文本。其中,HTML标签是由尖括号括起来的关键词,例如 和、和、和等标签,这些标签通常以第一个标签(如标签)为开始标签,第二个标签(如标签)为结束标签的方式成对出现。在标签内部可以定义id,用于标签的唯一标识;也可以定义class,用于一组标签的标识。

基于数据库技术的HTML网页抽取技术的研究经过了人工、半自动化和全自动化方法的三个阶段:

  • 人工方法,通过程序员人工分析出网页的模板,借助一定的编程语言,针对具体的问题生成具体的包装器。
  • 半自动化方法,应用网页模板抽取数据,从而生成具体包装器的部分被计算机接管,而网页模板的分析仍然需要人工参与。
  • 自动化方法中,网页模板的分析部分也交给了计算机进行,仅仅需要很少的人工参与或完全不需要人工参与,因而更加适合大规模、系统化、持续性的Web数据抽取。

案例介绍

通过Kettle工具抽取HTML网页的数据,并保存至数据库extract中的数据表html中

数据准备

这里以抽取“豆瓣电影排行榜”网页的超链接数据为例进行抽取数据,豆瓣电影排行榜页面的部分内容如图所示。

kettle案例4.2.1--抽取Web数据---HTML网页的数据抽取_第1张图片

1.打开Kettle工具,创建转换

通过使用Kettle工具,创建一个转换转换html_extract,并添加**“自定义常量数据”输入控件、“HTTP client”查询控件和“Java代码”脚本控件,**具体如图所示
kettle案例4.2.1--抽取Web数据---HTML网页的数据抽取_第2张图片

2.配置自定义常量数据控件

双击“自定义常量数据”控件,进入“自定义常量数据”界面

单击“元数据”选项卡,定义一个字段常量filename并指定数据类型String;

kettle案例4.2.1--抽取Web数据---HTML网页的数据抽取_第3张图片

单击“数据”选项卡,添加html形式数据所在的URL,即https://movie.douban.com/chart

kettle案例4.2.1--抽取Web数据---HTML网页的数据抽取_第4张图片

3.配置HTTP client控件

双击“HTTP client”控件,进入“HTTP web service”界面

勾选“从字段中获取URL?”的复选框;在“URL字段名”处的下拉框中选择URL字段名,即filename;在“结果字段名”处指定结果字段名称,这里选择默认的结果字段result。“HTTP client”控件配置的效果如图所示

kettle案例4.2.1--抽取Web数据---HTML网页的数据抽取_第5张图片

4.配置Java代码控件

双击“Java”控件,进入“Java代码”界面

双击“Code Snippits”→ “Common use”→ “Main”,添加Java脚本代码的主方法,即程序入口

kettle案例4.2.1--抽取Web数据---HTML网页的数据抽取_第6张图片

在“Java代码”控件中的代码框编写抽取HTML网页数据的Java脚本代码(全部代码如下)

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
  if (first) {
    first = false;
  }

  Object[] r = getRow();

  if (r == null) {
    setOutputDone();
    return false;
  }

  r = createOutputRow(r, data.outputRowMeta.size());

  return true;
}

    FieldHelper infoField = get(Fields.Info, "info_field_name");

    RowSet infoStream = findInfoRowSet("info_stpublic boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
  if (first) {
    first = false;

   
  }

  Object[] r = getRow();

  if (r == null) {
    setOutputDone();
    return false;
  }

  r = createOutputRow(r, data.outputRowMeta.size());

 
  putRow(data.outputRowMeta, r);

  return true;
}
ream_tag");

    Object[] infoRow = null;

    int infoRowCount = 0;

    while((infoRow = getRowFrom(infoStream)) != null){

      infoRowCount++;
    }
    */
  }

  Object[] r = getRow();

  if (r == null) {
    setOutputDone();
    return false;
  }

 
  r = createOutputRow(r, data.outputRowMeta.size());

 
  putRow(data.outputRowMeta, r);

  return true;
}
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

private String result;
private String contents;
private Connection connection = null;


public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException,SQLException{
  if (first) {    
	result=getParameter("result");
	first = false;
  }

  Object[] r = getRow();

  if (r == null) {
    setOutputDone();
    return false;
  }
  Object[] outputRow = createOutputRow(r, data.outputRowMeta.size());
  String foobar = get(Fields.In, result).getString(r); 
  String pattern ="]*href(\\\"([^\\\"]*)\\\"|\\'([^\\']*)\\'|([^\\\\s>]*))[^>]*>(.*?)";
  Pattern patterns = Pattern.compile(pattern);
  Matcher m = patterns.matcher(foobar);
  while(m.find()){
		get(Fields.Out, "contents").setValue(outputRow, m.group().replaceAll("<[^>]*>",""));
		String url = "jdbc:mysql://localhost:3306/extract";
		String userName = "root";
		String userPwd = "123456";
			try{
				// 加载驱动程序
				Class.forName("com.mysql.jdbc.Driver");
				// 获取连接对象
				connection= (Connection) DriverManager.getConnection(url, userName, userPwd);
				} catch (Exception e) {
					e.printStackTrace();
				}
				//要执行的SQL语句
				String sql="insert into html (contents) values (?);";
				PreparedStatement stat = (PreparedStatement) connection.prepareStatement(sql);
				contents=m.group().replaceAll("<[^>]*>","");
				stat.setString(1, contents);
				//3.ResultSet类,用来存放获取的结果集!!	
				stat.executeUpdate();

  			putRow(data.outputRowMeta, outputRow);
			}
  return true;

}

单击“Java代码”控件中的“字段”选项卡,用于添加新生成的字段;单击“参数”选项卡,用于传入参数。“字段”选项卡界面和“参数”选项卡界面具体如图所示。

kettle案例4.2.1--抽取Web数据---HTML网页的数据抽取_第7张图片
kettle案例4.2.1--抽取Web数据---HTML网页的数据抽取_第8张图片

5.运行转换html_extract

kettle案例4.2.1--抽取Web数据---HTML网页的数据抽取_第9张图片

你可能感兴趣的:(前端,html,java,etl工程师)